Comment incorporer plusieurs images dans le corps d’un e-mail à l’aide de .NET

J’écris un programme qui envoie des courriers électroniques aux utilisateurs avec plusieurs images (diagrammes) incorporées dans le corps du message électronique (HTML).

Quand j’ai essayé l’échantillon situé ici .. qui a bien fonctionné quand je n’ai à intégrer qu’une seule image http://www.systemnetmail.com/faq/4.4.aspx .

Mais, lorsque j’ai essayé d’incorporer plusieurs images à l’aide du code ci-dessous, aucune des images n’est en cours d’intégration, mais elles sont envoyées en tant que pièces jointes.

public MailMessage MailMessage(Mesortingc mesortingc, DateTime date) { MailMessage msg = new MailMessage(); msg.From = new MailAddress("[email protected]", "User1"); msg.To.Add(new MailAddress("[email protected]")); msg.Subject = "Trend for mesortingc: " + mesortingc.Name; msg.IsBodyHtml = true; // Generate the charts for the given mesortingc var charts = this.GenerateCharts(mesortingc, date); int i = 0; ssortingng htmlBody = ""; List resources = new List(); foreach (var chart in charts) { ssortingng imageTag = ssortingng.Format("
", i); htmlBody += imageTag; LinkedResource graph = new LinkedResource(chart.Value, "image/jpeg"); graph.ContentId = "chart" + i; resources.Add(graph); i++; } htmlBody += ""; // Alternate view for embedded images AlternateView avText = AlternateView.CreateAlternateViewFromSsortingng(mesortingc.Name, null, MediaTypeNames.Text.Html); AlternateView avImages = AlternateView.CreateAlternateViewFromSsortingng(htmlBody, null, MediaTypeNames.Text.Html); // Add all the images as linked resources resources.ForEach(x => avImages.LinkedResources.Add(x)); // Add the views for image msg.AlternateViews.Add(avText); msg.AlternateViews.Add(avImages); return msg; }

Des indices comme ce que je manque? J’ai vérifié le fichier .htm qui est également envoyé en pièce jointe à l’e-mail, et le code source HTML se présente comme suit:

 >




Le Q est donc comment envoyer plusieurs images dans le corps HTML, et non en pièce jointe.

L’autre façon d’incorporer des images dans un courrier électronique lors de l’utilisation de System.Net.Mail est la System.Net.Mail :

Attachez une image d’un lecteur local à un e-mail et affectez-lui un contentID de contentID , puis utilisez-le contentID dans l’URL de l’image.

Cela peut être fait par:

 var contentID = "Image"; var inlineLogo = new Attachment(@"C:\Desktop\Image.jpg"); inlineLogo.ContentId = contentID; inlineLogo.ContentDisposition.Inline = true; inlineLogo.ContentDisposition.DispositionType = DispositionTypeNames.Inline; msg.IsBodyHtml = true; msg.Attachments.Add(inlineLogo); msg.Body = "  "; 

Donc, je pense comprendre quel est le problème actuel. Son dans cette ligne

 // Alternate view for embedded images AlternateView avText = AlternateView.CreateAlternateViewFromSsortingng(mesortingc.Name, null, MediaTypeNames.Text.Html); AlternateView avImages = AlternateView.CreateAlternateViewFromSsortingng(htmlBody, null, MediaTypeNames.Text.Html); 

Comme vous pouvez le constater, mes deux vues sont spécifiées en tant que Text.Html. Par conséquent, la première position remplace la suivante et je ne vois que le texte et les images sont envoyées en tant que pièces jointes.

J’ai apporté le changement suivant et cela a fonctionné comme prévu

 AlternateView avText = AlternateView.CreateAlternateViewFromSsortingng(mesortingc.Name, null, **MediaTypeNames.Text.Plain**); AlternateView avImages = AlternateView.CreateAlternateViewFromSsortingng(htmlBody, null, MediaTypeNames.Text.Html); 

Tout d’abord , vous pouvez essayer d’utiliser des URI absolus pour les images incorporées. Voici un exemple tiré de RFC-2557 :

  From: [email protected] To: [email protected] Subject: A simple example Mime-Version: 1.0 Content-Type: multipart/related; boundary="boundary-example"; type="text/html"; start="" --boundary-example Content-Type: text/html;charset="US-ASCII" Content-ID:  ... text of the HTML document, which might contain a URI referencing a resource in another body part, for example through a statement such as: IETF logo --boundary-example Content-Location: http://www.ietf.cnri.reston.va.us/images/ietflogo.gif Content-Type: IMAGE/GIF Content-Transfer-Encoding: BASE64 R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5 NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A etc... --boundary-example-- 

Vous devez simplement affecter la propriété LinkedResource.ContentLink au lieu de ContentId.

Deuxièmement , vous pouvez incorporer des images directement dans votre code HTML avec le schéma d’URL “data” .

  Larry 

BTW, votre balise HTML n’est pas bien formée. Vous pouvez également être intéressé par “Foreach” vs “ForEach”

Si vous avez les images en ligne, c’est-à-dire l’envoi depuis un site hébergé, je vous suggère de simplement référencer ces images simplement en mettant leur URL dans le fichier src.

  IETF logo 

la plupart des newsletters utilisent cette méthode, et j’estime qu’elle est plus légère et peut consumr moins de ressources que l’intégration.

J’espère que cela t’aides

Mon alternatie:

Tout d’abord, une petite extension:

 public static class RegexExtensions { public static ssortingng GetPattern(this IEnumerable valuesToSearch) { return ssortingng.Format("({0})", ssortingng.Join("|", valuesToSearch)); } } 

puis obtenez les noms d’image du dossier:

  private ssortingng[] GetFullNamesOfImages() { ssortingng images = Path.Combine(_directoryName, "Images"); if (!Directory.Exists(images)) return new ssortingng[0]; return Directory.GetFiles(images); } 

puis en remplaçant les noms d’image par cid:

  private ssortingng InsertImages(ssortingng body) { var images = GetFullNamesOfImages().Select(Path.GetFileName).ToArray(); return Regex.Replace(body, "(Images/)?" + images.GetPattern(), "cid:$2", RegexOptions.IgnoreCase | RegexOptions.Comstackd); } 

où corps est le corps HTML et, par exemple, sera remplacé par

puis dernière action: append des images à un mail:

  private MailMessage CreateMail(SmtpClient smtp, ssortingng toAddress, ssortingng body) { var images = GetFullNamesOfImages(); ssortingng decodedBody = WebUtility.HtmlDecode(body); var text = AlternateView.CreateAlternateViewFromSsortingng(decodedBody, null, MediaTypeNames.Text.Plain); var html = AlternateView.CreateAlternateViewFromSsortingng(body, null, MediaTypeNames.Text.Html); foreach (var image in images) { html.LinkedResources.Add(new LinkedResource(image, new ContentType("image/png")) { ContentId = Path.GetFileName(image) }); } var credentials = (NetworkCredential) smtp.Credentials; var message = new MailMessage(new MailAddress(credentials.UserName), new MailAddress(toAddress)) { Subject = "Some subj", Body = decodedBody }; message.AlternateViews.Add(text); message.AlternateViews.Add(html); return message; } 
  AlternateView avHtml = AlternateView.CreateAlternateViewFromSsortingng(body, null, MediaTypeNames.Text.Html); LinkedResource inline = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/Images/e1.jpg"), MediaTypeNames.Image.Jpeg); inline.ContentId = "1"; inline.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; avHtml.LinkedResources.Add(inline); LinkedResource inline1 = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/CImages/2.jpg"), MediaTypeNames.Image.Jpeg); inline1.ContentId = "2"; inline1.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; avHtml.LinkedResources.Add(inline1); LinkedResource inline2 = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/Images/3.jpg"), MediaTypeNames.Image.Jpeg); inline2.ContentId = "3"; inline2.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; avHtml.LinkedResources.Add(inline2); LinkedResource inline3 = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/Content/Images/4.jpg"), MediaTypeNames.Image.Jpeg); inline3.ContentId = "4"; inline3.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; avHtml.LinkedResources.Add(inline3); MailMessage mail = new MailMessage(); mail.AlternateViews.Add(avHtml); 

HTML: