Aktualisierte Antwort :
Die Dokumentation für SmtpClient
die in dieser Antwort verwendete Klasse lautet nun: 'Veraltet ("SmtpClient und sein Netzwerk von Typen sind schlecht gestaltet. Wir empfehlen dringend, https://github.com/jstedfast/MailKit und https: // github zu verwenden .com / jstedfast / MimeKit stattdessen ") '.
Quelle: https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official
Ursprüngliche Antwort :
Die Verwendung der MailDefinition-Klasse ist der falsche Ansatz. Ja, es ist praktisch, aber es ist auch primitiv und hängt von den Steuerelementen der Web-Benutzeroberfläche ab. Dies ist für etwas, das normalerweise eine serverseitige Aufgabe ist, nicht sinnvoll.
Der unten dargestellte Ansatz basiert auf der MSDN-Dokumentation und dem Beitrag von Qureshi auf CodeProject.com .
ANMERKUNG: In diesem Beispiel werden HTML-Dateien, Bilder und Anhänge aus eingebetteten Ressourcen extrahiert. Die Verwendung anderer Alternativen zum Abrufen von Streams für diese Elemente ist jedoch in Ordnung, z. B. fest codierte Zeichenfolgen, lokale Dateien usw.
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();
}