Как удалить изображение в виде вложения, но показать в теле письма

Я нашел это решение для показа изображения в теле письма: Добавить изображение в теле письма

И он отлично работает, но также добавляет изображение в качестве вложения в электронную почту.

Attachment inlineLogo = new Attachment(EmailLogo.ImageUrl);
mailMsg.Attachments.Add(inlineLogo);
string contentID = "Image";
inlineLogo.ContentId = contentID;

//To make the image display as inline and not as attachment
inlineLogo.ContentDisposition.Inline = true;
inlineLogo.ContentDisposition.DispositionType = DispositionTypeNames.Inline;

//To embed image in email
mailMsg.Body = "<htm><body> <img height=\"49\" width=\"169\" src=\"cid:" + contentID + "\"> </body></html>";

Существует строка кода с комментарием для отображения как встроенная, а не как вложение, но эта строка не работает, потому что изображение по-прежнему привязано к письму:

//To make the image display as inline and not as attachment
inlineLogo.ContentDisposition.Inline = true;
inlineLogo.ContentDisposition.DispositionType = DispositionTypeNames.Inline;

Как я могу остановить прикрепление изображения к письму?

Ответ 1

Используйте AlternateView, чтобы сохранить html-код с изображением, встроенным в LinkedResource:

string contentID = "Image";

var inlineLogo = new LinkedResource(EmailLogo.ImageUrl, "image/png");    
inlineLogo.ContentId = contentID;

var htmlView = AlternateView.CreateAlternateViewFromString(
    "<html><body> <img height=\"30\" width=\"30\" src=\"cid:" + contentID + "\"> </body></html>",
    Encoding.UTF8, "text/html");
htmlView.TransferEncoding = TransferEncoding.QuotedPrintable;
htmlView.LinkedResources.Add(inlineLogo);

mailMsg.AlternateViews.Add(htmlView);

P.S. Вложение изображения в качестве base24 строки - не очень хорошая идея, потому что многие почтовые клиенты не поддерживают такую ​​возможность.

Ответ 2

Альтернативой, которая может использоваться, которая встраивает изображение в линию, но также не фильтруется обычно почтовыми клиентами (что обычно имеет место сегодня в таких вещах, как нежелательная почта). Вы можете использовать DataURL.

<img src="data:image/<type>;base64,<string>"/>

где <type> - тип изображения, то есть jpg, gif, png и является строкой base64. Просто преобразуйте изображение в строку base64 и назначьте его источнику, используя приведенный выше синтаксис

Например, с помощью jpeg...

mailMsg.Body = "<html><body> <img height=\"49\" width=\"169\" src=\"data:image/jpg;base64,<myPictureString>"\"> </body></html>";

Ответ 3

Если вы хотите отображать изображение в электронном письме, оно должно где-то существовать. Он либо прикрепляется как часть полезной нагрузки сообщения (независимо от того, отображается ли она "в строке" или как истинное "вложение" ) - или извлекается с удаленного веб-сервера, когда читатель читает электронную почту (и, возможно, должен выбрать "просмотр изображений" )

Чтобы не прикреплять изображение к полезной нагрузке электронной почты:

  • Вам необходимо разместить изображение на общедоступном веб-сервере, чтобы читатель открыл сообщение.
  • Вы должны использовать полный URL-адрес в источнике сообщения вашего сообщения, чтобы он мог его найти.

Предполагая, что вы сохранили изображение на своем веб-сервере по следующему URL-адресу: http://www.example.com/images/myimage.jpg

... тогда ваш источник должен просто измениться, чтобы отразить:

mailMsg.Body = "<html><body> <img height=\"49\" width=\"169\" src=\"http://www.example.com/images/myimage.jpg\"> </body></html>";

Не нужно прикреплять его вообще.