Подтвердить что ты не робот

Как встроить поток изображений в MailMessage

У меня возникли трудности с вложением изображения из свойств. Ресурсы в 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);
4b9b3361

Ответ 1

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

Вместо использования метода сохранения BitMap я преобразовал BitMap в Byte [] и дал потоку памяти Byte []

Не работает:

 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 lib он упомянул, что поток должен иметь смещение 0.

Ответ 2

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

После сохранения вы должны "искать" MemoryStream до начала.

logo.Position = 0;

Ответ 3

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

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("[email protected]");
   mail.To.Add("[email protected]");
   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);
}

Ответ 4

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

Затем, используя 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);