Réponse mise à jour :
La documentation de SmtpClient
, la classe utilisée dans cette réponse, se lit maintenant, 'Obsolète ("SmtpClient et son réseau de types sont mal conçus, nous vous recommandons fortement d'utiliser https://github.com/jstedfast/MailKit et https: // github .com / jstedfast / MimeKit à la place ") '.
Source: https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official
Réponse originale :
L'utilisation de la classe MailDefinition n'est pas la bonne approche. Oui, c'est pratique, mais c'est aussi primitif et dépend des contrôles de l'interface utilisateur Web - cela n'a aucun sens pour quelque chose qui est généralement une tâche côté serveur.
L'approche présentée ci-dessous est basée sur la documentation MSDN et la publication de Qureshi sur CodeProject.com .
REMARQUE: cet exemple extrait le fichier HTML, les images et les pièces jointes des ressources intégrées, mais l'utilisation d'autres alternatives pour obtenir des flux pour ces éléments convient, par exemple des chaînes codées en dur, des fichiers locaux, etc.
Stream htmlStream = null;
Stream imageStream = null;
Stream fileStream = null;
try
{
// Create the message.
var from = new MailAddress(FROM_EMAIL, FROM_NAME);
var to = new MailAddress(TO_EMAIL, TO_NAME);
var msg = new MailMessage(from, to);
msg.Subject = SUBJECT;
msg.SubjectEncoding = Encoding.UTF8;
// Get the HTML from an embedded resource.
var assembly = Assembly.GetExecutingAssembly();
htmlStream = assembly.GetManifestResourceStream(HTML_RESOURCE_PATH);
// Perform replacements on the HTML file (if you're using it as a template).
var reader = new StreamReader(htmlStream);
var body = reader
.ReadToEnd()
.Replace("%TEMPLATE_TOKEN1%", TOKEN1_VALUE)
.Replace("%TEMPLATE_TOKEN2%", TOKEN2_VALUE); // and so on...
// Create an alternate view and add it to the email.
var altView = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);
msg.AlternateViews.Add(altView);
// Get the image from an embedded resource. The <img> tag in the HTML is:
// <img src="pid:IMAGE.PNG">
imageStream = assembly.GetManifestResourceStream(IMAGE_RESOURCE_PATH);
var linkedImage = new LinkedResource(imageStream, "image/png");
linkedImage.ContentId = "IMAGE.PNG";
altView.LinkedResources.Add(linkedImage);
// Get the attachment from an embedded resource.
fileStream = assembly.GetManifestResourceStream(FILE_RESOURCE_PATH);
var file = new Attachment(fileStream, MediaTypeNames.Application.Pdf);
file.Name = "FILE.PDF";
msg.Attachments.Add(file);
// Send the email
var client = new SmtpClient(...);
client.Credentials = new NetworkCredential(...);
client.Send(msg);
}
finally
{
if (fileStream != null) fileStream.Dispose();
if (imageStream != null) imageStream.Dispose();
if (htmlStream != null) htmlStream.Dispose();
}