来自MS Word的MHT文件中的图像不会显示在电子邮件中

时间:2012-02-17 00:54:01

标签: outlook ms-word mhtml webarchive

当我给自己发送电子邮件时,样本mhtml文件(例如来自here)图像在Outlook中显示正常。但是,当我将Word文档转换为mht(Web存档)格式时,图像不会显示。如果我在浏览器中打开文件,图像显示正常,或者如果我附加mht文件并双击附件。但如果文件在电子邮件中内嵌,那么我得到红色X框“右键点击这里下载图片”,如果我选择下载图片,那么'文件无法显示...可能已移动... ”。

为什么Word文档中的图片转换为MHTML的想法不喜欢在电子邮件中显示内联?

2 个答案:

答案 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];
        }
    }
}