C#使用SmtpClient内联图像发送图像

SmtpClient()允许你添加附件到你的邮件,但是如果你想在邮件打开的时候显示一个图片,而不是附加它呢?

正如我记得,它可以完成大约4行代码,但我不记得如何,我无法在MSDN网站上find它。

编辑:我没有使用一个网站或任何东西,甚至没有一个IP地址。 图像位于硬盘上。 发送时,他们应该是邮件的一部分。 所以,我想我可能想使用一个标签…但我不太确定,因为我的电脑没有广播。

常常提到的一个解决scheme是将图像作为Attachment添加到邮件中,然后使用cid: reference在HTML邮件体中引用它。

但是,如果使用LinkedResources集合,内联图像仍然会显示正常,但不会显示为邮件的附加附件。 这就是我们想要发生的 ,所以这就是我在这里所做的:

 using (var client = new SmtpClient()) { MailMessage newMail = new MailMessage(); newMail.To.Add(new MailAddress("you@your.address")); newMail.Subject = "Test Subject"; newMail.IsBodyHtml = true; var inlineLogo = new LinkedResource(Server.MapPath("~/Path/To/YourImage.png")); inlineLogo.ContentId = Guid.NewGuid().ToString(); string body = string.Format(@" <p>Lorum Ipsum Blah Blah</p> <img src=""cid:{0}"" /> <p>Lorum Ipsum Blah Blah</p> ", inlineLogo.ContentId); var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html"); view.LinkedResources.Add(inlineLogo); newMail.AlternateViews.Add(view); client.Send(newMail); } 

注:此解决scheme将一个AlternateView添加到text/htmltypes的MailMessage 。 为了完整性,还应该添加一个text/plaintypes的AlternateView ,其中包含非HTML邮件客户端的纯文本版本的电子邮件。

HTML电子邮件和图像是附件,所以它只是通过它们的内容id引用图像的情况,即

  Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text) Dim RGen As Random = New Random() A.ContentId = RGen.Next(100000, 9999999).ToString() EM.Body = "<img src='cid:" + A.ContentId +"'>" 

这里似乎有一个全面的例子: 用内嵌图像发送电子邮件

当你说4行代码时,你是指这个吗?

 System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png"); inline.ContentDisposition.Inline = true; 

那么在Base64string中转换图像呢? AFAIK这可以很容易地embedded到邮件正文中。

看看这里 。

已经发布的解决scheme是我find的最好的,我只是要完成它,例如,如果你有多个图像。

  string startupPath = AppDomain.CurrentDomain.RelativeSearchPath; string path = Path.Combine(startupPath, "HtmlTemplates", "NotifyTemplate.html"); string body = File.ReadAllText(path); //General tags replacement. body = body.Replace("[NOMBRE_COMPLETO]", request.ToName); body = body.Replace("[ASUNTO_MENSAJE]", request.Subject); //Image List Used to replace into the template. string[] imagesList = { "h1.gif", "left.gif", "right.gif", "tw.gif", "fb.gif" }; //Here we create link resources one for each image. //Also the MIME type is obtained from the image name and not hardcoded. List<LinkedResource> imgResourceList = new List<LinkedResource>(); foreach (var img in imagesList) { string imagePath = Path.Combine(startupPath, "Images", img); var image = new LinkedResource(imagePath, "image/" + img.Split('.')[1]); image.ContentId = Guid.NewGuid().ToString(); image.ContentType.Name = img; imgResourceList.Add(image); body = body.Replace("{" + Array.IndexOf(imagesList, img) + "}", image.ContentId); } //Altern view for managing images and html text is created. var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html"); //You need to add one by one each link resource to the created view foreach (var imgResorce in imgResourceList) { view.LinkedResources.Add(imgResorce); } ThreadPool.QueueUserWorkItem(o => { using (SmtpClient smtpClient = new SmtpClient(servidor, Puerto)) { smtpClient.EnableSsl = true; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.Timeout = 50000; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential() { UserName = UMail, Password = password }; using (MailMessage mailMessage = new MailMessage()) { mailMessage.IsBodyHtml = true; mailMessage.From = new MailAddress(UMail); mailMessage.To.Add(request.ToEmail); mailMessage.Subject = "[NAPNYL] " + request.Subject; mailMessage.AlternateViews.Add(view); smtpClient.Send(mailMessage); } } }); 

正如您所看到的,您拥有一组图像名称,因此图像位于相同的文件夹中,这一点很重要,因为它指向相同的输出文件夹。

最后,电子邮件作为asynchronous发送,以便用户不必等待发送。

打开邮件时在客户端上显示图像的过程是客户端function。 只要客户知道如何渲染图像,并且没有阻塞任何图像内容,它就会立即打开。 只要您正确指定了图像MIME附件types,在发送电子邮件以使其在客户端上打开时,您不必做任何特别的事情。