65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (14投票s)

2008年12月21日

CPOL

3分钟阅读

viewsIcon

115481

downloadIcon

2244

嵌入电子邮件消息中图像的完整演示。

EmbedImage

引言

本文介绍了一个在电子邮件消息中嵌入图像的完整示例。 互联网上有大量的例子;然而,它们是不完整的。

我花了几个小时研究并将这些片段组合在一起,并决定与我的开发人员同行分享结果。

背景

该代码基于 .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 中正确显示

GMail Screenshot

和 Outlook

Outlook Screenshot

我已经使用其他电子邮件引擎(如 Yahoo! 等)测试了该代码,但没有测试 Hotmail。 它应该可以工作,但 Hotmail 在渲染 HTML 消息时非常古怪。

该代码还创建了一个“文本视图”,其中包含消息的“正文”而没有图形元素,因此如果电子邮件客户端无法显示 HTML 版本,则会显示某些内容。

尽情享用!

历史

  • 第一个版本:2008 年 12 月 19 日。
© . All rights reserved.