.NET SmtpClient:有没有办法确保所有电子邮件在发送MailMessage之前解析?

时间:2012-11-07 16:31:14

标签: .net smtpclient resolve mailmessage email-address

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

如果有办法迭代所有配方以确保它们全部有效,我们可以保留所有电子邮件,直到用户满意一系列条件。

2 个答案:

答案 0 :(得分:6)

这是一个非常古老的问题,我不知道你是否已经解决了这个问题。

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

  

使用发送向多个收件人和SMTP发送电子邮件时   服务器接受某些收件人有效并拒绝其他收件人,发送发送   发送电子邮件给接受的收件人然后a   抛出 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在内部使用从statuscode命令返回的RCPT TO来引发相应的异常。

检查PrepareCommand RecipientCommand.Send方法中smtpTransport.SendMail的实施情况(此方法由SmtpClient.Send在内部调用)。它使用RCPT TO获取StatusCode,然后在CheckResponse方法中对其进行解析,从而引发SmtpFailedRecipientsException。但是,VRFY和RCPT都不是非常可靠,因为邮件服务器往往会延迟(限制NDR)或吞下响应作为反垃圾邮件措施。

答案 1 :(得分:2)

请查看以下内容:How to check if an email address exists without sending an email?

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

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

<强>引用

  

您可以连接到服务器,然后发出VRFY命令。很少   服务器支持此命令,但它仅用于此目的。如果   服务器以2.0.0 DSN响应,用户存在。

     

VRFY用户

     

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

     

MAIL FROM:&lt;&gt;

     

RCPT TO: