SmtpClient.Send(MailMessage)
期间抛出异常。然而,尽管抛出了异常,它仍然发送电子邮件。这是一个问题,因为我们希望通过阻止用户尝试保存记录并显示友好的消息来处理此错误,建议从数据库中删除任何无效的关联。如果有一种方法可以迭代所有收件人以确保它们都有效,我们就可以保持所有电子邮件不被发送,直到用户满足一组条件。
SmtpClient.Send(MailMessage)
期间抛出异常。然而,尽管抛出了异常,它仍然发送电子邮件。这是一个问题,因为我们希望通过阻止用户尝试保存记录并显示友好的消息来处理此错误,建议从数据库中删除任何无效的关联。这是一个很久的问题,我不知道你是否已经解决了它。
根据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);
}
}
}
Send
内部使用从 RCPT TO
命令返回的 statuscode
来引发相应的异常。
在 smtpTransport.SendMail
的 RecipientCommand.Send
方法中检查 PrepareCommand
的实现(此方法由 SmtpClient.Send
在内部调用)。它使用 RCPT TO
获取 StatusCode
,然后在 CheckResponse
方法中解析,相应地引发 SmtpFailedRecipientsException
异常。但是,VRFY 和 RCPT 都不是非常可靠,因为邮件服务器倾向于延迟(限制 NDR)或将响应吞噬作为反垃圾邮件措施。
SmtpFailedRecipientsException
。请检查您的Exchange环境是否更改了收件人过滤设置。有两个设置需要查看:(1) SMTP Tarpitting
: Tarpitting会延迟“5.1.1 User Unknown”响应。可能是tarpitting导致您代码中的send
超时。(2) Recipient Filtering
: 如果将RecipientValidationEnabled
设置为false
,则服务器将响应“2.1.5 Recipient OK”,但仍会生成NDR。异常未被引发。 - AbhitalksUserPrincipal.FindByIdentity
将是您的好帮手。 - AbhitalksVRFY
或RCPT
。您可以连接到服务器并发出VRFY命令。很少有服务器支持此命令,但它就是为此而设计的。如果服务器以2.0.0 DSN响应,则用户存在。
VRFY user
您可以发出RCPT,并查看邮件是否被拒绝。
MAIL FROM:<>
RCPT TO:
smtpTransport.SendMail
方法中RecipientCommand.Send
方法中PrepareCommand
的实现(该方法由SmtpClient.Send
在内部调用)。它使用RCPT TO
获取StatusCode,然后在CheckResponse
方法中解析,并相应地引发SmtpFailedRecipientsException
异常。然而,VRFY和RCPT都不是非常可靠,因为邮件服务器往往会延迟(节流NDR)或吞掉响应作为反垃圾邮件措施。 - Abhitalks