在一个开发需求中需要将一张图片嵌入邮件中并发送出去。
正常的邮件发送代码(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 est.png"));
3.第三种方式,是使用“cid:”,基本可以满足需求。代码如下:
LinkedResource inline = new LinkedResource(@“C:Temp est.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/