我有一个简单的smtpClient:
var smtp = new SmtpClient { Host = host, ...};
smtp.Send(message);
我可以拥有其他主机:smtp.gmail.com
,smtp.yandex.ru
等。
执行smtp.Send(message);
时,由于同样的问题,我有不同的异常(取决于主机) - 双因素验证已关闭。
对于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)
我现在还不知道其他邮件提供商的例外,但是如何正确抛出异常("您需要启用双因素验证")只需一次?可能吗?或者如何最小化代码重复?
答案 0 :(得分:0)
我不确定您是如何选择使用哪个主机(if
或switch
语句?)但您可以考虑添加两个从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并且必须在您当前用来发送电子邮件的方法中执行条件逻辑。