Как встроить поток изображений в MailMessage - PullRequest
13 голосов
/ 07 июня 2011

У меня возникли трудности с встраиванием изображения из Properties.Resources в MailMessage, в настоящее время изображение не отображается в полученном письме.

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

Вот упрощенная версия того, что я делаю.

 Bitmap b = new Bitmap(Properties.Resources.companyLogo);
 MemoryStream logo = new MemoryStream();
 b.Save(logo, ImageFormat.Jpeg);



 MailMessage newEmail = new MailMessage(from, to);
 newEmail.Subject = subject;
 newEmail.IsBodyHtml = true;

 LinkedResource footerImg = new LinkedResource(logo, "image/jpeg");
 footerImg.ContentId = "companyLogo";
 AlternateView foot= AlternateView.CreateAlternateViewFromString(body + "<p> <img src=cid:companyLogo /> </p>", null, "text/html");

 foot.LinkedResources.Add(footerImg);

 newEmail.AlternateViews.Add(foot);             

 SmtpClient server = new SmtpClient(host, port);
 server.Send(newEmail);

Ответы [ 4 ]

25 голосов
/ 08 июня 2011

Хорошо, я решил проблему.

Вместо того, чтобы использовать метод сохранения BitMap, я преобразовал BitMap в Байт [] и дал потоку памяти Байт []

Не работал:

 b.Save(logo, ImageFormat.Jpeg);

Работал:

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

Я думаю, что это как-то связано с методом Bitmap.Save, в библиотеке MSDN упоминалось, что поток должен иметь смещение0.

19 голосов
/ 11 февраля 2012
Bitmap b = new Bitmap(Properties.Resources.companyLogo);
MemoryStream logo = new MemoryStream();
b.Save(logo, ImageFormat.Jpeg);

После того, как вы сохранили, вам нужно «искать» MemoryStream обратно к началу.

logo.Position = 0;
1 голос
/ 07 июня 2011

Попробуйте посмотреть здесь:

http://www.eggheadcafe.com/community/aspnet/2/10219822/send-mail-with-atttached-image.aspx

По ссылке выше:

static void EmbedImages()
{
   var mail = new MailMessage();

   mail.From = new MailAddress("me@mycompany.com");
   mail.To.Add("you@yourcompany.com");
   mail.Subject = "This is an email";

   var plainView = AlternateView.CreateAlternateViewFromString(
      "This is my plain text content, viewable by those clients that don't support html",
      null, "text/plain");

   var htmlView = AlternateView.CreateAlternateViewFromString(
      "Here is an embedded image.<img src=cid:companylogo>", 
      null, "text/html");

   LinkedResource logo = new LinkedResource( "c:\\temp\\logo.gif" );
   logo.ContentId = "companylogo";

   htmlView.LinkedResources.Add(logo);

   mail.AlternateViews.Add(plainView);
   mail.AlternateViews.Add(htmlView);

   var smtp = new SmtpClient("127.0.0.1"); //specify the mail server address
   smtp.Send(mail);
}
0 голосов
/ 15 августа 2017

Вместо добавления «логотипа» к ресурсам, я добавил его непосредственно в проект и настроил его как «встроенный ресурс».

Затем, используя System.Reflection.Assymbly, я могу получить его (я полагаю, прямо) в виде потока:

  var _assembly = Assembly.GetExecutingAssembly();
  var _logoStream = _assembly.GetManifestResourceStream("[Project].[Filename].png");
  var logo = new LinkedResource(_logoStream, "image/png");
  logo.ContentId = "Logo";
  html.LinkedResources.Add(logo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...