如上所述,您使用内容 ID 将附件链接到电子邮件 HTML 正文中的图像标签。以下是用于打开 MHT 文件、调整链接和通过电子邮件发送结果的完整程序。
我有一个客户正在使用 Word 自动化服务将收到的电子邮件转换为 MHT 文件并通过电子邮件发送它们。问题是 Outlook 不太关心原始 MHT 并且没有内联图像。这是我的 POC 解决方案。我在代码中使用了 MimeKit 和 MailKit ( http://www.mimekit.net/ ),使用 Bouncy Castle C# API ( http://www.bouncycastle.org/csharp/ ) 来覆盖 MailKit 中的依赖关系,以及Antix SMTP Server for Developers ( http://antix.co.uk/Projects/SMTP-Server-For-Developers ) 在本地服务器上运行以接收 SMTP 流量以测试 dev 中的代码。以下是打开现有 MHT 文件并通过电子邮件发送嵌入图像的 POC 代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using MimeKit;
using MailKit;
using MimeKit.Utils;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
MimeMessage messageMimeKit = MimeMessage.Load(@"c:\test.mht");
var images = messageMimeKit.BodyParts.Where(x => x.ContentLocation.LocalPath.EndsWith("png"));
var bodyString = messageMimeKit.HtmlBody;
var builder = new BodyBuilder();
foreach (var item in images)
{
item.ContentId = MimeUtils.GenerateMessageId();
bodyString = bodyString.Replace(GetImageName(item), "cid:" + item.ContentId.ToString());
builder.LinkedResources.Add(item);
}
builder.HtmlBody = bodyString;
messageMimeKit.Body = builder.ToMessageBody();
messageMimeKit.From.Add(new MailboxAddress("from address", "NoReply_SharePoint2013Dev@smithmier.com"));
messageMimeKit.To.Add(new MailboxAddress("to address", "larry@smithmier.com"));
messageMimeKit.Subject = "Another subject line";
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
client.Connect("localhost");
client.Send(messageMimeKit);
client.Disconnect(true);
}
}
private static string GetImageName(MimeEntity item)
{
return item.ContentLocation.Segments[item.ContentLocation.Segments.Count() - 2] +
item.ContentLocation.Segments[item.ContentLocation.Segments.Count() - 1];
}
}
}