当我给自己发送电子邮件时,样本mhtml文件(例如来自here)图像在Outlook中显示正常。但是,当我将Word文档转换为mht(Web存档)格式时,图像不会显示。如果我在浏览器中打开文件,图像显示正常,或者如果我附加mht文件并双击附件。但如果文件在电子邮件中内嵌,那么我得到红色X框“右键点击这里下载图片”,如果我选择下载图片,那么'文件无法显示...可能已移动... ”。
为什么Word文档中的图片转换为MHTML的想法不喜欢在电子邮件中显示内联?
答案 0 :(得分:1)
MHTML文档是一个多部分的MIME文档。该文档的第一部分是HTML,并链接到其他部分的图像。问题是链接在内联电子邮件中不起作用,即使它们在浏览器中工作也是如此。查看some examples,您可以看到链接必须以“cid:”作为前缀,而“cid:”后面的部分必须在相应MIME部分的标题中包含Content-ID。
链接可以像“cid:image002.gif”一样简单,相应的MIME部分中的Content-ID为:
Content-ID: <image002.gif>
如果以这种方式修复了所有链接,带有图像的html将在Outlook中以内嵌方式显示。
答案 1 :(得分:0)
如上所述,您使用Content ID将附件链接到电子邮件HTML正文中的图像标记。以下是打开MHT文件,调整链接和通过电子邮件发送结果的完整程序。
我有一个客户端正在使用Word Automation Service将传入的电子邮件转换为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];
}
}
}