如何将图像流嵌入MailMessage

我在将一个图像从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 + "

", null, "text/html"); foot.LinkedResources.Add(footerImg); newEmail.AlternateViews.Add(foot); SmtpClient server = new SmtpClient(host, port); server.Send(newEmail);

好的,我已经解决了这个问题。

我没有使用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的偏移量。

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

执行保存后,您必须“寻找”MemoryStream回到开始。

 logo.Position = 0; 

试试看:

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.", 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); } 

我没有将“徽标”添加到资源中,而是将其直接添加到项目中,并将其设置为“嵌入式资源”。

然后使用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);