MVC5 Mailkit发送电子邮件地址错误的电子邮件

问题描述 投票:0回答:1

我正在尝试使用我的MVC5应用程序发送电子邮件。为此,我通过NuGet包管理器安装了Mailkit v 1.22.0。这就是我的代码的样子:

    var FromAddress = "[email protected]";
    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包可以做到这一点?

email asp.net-mvc-5 mailkit
1个回答
2
投票

SmtpClient.Send()返回void的原因是SMTP协议未指定消息是否成功传递。所有它可以告诉客户端消息是否被服务器接受(在这种情况下,MailKit将抛出异常)。

如果您需要知道邮件是否已成功发送,则需要检查发送给您的退回邮件,这可能需要几分钟甚至几小时。

但是,你要做的第一件事是子类SmtpClient并覆盖GetEnvelopeIdGetDeliveryStatusNotifications方法。

然后,当您收到退回邮件时,顶级MIME部分通常是multipart/report(使用MimeKit时由MultipartReport对象表示)。然后,这个multipart/report将包含一个message/delivery-status MIME部分(可能还有其他部分),它将包含一个类似标题的字段列表,用于指定有关一个或多个收件人的传递状态的详细信息。

MimeKit会为你解析很多这个(例如它有一个MessageDeliveryStatus类,它包含你想要使用的StatusGroups属性。但是,MimeKit没有做的是解析各个字段值(但它们不应该那么困难)对于你来说,通常一些Split(';')应该足够iirc进行一些快速和脏的解析)。

您将需要在https://tools.ietf.org/html/rfc3464上阅读此规范

上面链接的MimeKit文档指定要仔细查看哪些部分(我认为2.2和2.3)。

我建议专门研究Original-RecipientAction领域。

  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实现返回的字符串相同。

© www.soinside.com 2019 - 2024. All rights reserved.