.NET SMTPCLIENT:是否有一种方法可以确保在发送MailMessage之前解决所有电子邮件



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

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

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

按照msdn:http://msdn.microsoft.com/en-us/library/swas0fwc(v = vs.100).aspx

使用发送发送发送给多个收件人和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-save-save-save-lang = 1&cs cs-cs-cs-cs-lang = csharp = csharp#code-snippet #code-snippet-2

内部Send使用从RCPT TO命令返回的statuscode来提高适当的异常。

smtpTransport.SendMailRecipientCommand.Send方法中检查PrepareCommand的实现(此方法由SmtpClient.Send内部调用)。它使用RCPT TO获取StatusCode,然后在CheckResponse方法中解析,因此SmtpFailedRecipientsException升高。但是,VRFY和RCPT都不是非常可靠的,因为邮件服务器倾向于延迟(油门NDR)或吞咽响应作为反垃圾邮件措施。

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

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

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

引用:

您可以连接到服务器,并发出VRFY命令。很少 服务器支持此命令,但旨在为此。如果 服务器以2.0.0 dsn的响应,用户存在。

vrfy用户

您可以发行RCPT,看看是否拒绝邮件。

邮件来自:&lt;>

rcpt至:

最新更新