Как добавить изображения из папки ресурсов в качестве вложения и встроить в тело почты Outlook на С#

У меня есть пара изображений, хранящихся в папке ресурсов проекта Visual Studio, и мне нужно загрузить их и отобразить в теле почты Outlook. Вот это код:

Bitmap b = new Bitmap(Properties.Resources.MyImage);
ImageConverter ic = new ImageConverter();
Byte[] ba = (Byte[])ic.ConvertTo(b, typeof(Byte[]));
MemoryStream logo = new MemoryStream(ba);

LinkedResource companyImage = new LinkedResource(logo);
companyImage.ContentId = "companyLogo";
mailitem.HTMLBody += "<img src=\"cid:companyLogo\">";

Однако он не может отображаться в теле письма, а отображается как «пустое поле с красным крестиком». Можете ли вы дать мне несколько идей?


person Yang Yubo    schedule 18.06.2015    source источник


Ответы (2)


Создайте вложение и задайте свойство PR_ATTACH_CONTENT_ID (имя DASL "http://schemas.microsoft.com/mapi/proptag/0x3712001F") с помощью Attachment.PropertyAccessor.SetProperty.

Затем ваше тело HTML (свойство MailItem.HTMLBody) должно будет ссылаться на это вложение изображения через cid:

img src="cid:xyz"

где xyz — значение свойства PR_ATTACH_CONTENT_ID.

Просмотрите существующее сообщение с помощью OutlookSpy (нажмите кнопку IMessage).

attachment = mailitem.Attachments.Add("c:\temp\MyPicture.jpg");
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "MyId1");
mailitem.HTMLBody = "<html><body>Test image <img src=""cid:MyId1""></body></html>";
person Dmitry Streblechenko    schedule 18.06.2015
comment
да, спасибо, приятель, это то, что я сделал раньше. Он может загрузить изображение из моего локального каталога, но если я разверну приложение, это пойдет не так. Поэтому я думаю, что эти изображения должны храниться в ресурсах приложения, чтобы я мог получить их напрямую из своего приложения, а не получать их по локальному пути. - person Yang Yubo; 18.06.2015
comment
Объектная модель Outlook позволяет добавлять только вложения по значению из файлов. Вы можете извлечь изображение из ресурса во временную папку, добавить вложение, удалить файл. - person Dmitry Streblechenko; 18.06.2015

Может быть, вы можете попробовать это.

string htmlBody = "<html><body><h1>Picture</h1><br><img src=\"cid:filename\"></body></html>";
 AlternateView avHtml = AlternateView.CreateAlternateViewFromString
    (htmlBody, null, MediaTypeNames.Text.Html);

var fileName = Guid.NewGuid.ToString();
var path = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)),
    fileName);
File.WriteAllBytes(path, Properties.Resources.Pic);

 LinkedResource inline = new LinkedResource(path, MediaTypeNames.Image.Jpeg); //Jpeg or something
 inline.ContentId = Guid.NewGuid().ToString();
 avHtml.LinkedResources.Add(inline);

 MailMessage mail = new MailMessage();
 mail.AlternateViews.Add(avHtml);

 Attachment att = new Attachment(filePath);
 att.ContentDisposition.Inline = true;

 mail.From = from_email;
 mail.To.Add(data.email);
 mail.Subject = "Here is your subject;
 mail.Body = String.Format(
            "Here is the previous HTML Body" +
            @"<img src=""cid:{0}"" />", inline.ContentId);

 mail.IsBodyHtml = true;
 mail.Attachments.Add(att);
  1. Нет необходимости менять изображение на поток памяти
  2. Для удобства использования, пожалуйста, сделайте содержание электронной почты в формате HTML.
  3. Вы можете найти в коде выше

Вы также можете обратиться к этой ссылке

person Heinz Siahaan    schedule 18.06.2015
comment
Спасибо друг. На самом деле я предпочитаю загружать изображение из ресурсов приложения, а не из какого-либо локального каталога. Знаете ли вы, есть ли способ вставить изображение из файла ресурсов в тело письма? - person Yang Yubo; 18.06.2015
comment
Я добавил дополнительный код для установки изображения вашего ресурса в указанном каталоге сервера. Не используйте поток памяти, просто используйте путь (в LinkedResource) - person Heinz Siahaan; 18.06.2015