通过代码在邮件中嵌入图片

在一个开发需求中需要将一张图片嵌入邮件中并发送出去。

正常的邮件发送代码(c#)如下:

MailMessage mail = new MailMessage(from, to, subject, emailBody);

如果需要邮件支持Html,需要将IsBodyHtml设置成true:mail.IsBodyHtml = true;

1.第一个想到的方式是在emailBody中添加<img scr="">标签,但如果收到邮件的用户无法访问scr中的资源链接,将会导致图片无法访问。

2.找到的第二种方式是data:image/png;base64,emailBody中的图片在浏览器中可以展示,但在outlook被屏蔽,无法查看。代码如下:

<img src="data:image/png;base64,RAAAtuhhx4dbgYKAAA7...more data....." alt="test">
string base64Str = Convert.ToBase64String(File.ReadAllBytes(@"C:\Temp\test.png"));

3.第三种方式,是使用“cid:”,基本可以满足需求。代码如下:

LinkedResource inline = new LinkedResource(@“C:\Temp\test.png”, MediaTypeNames.Image.Jpeg);
inline.ContentId = Guid.NewGuid().ToString();
string htmlBody = @"<img src='cid:" + inline.ContentId + @"' />";
AlternateView alternateView = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
alternateView.LinkedResources.Add(inline);

MailMessage mail = new MailMessage(from, to);
mail.Subject = "subject";
mail.IsBodyHtml = true;
mail.AlternateViews.Add(alternateView);

SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(mail);

实现中多出了两个概念LinkedResource和AlternateView。

LinkResouce表示电子邮件附件中嵌入的外部资源,比如图片。但此类资源不是以附件形式展示在邮件中。如需附件需要使用Attachment

AlternateView可以指定一个电子邮件的不同格式副本。

参考:

http://stackoverflow.com/questions/18358534/send-inline-image-in-email

https://sendgrid.com/blog/embedding-images-emails-facts/

posted on 2015-12-31 18:35  dingtingli  阅读(2070)  评论(1编辑  收藏  举报