MVC5 Mailkit 发送电子邮件地址不正确
MVC5 Mailkit send email with incorrect Email address
我正在尝试使用我的 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(电子邮件)returns无效)。有没有办法知道它是否真的最终发送给了收件人?如果 Mailkit 做不到,是否有任何其他 NuGet 包可以做到这一点?
SmtpClient.Send() returns无效的原因是SMTP协议没有指定邮件是否成功传递。它所能做的就是告诉客户端消息是否被服务器接受(在这种情况下 MailKit 将抛出异常)。
如果您需要知道邮件是否已成功送达,您将需要检查发送给您的退回邮件,这可能需要几分钟甚至几小时。
但是,您必须做的第一件事是子class SmtpClient
并覆盖GetEnvelopeId and GetDeliveryStatusNotifications 方法。
然后,当您收到退回邮件时,top-level MIME 部分通常是 multipart/report
(使用 MimeKit 时由 MultipartReport
object 表示)。 multipart/report
然后将包含一个 message/delivery-status
MIME 部分(可能还有其他部分),其中将包含一个 header-like 字段列表,这些字段指定有关 1 个或多个收件人的传递状态的详细信息。
MimeKit 会为您解析很多(例如,它有一个您想要使用的 MessageDeliveryStatus class which contains a StatusGroups 属性。但是,MimeKit 所做的 而不是 做的是解析单个字段值(但它们对您来说应该不难,通常一些 Split(';')
应该足够 iirc 用于一些快速和肮脏的解析)。
您需要在 https://www.rfc-editor.org/rfc/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
文本将与您在 SmtpClient
class.
中的 GetEnvelopeId
实现返回的字符串相同
我正在尝试使用我的 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(电子邮件)returns无效)。有没有办法知道它是否真的最终发送给了收件人?如果 Mailkit 做不到,是否有任何其他 NuGet 包可以做到这一点?
SmtpClient.Send() returns无效的原因是SMTP协议没有指定邮件是否成功传递。它所能做的就是告诉客户端消息是否被服务器接受(在这种情况下 MailKit 将抛出异常)。
如果您需要知道邮件是否已成功送达,您将需要检查发送给您的退回邮件,这可能需要几分钟甚至几小时。
但是,您必须做的第一件事是子class SmtpClient
并覆盖GetEnvelopeId and GetDeliveryStatusNotifications 方法。
然后,当您收到退回邮件时,top-level MIME 部分通常是 multipart/report
(使用 MimeKit 时由 MultipartReport
object 表示)。 multipart/report
然后将包含一个 message/delivery-status
MIME 部分(可能还有其他部分),其中将包含一个 header-like 字段列表,这些字段指定有关 1 个或多个收件人的传递状态的详细信息。
MimeKit 会为您解析很多(例如,它有一个您想要使用的 MessageDeliveryStatus class which contains a StatusGroups 属性。但是,MimeKit 所做的 而不是 做的是解析单个字段值(但它们对您来说应该不难,通常一些 Split(';')
应该足够 iirc 用于一些快速和肮脏的解析)。
您需要在 https://www.rfc-editor.org/rfc/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
文本将与您在 SmtpClient
class.
GetEnvelopeId
实现返回的字符串相同