Изображения в файлах MHT из MS Word не отображаются в электронной почте - PullRequest
1 голос
/ 17 февраля 2012

Когда я отправляю себе по электронной почте образцы файлов mhtml (например, из здесь ), изображения хорошо отображаются в Outlook.Однако при преобразовании документа Word в формат mht (веб-архив) изображения не отображаются.Если я открою файл в браузере, изображения будут отображаться нормально, или если я прикреплю файл MHT и дважды щелкните вложение.Но если файл указан в сообщении электронной почты, я получаю красную X-клетку с надписью «Щелкните правой кнопкой мыши здесь, чтобы загрузить изображения», и если я выбираю загрузку изображений, тогда «файл не может быть отображен ... возможно, он был перемещен ...'.

Есть идеи, почему изображения в документах Word, преобразованные в MHTML, не любят отображать встроенные в сообщениях электронной почты?

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Документ MHTML представляет собой документ MIME, состоящий из нескольких частей. Первая часть документа представляет собой HTML и содержит ссылки на изображения в других частях. Проблема в том, что ссылки не работают во встроенном электронном письме, даже если они работают в браузере. Глядя на некоторые примеры , вы видите, что ссылки должны иметь префикс «cid:», а часть после «cid:» должна иметь Content-ID в заголовке соответствующей части MIME. 1003 *

Ссылка может быть простой, например, "cid: image002.gif", а Content-ID в соответствующей части MIME:

Content-ID: <image002.gif>

Если все ссылки исправлены таким образом, HTML-код с изображениями будет отображаться встроенным в Outlook.

0 голосов
/ 22 марта 2016

Как упоминалось выше, вы используете идентификатор контента, чтобы связать вложения с тегами изображений в теле HTML вашей электронной почты.Ниже приведена полная программа для открытия файла MHT, настройки ссылок и отправки результатов по электронной почте.

У меня есть клиент, использующий службу автоматизации Word для преобразования входящих писем в файлы MHT и отправки им по электронной почте.Проблема в том, что Outlook не очень заботился о сыром MHT и не вставлял изображения.Вот мой POC для решения.Я использовал MimeKit и MailKit (http://www.mimekit.net/) в коде, API B # Bouncy Castle (http://www.bouncycastle.org/csharp/) для покрытия зависимости в MailKit и SMTP-сервер Antix для разработчиков (http://antix.co.uk/Projects/SMTP-Server-For-Developers))выполняется на локальном сервере для получения SMTP-трафика для тестирования кода в dev. Ниже приведен код POC, который открывает существующий файл MHT и отправляет его по электронной почте со встроенными изображениями.

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];
        }
    }
}
...