使用 ASP.NET 在电子邮件中嵌入图像






4.75/5 (14投票s)
嵌入电子邮件消息中图像的完整演示。
引言
本文介绍了一个在电子邮件消息中嵌入图像的完整示例。 互联网上有大量的例子;然而,它们是不完整的。
我花了几个小时研究并将这些片段组合在一起,并决定与我的开发人员同行分享结果。
背景
该代码基于 .NET Framework(v 2.0、3.0 和 3.5)提供的功能,效率不是很高。 如果你打算进行一些大量电子邮件发送,请不要使用此代码。
代码是 VB 语言的,示例是使用 VS 2008 的单页网站。 如果您使用的是以前版本的 VS,则可以复制并粘贴代码。
使用代码
代码非常简单,可以轻松地提取并集成到应用程序中。 事实上,该代码的基础用于客户端的项目,其中收件人的电子邮件地址是从 GridView
中选择的。(不能发布那个,那是雇佣作品!)
不要忘记更新你的web.config 文件! 您可以在代码中添加主机和凭据,但我更喜欢使用配置文件。 只需将以下行添加到你的web.config 文件
<system.net>
<mailSettings>
<smtp from="user@somehost.com">
<network host="smtp.somehost.com" password="somepassword"
userName="user@somehost.com" port="587" />
</smtp>
</mailSettings>
</system.net>
端口应该是 25,但一些 ISP 首选使用 587。 这对应用程序没有影响。
关注点
在许多其他示例中,你会收到一封带有图形附件作为 .dat 文件的电子邮件,这根本不是预期的结果。
缺少的成分是指定附件的类型及其编码
Dim imageResourceEs As New _
System.Net.Mail.LinkedResource(fileImage.PostedFile.FileName, "image/gif")
imageResourceEs.TransferEncoding = Net.Mime.TransferEncoding.Base64
在大多数其他示例中,创建 LinkedResource
时缺少第二个参数,并且它们未能为文件设置编码; 因此它被附加而不是嵌入。
确保更改 MIME 类型(image/GIF、image/JPEG 等)以匹配您要嵌入的文件类型。 消息正文是用 HTML 标签格式化的字符串。 一些渲染器会让你做一些事情,而另一些则会犹豫,你的结果可能会有所不同。
该字符串是传递给 CreateAlternateViewFromString
的参数,正如您在示例中看到的那样,我使用样式来设置字体系列和大小。
htmlView = System.Net.Mail.AlternateView.CreateAlternateViewFromString("<html><body " & _
"style='font-family:Segoe UI, Arial; font-size: 11pt;'><p>" & _
txtBody.Text.Trim & "</p>'<img src='cid:image1'></body></html>", Nothing, "text/html")
基本上,我们所做的是在 HTML 消息中使用代码 img src:'cid imageName'
创建一个“锚点”,然后定义资源并链接它,以便 HTML 渲染器可以找到它。
另一点重要的是确保 HTML 字符串中 img
标签中的名称用引号(单引号或双引号)括起来,并且它与资源的名称完全匹配
img src="cid:image1"
imageResourceEs.ContentId = "image1"
一旦你理解我们使用 img
标签来分配 HTML 消息中的“空间”并链接资源以便可以找到它,你就会看到添加多个图像只是创建多个标签并链接多个资源的问题
!Inside the HTML message create the "holders" for the images
img src="cid:image1"
img src="cid:image2"
! Create the resources
Dim lkImage1 As New
System.Net.Mail.LinkedResource(FileName, "image/gif")
Dim lkImage2 As New
System.Net.Mail.LinkedResource(FileName, "image/gif")
! Link the resources
lkImage1.ContentId = "image1"
lkImage2.ContentId = "image2"
该消息在 Gmail 中正确显示
和 Outlook
我已经使用其他电子邮件引擎(如 Yahoo! 等)测试了该代码,但没有测试 Hotmail。 它应该可以工作,但 Hotmail 在渲染 HTML 消息时非常古怪。
该代码还创建了一个“文本视图”,其中包含消息的“正文”而没有图形元素,因此如果电子邮件客户端无法显示 HTML 版本,则会显示某些内容。
尽情享用!
历史
- 第一个版本:2008 年 12 月 19 日。