6

我正在使用 SmtpClient 向多个收件人发送电子邮件。随着员工离开公司,他们的电子邮件地址变得无效。由于他们的电子邮件地址保留在我们的数据库中,直到手动删除,尝试向他们发送电子邮件会导致我们的应用程序在SmtpClient.Send(MailMessage). 但是,尽管抛出异常,它仍然会发送电子邮件。这是一个问题,因为我们想通过阻止用户尝试保存记录并显示友好的消息来建议从数据库中删除任何无效关联来处理此错误。

如果有一种方法可以遍历所有配方以确保它们都是有效的,我们可以阻止所有电子邮件发送,直到用户满足一组条件。

4

2 回答 2

7

这是一个很老的问题,我不知道你是否解决了它。

根据 MSDN: http: //msdn.microsoft.com/en-us/library/swas0fwc (v=vs.100).aspx

当使用Send向多个收件人发送电子邮件并且 SMTP 服务器接受某些收件人为有效收件人并拒绝其他收件人时,Send会向接受的收件人发送电子邮件,然后 引发SmtpFailedRecipientsException。例外将包含被拒绝的收件人列表。

这是从 MSDN 中捕获此异常的示例:

try {
    client.Send(message);
}
catch (SmtpFailedRecipientsException ex) {
    for (int i = 0; i < ex.InnerExceptions.Length; i++) {
        SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
        if (status == SmtpStatusCode.MailboxBusy || status == SmtpStatusCode.MailboxUnavailable) {
            Console.WriteLine("Delivery failed - retrying in 5 seconds.");
            System.Threading.Thread.Sleep(5000);
            client.Send(message);
        } 
        else {
            Console.WriteLine("Failed to deliver message to {0}", ex.InnerExceptions[i].FailedRecipient);
        }
    }
}

此处的完整示例:http: //msdn.microsoft.com/en-us/library/system.net.mail.smtpfailedrecipientsexception.aspx ?cs-save-lang=1&cs-lang=csharp#code-snippet-2

在内部,Send使用statuscodeRCPT TO命令返回的来引发适当的异常。

检查方法中PrepareCommand的实现(此方法由内部调用)。它用于获取然后在方法中解析的,并因此引发。但是,VRFY 和 RCPT 都不是很可靠,因为邮件服务器往往会延迟(限制 NDR)或吞下响应作为反垃圾邮件的措施。RecipientCommand.SendsmtpTransport.SendMailSmtpClient.SendRCPT TOStatusCodeCheckResponseSmtpFailedRecipientsException

于 2013-08-01T20:01:24.957 回答
2

请看以下内容:如何在不发送电子邮件的情况下检查电子邮件地址是否存在?

您要做的是在继续发送之前检查电子邮件是否存在。

因此,如链接答案中所述,请尝试查看您的公司邮件服务器是否支持VRFYRCPT受支持。

报价:

您可以连接到服务器,并发出 VRFY 命令。很少有服务器支持此命令,但它正是为此而设计的。如果服务器以 2.0.0 DSN 响应,则用户存在。

VRFY 用户

您可以发出 RCPT,并查看邮件是否被拒绝。

发件人:<>

RCPT 至:

于 2013-08-05T23:08:13.813 回答