问题描述
我正在尝试发送带有嵌入式 gif 图像的多部分/相关 html 电子邮件。此电子邮件是使用 Oracle PL /SQL 生成的。我的尝试失败了,图像显示为红色 X(在 Outlook 2007 和 yahoo 邮件)
我一直在发送 html 电子邮件一段时间,但我的要求是在电子邮件中使用几个 gif 图像。我可以将它们存储在我们的一个 Web 服务器上,只需链接到它们,但是许多用户发送电子邮件的客户端将不会自动显示,并且需要更改设置或为每封电子邮件手动下载。
所以,我的想法是嵌入图像。我的问题是:
-
我在这里做错了什么?
-
嵌入法是正确的吗?
-
任何其他选项,如果我需要使用越来越多的图像?附件将无法正常工作,因为图像通常不会在消息的上下文中有意义的徽标和图标。此外,电子邮件的一些元素是链接到在线系统,因此生成静态 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--
非常感谢。
BTW:是的,我已经验证了 base64 数据是正确的,因为我可以将图像嵌入到 html 本身 (使用相同的算法用于创建标题数据),并在 Firefox /IE 中查看图像。
我还应该注意到,这不是垃圾邮件,电子邮件将发送给每天期望的特定客户端。内容是 data-driven,而不是广告。
最佳解决方案
尝试直接插入,这样您可以在电子邮件中的各个位置插入多个图像。
<img src="data:image/jpg;base64,/*base64-data-string%20here*/" />
并且让这个帖子对别人有用:如果你没有 base64 数据字符串,可以从图像文件轻松地创建一个: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--
//编辑:哦,我只是意识到,如果你插入第一个代码片段从我的帖子写一个电子邮件与雷鸟,雷鸟自动更改 html 代码看起来几乎与我的帖子中的第二个代码相同。
次佳解决方案
我没有发现任何这里的答案有用,所以我提供我的解决方案:)
1) 问题是你使用的是 content-type:multipart /related,在这种情况下不好。我正在使用 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--
然后它会工作
第三种解决方案
如果不起作用,您可以尝试将图像转换为 HTML 表格的其中一种工具 (请注意图像的大小):
第四种方案
使用 Base64 在 html 中嵌入图像是非常棒的。尽管如此,请注意,base64 字符串可以使您的电子邮件大小很大。
因此,
1) 如果您有许多图像,将图像上传到服务器并从服务器加载这些图像可以使您的电子邮件的大小更小。 (您可以通过 Google 获得大量免费服务)
2) 如果你的邮件中只有几个图像,使用 base64 字符串绝对是一个很棒的选择。
除了现有答案提供的选择之外,还可以使用命令在 linux 上生成 base64 字符串:
base64 test.jpg
第五种方案
另一个解决方案是附加图像作为附件,然后使用 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:UsersacvPicturesLogo.jpg";
email.Attachments.AddFileAttachment("Logo.jpg", file);
email.Attachments[0].IsInline = true;
email.Attachments(0).ContentId = "Logo.jpg";
email.SendAndSaveCopy();
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。