MS Word の MHT ファイル内の画像が電子メールに表示されない
-
26-10-2019 - |
質問
自分にメールでサンプル mhtml ファイルを送信するとき (例:から ここ) 画像は Outlook で正常に表示されます。ただし、Word 文書を mht (Web アーカイブ) 形式に変換すると、画像が表示されません。ブラウザでファイルを開くと、画像は正常に表示されます。または、mht ファイルを添付して添付ファイルをダブルクリックすると、画像が正常に表示されます。しかし、ファイルが電子メールにインライン化されている場合、「写真をダウンロードするにはここを右クリックしてください」という赤い X ボックスが表示され、写真のダウンロードを選択すると、「ファイルは表示できません...移動された可能性があります...」と表示されます。 '。
MHTML に変換された Word ドキュメント内の画像が電子メールにインラインで表示されない理由について何か考えはありますか?
解決
MHTMLドキュメントは、マルチパートMIMEドキュメントです。ドキュメントの最初の部分はHTMLで、他の部分の画像へのリンクがあります。問題は、ブラウザで動作している場合でも、リンクがインラインメールで動作しないことです。見つめている いくつかの例, 、リンクは「cid:」と「cid:」の後の部分が付いている必要があることがわかります。
リンクは、「CID:Image002.gif」と同じくらい簡単です。
Content-ID: <image002.gif>
この方法ですべてのリンクが修正されている場合、画像付きのHTMLはOutlookにインラインに表示されます。
他のヒント
前述したように、コンテンツ 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) 開発でコードをテストするための 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];
}
}
}