我正在尝试使用我的MVC5应用程序发送电子邮件。为此,我通过NuGet包管理器安装了Mailkit v 1.22.0。这就是我的代码的样子:
var FromAddress = "no-reply@email.com";
var FromAddressTitle = "My Org";
var connection = ConfigurationManager.ConnectionStrings["SmtpServer"].ConnectionString;
var Email = new MimeMessage();
Email.From.Add(new MailboxAddress(FromAddressTitle, FromAddress));
var AddressArray = value.SentTo.Split(';');
foreach (var item in AddressArray)
{
Email.To.Add(new MailboxAddress(item));
}
Email.Subject = value.Subject;
Email.Body = new TextPart("html")
{
Text = value.Content
};
using (var client = new SmtpClient())
{
client.Connect(connection);
client.Send(Email);
}
return "Email Successfully Sent";
工作正常,除非输入了错误的收件人电子邮件地址,应用程序不会检测电子邮件是否实际发送(client.Send(Email)返回void)。有没有办法知道它是否真的最终被发送给收件人?如果使用Mailkit是不可能的,是否还有其他可以执行此操作的NuGet包?
答案 0 :(得分:2)
SmtpClient.Send()返回void的原因是SMTP协议未指定消息是否成功传递。它可以告诉客户端服务器是否接受了消息(在这种情况下,MailKit会抛出异常)。
如果您需要知道邮件是否已成功投放,则需要检查发送给您的退回邮件,这可能需要几分钟甚至几小时。
但是,您必须做的第一件事是子类SmtpClient
并覆盖GetEnvelopeId和GetDeliveryStatusNotifications方法。
然后,当您收到退回邮件时,顶级MIME部分通常为multipart/report
(使用MimeKit时由MultipartReport
对象表示)。然后,此multipart/report
将包含message/delivery-status
MIME部分(可能还有其他部分),其中包含一个类似标题的字段列表,用于指定有关一个或多个收件人的投放状态的详细信息。
MimeKit会为你解析很多这个(例如它有一个MessageDeliveryStatus类,其中包含你想要使用的StatusGroups属性。但是,MimeKit所做的不是 do是解析各个字段值(但它们不应该让你难以做到,通常一些Split(';')
应该足以进行一些快速和简单的解析)
您需要在https://tools.ietf.org/html/rfc3464
阅读此规范上面链接的MimeKit文档指定要仔细查看的部分(我认为2.2和2.3)。
我建议您专门查看Original-Recipient
和Action
字段。
original-recipient-field =
"Original-Recipient" ":" address-type ";" generic-address
generic-address = *text
action-field = "Action" ":" action-value
action-value =
"failed" / "delayed" / "delivered" / "relayed" / "expanded"
您还需要Original-Envelope-Id
字段来确定报告的消息:
original-envelope-id-field =
"Original-Envelope-Id" ":" envelope-id
envelope-id = *text
envelope-id
文本将与GetEnvelopeId
类SmtpClient
实施中返回的字符串相同。