2016-01-21 12 views
5

Ich habe eine einfache SmtpClient:Wie System.Net.Mail.SmtpException richtig behandelt?

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

ich einen anderen Host haben: smtp.gmail.com, smtp.yandex.ru usw.

Wenn smtp.Send(message); ausgeführt ich verschiedene Ausnahme haben (abhängig vom Host) wegen des gleichen Problems - Die 2-Faktor-Verifizierung ist deaktiviert.

Für gmail seine 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.

für Yahoo und Yandex seine System.Net.Mail.SmtpException depth 0: The operation has timed out. (0x80131500)

ich jetzt nicht über andere Anbieter Ausnahme Mail aber, wie man richtig werfen Ausnahme („Sie 2-Faktor-Überprüfung aktivieren müssen“) nur einmal? Ist es möglich? Oder wie man Codeverdopplung minimiert?

Antwort

0

Ich bin mir nicht sicher, wie Sie den zu verwendenden Host auswählen (eine if oder switch Anweisung?), Aber Sie könnten zwei neue Clientklassen hinzufügen, die von SmtpClient erben, z. für eine 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 
      } 
    } 
} 

Darüber hinaus können Sie eine geeignete Schnittstelle einführen implementieren und verwenden IoC (oder Strategiemuster usw.), um die richtigen Client basierend auf Ihrer Konfiguration zu injizieren, z.B. .

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); 
} 

Dies ist vielleicht übertrieben ist, aber könnte SRP und mit auszuführen bedingte Logik in der Methode, die Sie derzeit verwenden in der E-Mail senden

+0

'host' es ist ein Parameter in der Methode vermeiden verletzen:' Öffentlichkeit void Send (string host) ' –

+0

Anstatt also den Hostnamen als Zeichenfolge in der Methode zu senden, würden Sie die SmtpClient-Implementierung senden. Dies würde normalerweise mit Dependency Injection geschehen. Sie können dies auch tun, indem Sie die entsprechende SmtpClass-Client-Klasse (z. B. YahooSmtpClass) in einem 'switch' oder' if' auf der Grundlage Ihrer Konfiguration oder einer anderen Bedingung neu erstellen. – Graham

+0

Es sind keine unterschiedlichen Clients erforderlich. Aber eine Fehlerprozessorklasse, die von der Hostdomäne (aus einer Konfigurationsdatei) ausgewählt werden kann, würde funktionieren – TomTom

Verwandte Themen