如何将图像集成到邮件正文中
如何将图像集成到邮件正文中
我正在尝试使用嵌入的gif图像发送一个包含多部分/相关的HTML电子邮件。这封电子邮件是用Oracle PL/SQL生成的。我的尝试失败了,在Outlook 2007和Yahoo邮件中,图片显示为红色的X。
我已经发送了一段时间的HTML电子邮件,但现在我的要求是在电子邮件中使用多个gif图像。我可以将这些存储在我们的一个Web服务器上,并链接到它们,但是许多用户的电子邮件客户端不会自动显示它们,需要更改设置或手动下载每封电子邮件的图片。
所以,我的想法是嵌入图片。我的问题是:
- 我在这里做错了什么?
- 嵌入的方法正确吗?
- 如果我需要使用更多的图片,还有其他选项吗?附件不起作用,因为这些图片通常是标志和图标,在消息的上下文之外没有意义。此外,电子邮件的某些元素是指向在线系统的链接,因此生成静态PDF并附加在邮件中不起作用(据我所知)。
代码片段:
MIME-Version: 1.0 To: me@gmail.com BCC: me@yahoo.com From: email@yahoo.com Subject: 测试 Reply-To: email@yahoo.com Content-Type: multipart/related; boundary="a1b2c3d4e3f2g1" --a1b2c3d4e3f2g1 content-type: text/html;我的标题 ... 这里还有更多的HTML ... --a1b2c3d4e3f2g1 Content-Type: image/gif; Content-ID:Content-Transfer-Encoding: base64 Content-Disposition: inline [base64图像数据在此处] --a1b2c3d4e3f2g1--
非常感谢。
顺便说一句:是的,我已经验证了base64数据是正确的,因为我可以将图像嵌入到HTML本身中(使用与创建标题数据相同的算法),并在Firefox/IE中看到图像。
我还应该指出,这不是垃圾邮件,这些电子邮件发送给特定的客户,他们每天都期望收到。内容是数据驱动的,而不是广告。
问题的原因是使用了错误的内容类型multipart/related
,解决方法是使用正确的内容类型multipart/mixed
和multipart/alternative
。以下是解决方法的具体步骤:
1. 将内容类型更改为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
[包含cid链接的HTML代码]
--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格式的图片数据]
--boundary2--
--boundary1--
3. 通过以上步骤,图片将能够正常显示。
至于关于Content-ID
和cid:
的值或语法是否有特殊的技巧,参考了RFC2392后发现CID
表达式是有效的,但图片仍然无法显示。另外,还提供了一个ASCII艺术结构图来解释消息的结构。
对于某些人来说,解决方法可能是将multipart/mixed
更改为multipart/related
,即相反的操作。
在某些情况下,我们可能需要在电子邮件的正文中插入一张图片。然而,直接在正文中插入图片可能会导致图片无法正常显示。因此,我们需要找到一种解决方法。
解决方法是将图片作为附件附加到电子邮件中,并在HTML代码中使用cid引用。具体步骤如下:
1. 首先,准备好要发送的电子邮件的内容和附件。在这个例子中,我们使用C#代码创建了一个电子邮件对象,并设置了主题、收件人、正文和附件。
2. 在HTML代码中,使用标签来插入图片。在src属性中,使用cid:Logo.jpg来引用附件。这里的Logo.jpg是附件的文件名。
3. 将附件设置为内联,并为附件设置一个唯一的ContentId。这个ContentId将在HTML代码中使用。
4. 发送电子邮件并保存副本。
以下是具体的代码示例:
HTML代码:
C#代码:
EmailMessage email = new EmailMessage(service); email.Subject = "Email with Image"; email.Body = new MessageBody(BodyType.HTML, html); email.ToRecipients.Add("abc.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数据字符串,可以轻松地在http://www.motobit.com/util/base64-decoder-encoder.asp从图片文件中创建一个。
电子邮件源代码类似于以下内容,但我无法告诉你boundary是用来做什么的:
To: 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
--------------090303020209010600070908
Content-Type: image/png;
name="moz-screenshot.png"
Content-Transfer-Encoding: base64
Content-ID:
Content-Disposition: inline;
filename="moz-screenshot.png"
[base64 image data here]
--------------090303020209010600070908--
//EDIT: 哦,我刚意识到,如果你在发送电子邮件时插入我帖子中的第一段代码片段,Thunderbird会自动更改HTML代码,使其看起来与我帖子中的第二段代码几乎相同。
我首先尝试了这个方法,但对于电子邮件来说不起作用。在IE/Firefox中查看时效果很好,但发送邮件时不起作用。
也许你们知道一种方法(内容类型是什么?文本/HTML?我需要知道发送这种混合HTML/图片文件的电子邮件头部信息)
当我通过Thunderbird发送和接收电子邮件时,代码对我有效。我刚刚测试过,以确保。
谢谢您发布的电子邮件头部信息!它有效!我相信我在图片部分缺少了“name=”和“filename=”部分。另外,我改用png而不是gif。
你们中的任何人可以告诉我们你们使用哪个Oracle包发送邮件吗?Utl_mail.send没有叫做"boundary"的参数。这对SO的其他访问者来说会很有用。
用@[username]提醒某人,刚看到你的问题。我使用utl_smtp。对我来说,我必须使用html正文、边界等创建一个clob,然后通过utl_smtp发送。在这里查看简单示例:oracle-base.com/articles/misc/EmailFromOraclePLSQL.php请注意,此链接不显示嵌入式图片的方法,但提供了详细信息以帮助您入门。
@[tbone]感谢你提供的两个信息!这正是我需要的。
在许多主流的客户端中,电子邮件中的数据URI不受支持,因此不应使用,请参见:campaignmonitor.com/blog/post/3927/embedded-images-in-html-email
这在hotmail/icloud中似乎不起作用=(我有什么遗漏吗?
我使用了base64编码,并将邮件发送到outlook。但是outlook截断了我的图像的编码数据,尽管其他所有内容与应用程序发送的内容相同。因此,图像无法出现在邮件正文中。请帮忙。
几乎所有主要的电子邮件提供商和网络电子邮件客户端都会阻止此方法的使用。