1

サンプルの mhtml ファイル (例: hereから) をメールで送信すると、Outlook で画像が正常に表示されます。しかし、Word 文書を mht (Web アーカイブ) 形式に変換すると、画像が表示されません。ブラウザでファイルを開くと、画像が正常に表示されます。または、mht ファイルを添付して添付ファイルをダブルクリックすると、問題なく表示されます。しかし、ファイルが電子メールにインライン化されている場合、「ここを右クリックして画像をダウンロードする」という赤い X ボックスが表示され、画像のダウンロードを選択すると、「ファイルを表示できません...移動した可能性があります... '。

MHTML に変換された Word ドキュメントの画像が電子メールでインライン表示されたくない理由はありますか?

4

2 に答える 2

1

MHTMLドキュメントは、マルチパートMIMEドキュメントです。ドキュメントの最初の部分はHTMLであり、他の部分の画像へのリンクがあります。問題は、リンクがブラウザで機能していても、インライン電子メールでは機能しないことです。いくつかの例を見ると、リンクの前に「cid:」を付ける必要があり、「cid:」の後の部分には、対応するMIME部分のヘッダーにContent-IDが含まれている必要があります。

リンクは「cid:image002.gif」のように単純で、対応するMIME部分のContent-IDは次のとおりです。

Content-ID: <image002.gif>

すべてのリンクがこのように修正されると、画像を含むhtmlがOutlookにインラインで表示されます。

于 2012-02-18T00:19:56.350 に答える
0

前述のように、コンテンツ 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 サーバー ( http://antix.co.uk/Projects/SMTP-Server-For-Developers ) はローカル サーバーで実行され、dev でコードをテストするための SMTP トラフィックを受信します。以下は、既存の 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];
        }
    }
}
于 2016-03-22T18:45:03.623 に答える