【问题标题】:Capture SMTP errors in .NET在 .NET 中捕获 SMTP 错误
【发布时间】:2011-06-30 10:50:46
【问题描述】:

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

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 不存在的电子邮件。

谢谢。

【问题讨论】:

    标签: c# .net email smtp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2020-02-01
        • 2018-06-16
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        相关资源
        最近更新 更多