Как встроить поток изображений в 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);
Ответы
Ответ 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);