【问题标题】:Remove recipient from MailMessage when mailbox is unavailable邮箱不可用时从 MailMessage 中删除收件人
【发布时间】:2014-10-22 18:04:44
【问题描述】:

我正在使用System.Net.MailSmtpClient 类。当 SmtpClient 拒绝电子邮件地址时,我想从 MailMessage.To 字段中删除无效收件人。这可能吗?这是我拥有的代码,但如果message.To 包含客户端无法发送到的电子邮件(当所有电子邮件都有效时它工作得很好),它会抛出smtpClient.Send(message)

    public void SendEmail(Machine machine)
    {
        var message = new MailMessage();
        var smtpClient = new SmtpClient(smtpServer);

        message.From = new MailAddress(emailSender);

        foreach (var recipient in machine.Recipients)
        {
            message.To.Add(recipient);
        }

        message.Subject = string.Format(emailSubject, machine.Name, machine.Address);
        message.Body = ""; // body here

        message.Priority = MailPriority.High;

        smtpClient.Send(message);
    }

错误: 交易失败。服务器响应为:5.7.1 : Relay access denied

【问题讨论】:

    标签: c# email smtp


    【解决方案1】:

    当其中一个收件人无效时,Send 方法抛出 SmtpFailedRecipientsException。您应该在 msdn 中查看 SmtpFailedRecipientsException 的示例 http://msdn.microsoft.com/en-us/library/system.net.mail.smtpfailedrecipientsexception(v=vs.110).aspx

    【讨论】:

    • 文档仅建议在五秒后重试。这不是问题的答案。
    • SmtpFailedRecipientsException 具有属性 FailedRecipient 和 InnerExceptions。在示例中是循环重试发送消息,但您不必重试发送消息,您只能获得 ex.InnerExceptions[i].FailedRecipient 或 ex.FailedRecipient。我从未使用过它,但我认为它可能会解决您的问题。
    【解决方案2】:

    对于 5.7.1 响应,您实际上会得到一个普通的 SmtpException 而不是 SmtpFailedRecipientException/SmtpFailedRecipientsException - 请参阅 .NET Framework 源代码 here -,因此您必须检查异常的 Message 属性以识别相应的地址(例如,使用 String.Contains),如果包含的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2014-06-22
      • 2016-07-02
      相关资源
      最近更新 更多