Cập nhật câu trả lời :
Tài liệu cho SmtpClient
lớp được sử dụng trong câu trả lời này hiện có nội dung là 'Đã lỗi thời ("SmtpClient và các loại mạng của nó được thiết kế kém, chúng tôi thực sự khuyên bạn nên sử dụng https://github.com/jstedfast/MailKit và https: // github .com / jstedfast / MimeKit thay vào đó ") '.
Nguồn: https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official
Câu trả lời gốc :
Sử dụng lớp MailDefinition là cách tiếp cận sai. Vâng, nó tiện dụng, nhưng nó cũng nguyên thủy và phụ thuộc vào các điều khiển giao diện người dùng web - điều đó không có ý nghĩa đối với một thứ thường là tác vụ phía máy chủ.
Cách tiếp cận được trình bày dưới đây dựa trên tài liệu MSDN và bài đăng của Qureshi trên CodeProject.com .
LƯU Ý: Ví dụ này trích xuất tệp HTML, hình ảnh và tệp đính kèm từ các tài nguyên được nhúng, nhưng sử dụng các lựa chọn thay thế khác để lấy luồng cho các phần tử này là tốt, ví dụ: chuỗi mã hóa cứng, tệp cục bộ, v.v.
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();
}