在html电子邮件中embedded图像

我试图发送embedded式gif图像的多部分/相关的HTML电子邮件。 这封电子邮件是使用Oracle PL / SQL生成的。 我的尝试失败了,图像显示为红色X(在Outlook 2007和yahoo邮件中)

我一直在发送HTML邮件一段时间,但我的要求是现在在电子邮件中使用几个gif图像。 我可以将它们存储在我们的一个Web服务器上,并链接到它们,但是许多用户的电子邮件客户端不会自动显示,并且需要更改设置或手动下载每个电子邮件。

所以,我的想法是embedded图像。 我的问题是:

  1. 我在这里做错了什么?
  2. embedded方法是否正确?
  3. 任何其他选项,如果我需要使用越来越多的图像? 附件不起作用,因为图片通常是徽标和图标,在消息上下文中是没有意义的。 此外,电子邮件的一些元素链接到一个在线系统,所以生成一个静态的PDF和附加将无法正常工作(无论如何)。

片段:

MIME-Version: 1.0 To: me@gmail.com BCC: me@yahoo.com From: email@yahoo.com Subject: Test Reply-To: email@yahoo.com Content-Type: multipart/related; boundary="a1b2c3d4e3f2g1" --a1b2c3d4e3f2g1 content-type: text/html; <html> <head><title>My title</title></head> <body> <div style="font-size:11pt;font-family:Calibri;"> <p><IMG SRC="cid:my_logo" alt="Logo"></p> ... more html here ... </div></body></html> --a1b2c3d4e3f2g1 Content-Type: image/gif; Content-ID:<my_logo> Content-Transfer-Encoding: base64 Content-Disposition: inline [base64 image data here] --a1b2c3d4e3f2g1-- 

非常感谢。

顺便说一句:是的,我已经证实base64数据是正确的,因为我可以将图像embedded到html本身(使用相同的algorithm来创build标题数据),并在Firefox / IE中查看图像。

我还应该注意到,这不是垃圾邮件,电子邮件被发送到每天期待它的特定客户端。 内容是数据驱动的,而不是广告。

尝试直接插入,这样你可以在电子邮件的不同位置插入多个图像。

 <img src="data:image/jpg;base64,/*base64-data-string here*/" /> 

为了使这个post对其他人有用:如果你没有一个base64数据string,可以从一个图像文件轻松地创build一个: http : //www.motobit.com/util/base64-decoder-encoder.asp 。

电子邮件源代码看起来像这样,但我真的不能告诉你这是什么边界的事情:

  To: email@email.de Subject: ... Content-Type: multipart/related; boundary="------------090303020209010600070908" This is a multi-part message in MIME format. --------------090303020209010600070908 Content-Type: text/html; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-15"> </head> <body bgcolor="#ffffff" text="#000000"> <img src="cid:part1.06090408.01060107" alt=""> </body> </html> --------------090303020209010600070908 Content-Type: image/png; name="moz-screenshot.png" Content-Transfer-Encoding: base64 Content-ID: <part1.06090408.01060107> Content-Disposition: inline; filename="moz-screenshot.png" [base64 image data here] --------------090303020209010600070908-- 

//编辑:哦,我只是意识到,如果你插入我的post的第一个代码片段与thunderbird写一个电子邮件,thunderbird自动更改html代码看起来几乎相同的第二个代码在我的文章。

我没有find任何有用的答案,所以我提供了我的解决scheme。

  1. 问题是你正在使用multipart/related作为这种情况下不好的内容types。 我使用multipart/mixed并在其内部multipart/alternative (它在大多数客户端上工作)。

  2. 消息结构应如下所示:

     [Headers] Content-type:multipart/mixed; boundary="boundary1" --boundary1 Content-type:multipart/alternative; boundary="boundary2" --boundary2 Content-Type: text/html; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit [HTML code with a href="cid:..."] --boundary2 Content-Type: image/png; name="moz-screenshot.png" Content-Transfer-Encoding: base64 Content-ID: <part1.06090408.01060107> Content-Disposition: inline; filename="moz-screenshot.png" [base64 image data here] --boundary2-- --boundary1-- 

然后它会工作

另一种解决方法是将图像作为附件添加,然后使用cid引用它的html代码。

HTML代码:

 <html> <head> </head> <body> <img width=100 height=100 id=""1"" src=""cid:Logo.jpg""> </body> </html> 

C#代码:

 EmailMessage email = new EmailMessage(service); email.Subject = "Email with Image"; email.Body = new MessageBody(BodyType.HTML, html); email.ToRecipients.Add("abc@xyz.com"); string file = @"C:\Users\acv\Pictures\Logo.jpg"; email.Attachments.AddFileAttachment("Logo.jpg", file); email.Attachments[0].IsInline = true; email.Attachments(0).ContentId = "Logo.jpg"; email.SendAndSaveCopy(); 

如果不起作用,您可以尝试将图像转换为HTML表格的工具之一(注意图像的大小):

使用Base64在html中embedded图像是非常棒的。 尽pipe如此,请注意,base64string可以使您的电子邮件大小。

因此,

1)如果你有很多图片,把你的图片上传到服务器,并从服务器上加载这些图片,可以缩小你的邮件大小。 (您可以通过Google获得很多免费服务)

2)如果邮件中只有几张图片,使用base64string绝对是一个很棒的select。

除了现有答案提供的select外,还可以使用命令在linux上生成base64string:

 base64 test.jpg 

如果使用“插入/图片”菜单function插入图像文件,则Outlook和Outlook Express都可以生成这些多部分图像电子邮件格式。

显然,电子邮件types必须设置为HTML(而不是纯文本)。

任何其他方法(例如拖放或任何命令行调用)都会导致图像作为附件发送。

如果你发送这样的电子邮件给自己,你可以看到它是如何格式化的! 🙂

FWIW,我正在寻找一个独立的Windows可执行文件,从命令行模式内联图像,但似乎没有。 这是一个很多上涨的道路…可以说,与Outlook Express,通过传递一个适当格式的.eml文件。

  1. 内嵌图像需要3个边界才能完全兼容。

  2. 一切都进入multipart/mixed

  3. 然后使用multipart/related来包含你的multipart/alternative和你的图像附件头文件。

  4. 最后,在multipart/mixed的最后边界内包含可下载的附件。

实际上有一篇非常好的博客文章,列出了Martyn Davies对这个问题的三种不同的方法。 你可以在https://sendgrid.com/blog/embedding-images-emails-facts/阅读它。;

我想添加使用CSS背景图像的第四种方法。

 <div id="myImage"></div> 

到您的电子邮件正文和一个CSS类,如:

 #myImage { background-image: url('data:image/png;base64,iVBOR...[some more encoding]...rkggg=='); width: [the-actual-image-width]; height: [the-actual-image-height]; } 

如果您使用Outlook通过超链接发送静态图像,一个简单的方法是使用Word。

  1. 打开MS Word
  2. 将图像复制到空白页面上
  3. 添加超链接到图像(Ctrl + K)
  4. 将图像复制到您的电子邮件