如何正确处理 System.Net.Mail.SmtpException

本文关键字:Mail SmtpException Net System 正确处理 | 更新日期: 2023-09-27 18:31:23

我有一个简单的smtpClient:

var smtp = new SmtpClient { Host = host, ...};
smtp.Send(message);

我可以有不同的主机:smtp.gmail.comsmtp.yandex.ru等。

执行smtp.Send(message);时,由于相同的问题,我有不同的异常(取决于主机) - 2 因素验证已关闭。

对于gmail,其System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.

对于雅虎和Yandex来说,它的 System.Net.Mail.SmtpException depth 0: The operation has timed out. (0x80131500)

我现在不了解其他邮件提供商的异常,但如何正确抛出异常("您需要启用 2 因素验证")一次?可能吗?或者如何最大限度地减少代码重复?

如何正确处理 System.Net.Mail.SmtpException

我不确定您如何选择使用哪个主机(ifswitch语句?),但您可以考虑添加两个从 SmtpClient 继承的新客户端类,例如用于 YahooClient:

class YahooClient : SmtpClient {
     private const string Host = "smtp.yahoo.com";
     Send(MailMessage message) { 
          /// Call base send and handle exception            
          try {
             base.Send(message)
          }
          catch(ex as SmtpException) {
              // Handle accordingly
          }
     }
}

此外,您可以引入合适的接口,并使用 IoC(或策略模式等)根据您的配置注入正确的客户端,例如

class YahooClient : SmtpClient, IMySmtpClient {
}
interface IMySmtpClient {
    void Send(MailMessage message);
}
class ConsumingMailSender(IMySmtpClient client) {
       // Create message and send
       var message = new MailMessage etc....
       client.Send(message);
}

这可能是矫枉过正,但可以避免违反 SRP,并且必须以您当前用于发送电子邮件的方法执行条件逻辑。