2016-01-21 12 views
5

Ho un semplice smtpclient:Come gestire correttamente System.Net.Mail.SmtpException?

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

posso avere un host diverso: smtp.gmail.com, smtp.yandex.ru ecc

Quando smtp.Send(message); eseguito devo eccezione differente (dipende dal host) causa lo stesso problema - La verifica a 2 fattori è disattivata.

per Gmail sua 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.

per Yahoo Yandex sua System.Net.Mail.SmtpException depth 0: The operation has timed out. (0x80131500)

io non ora circa altri posta eccezione fornitori, ma come eccezione correttamente tiro ("è necessario abilitare la verifica 2-factor") solo una volta? È possibile? O come minimizzare la duplicazione del codice?

risposta

0

Non sono sicuro di come si sceglie quale host utilizzare (una dichiarazione if o switch?) Ma si potrebbe considerare l'aggiunta di due nuove classi client che ereditano da SmtpClient, ad es. per un 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 
      } 
    } 
} 

Inoltre, si potrebbe introdurre implementare un'interfaccia adatta e utilizzare IOC (o modello di strategia etc.) per iniettare il client corretto in base alla configurazione, per esempio .

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

Questo è forse eccessivo, ma poteva evitare di violare SRP e di dover eseguire la logica condizionale nel metodo che si sta utilizzando per inviare l'e-mail in

+0

'host' si tratta di un parametro nel metodo:' pubblico void Invia (host stringa) ' –

+0

Quindi, anziché inviare il nome host come stringa nel metodo, si invierà l'implementazione SmtpClient. Questo normalmente verrebbe fatto usando Iniezione di dipendenza. Puoi anche farlo aggiornando la classe client SmtpClass appropriata (ad esempio YahooSmtpClass) in un 'switch' o' if' in base alla configurazione o ad altre condizioni. – Graham

+0

Non sono necessari clienti diversi. Ma una classe di processore di errori che può essere selezionata dal dominio host (da un file di configurazione) funzionerebbe – TomTom

Problemi correlati