在.NET中捕获SMTP错误

通常情况下,我会发送这样的电子邮件:

int statusCode = 0; string error = null; try { smtp.Send(mailMessage); statusCode = 250; } catch (SmtpFailedRecipientException e) { Log(String.Format("[Exception] {0}\n\tSmtp: {1}{2}:{3}\n\tStatus Code: {4}\n\tFaild Recipient: {5}", e.Message, smtp.Key, smtp.Value.Host, smtp.Value.Port, e.StatusCode, e.FailedRecipient)); statusCode = (int)e.StatusCode; error = e.Message; } catch (SmtpException e) { Log(String.Format("[Exception] {0}\n\tSmtp: {1} - {2}:{3}\n\tStatus Code: {4}", e.Message, smtp.Key, smtp.Value.Host, smtp.Value.Port, e.StatusCode)); statusCode = (int)e.StatusCode; error = e.Message; } catch (Exception e) { Log(String.Format("[Exception] {0}.\n\tSource: {1}\n\tStack Trace: {2}", e.Message, e.Source, e.StackTrace)); statusCode = -1; error = "General Failure"; } 

但是这种方法不允许我捕获一些更“高级”的SMTP错误,例如No Domain,No such Email等。

如何捕获这种SMTP错误? 这有可能吗?

例如,当我尝试将Gmail发送到asdfkljhadf@dgdfasdf.com这样的地址时,Gmail会在一段时间后发送给我asdfkljhadf@dgdfasdf.com不存在的电子邮件。

谢谢。

SMTP是一种“存储转发”协议,这意味着服务器可以接受要转发的消息,但在无法传递消息时却不知道。 因此,例如,当您告诉ISP的SMTP服务器向“invalidaddress@example.com”发送消息时,服务器的响应是“好的,我会转发它”。 稍后,ISP的SMTP服务器将联系SMTP服务器以获取“example.com”,并尝试传递该消息。 只有这样才知道邮件无法送达。

因此,就您的客户端和SMTP服务器之间的通信而言,消息已成功传递 – 服务器同意转发它。 因此,也不例外。

我不认为发送电子邮件时smtp服务器知道这些错误。 Smtp服务器在尝试查找域/坏电子邮件等后获得其他服务器的响应时,会发现这些错误。

如果您使用的是IIS,则可能会在IIS中的错误电子邮件文件夹中找到此类电子邮件。