在html电子邮件中embedded图像
我试图发送embedded式gif图像的多部分/相关的HTML电子邮件。 这封电子邮件是使用Oracle PL / SQL生成的。 我的尝试失败了,图像显示为红色X(在Outlook 2007和yahoo邮件中)
我一直在发送HTML邮件一段时间,但我的要求是现在在电子邮件中使用几个gif图像。 我可以将它们存储在我们的一个Web服务器上,并链接到它们,但是许多用户的电子邮件客户端不会自动显示,并且需要更改设置或手动下载每个电子邮件。
所以,我的想法是embedded图像。 我的问题是:
- 我在这里做错了什么?
- embedded方法是否正确?
- 任何其他选项,如果我需要使用越来越多的图像? 附件不起作用,因为图片通常是徽标和图标,在消息上下文中是没有意义的。 此外,电子邮件的一些元素链接到一个在线系统,所以生成一个静态的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。
-
问题是你正在使用
multipart/related
作为这种情况下不好的内容types。 我使用multipart/mixed
并在其内部multipart/alternative
(它在大多数客户端上工作)。 -
消息结构应如下所示:
[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文件。
-
内嵌图像需要3个边界才能完全兼容。
-
一切都进入
multipart/mixed
。 -
然后使用
multipart/related
来包含你的multipart/alternative
和你的图像附件头文件。 -
最后,在
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。
- 打开MS Word
- 将图像复制到空白页面上
- 添加超链接到图像(Ctrl + K)
- 将图像复制到您的电子邮件