asp.net net.mail - instrada tutte le e-mail a un indirizzo e-mail diverso in modalità debug

StackOverflow https://stackoverflow.com/questions/638768

  •  10-07-2019
  •  | 
  •  

Domanda

È comunque possibile che tutte le e-mail vadano a un indirizzo diverso quando System.Web.HttpContext.Current.IsDebuggingEnabled è vero? O ho bisogno di una nuova classe che utilizzo per inviare e-mail ovunque?

È stato utile?

Soluzione

Usiamo una soluzione simile al metodo MailProxy dettagliato da tvanfosson. Tuttavia, abbiamo alcune differenze che ritengo degno di nota. Il primo è che estendiamo semplicemente la classe SmtpClient e sovrascriviamo i metodi di invio in un ambiente di sviluppo o test. Usiamo un file di configurazione per determinare l'ambiente. Quindi usiamo questa classe ogni volta che dobbiamo inviare e-mail. Questa classe determinerà chi è attualmente connesso all'applicazione e reindirizzerà tutte le e-mail generate a loro, con un failover a un elenco standard di destinatari se l'utente che ha effettuato l'accesso non è disponibile per qualsiasi motivo. Questo aiuta se hai diverse persone che stanno testando o sviluppando in quanto riceveranno solo le email che hanno generato. Anticipiamo anche i destinatari originali del messaggio al corpo del messaggio. Ciò è di nuovo utile quando si testano i messaggi di tipo flusso di lavoro per assicurarsi che vengano indirizzati alle persone corrette. Infine, trovo utile aggiungere un tag [DEV] o [QA] all'oggetto del messaggio in modo da poter impostare una regola nel mio client di posta per gestire tutti i messaggi di prova.

Altri suggerimenti

Configurerei un server SMTP e farei in modo che la tua webapp lo usasse come server di posta in uscita (specificato in una specie di configurazione). Per i siti di produzione, il server si comporterebbe normalmente, ma per il debug è possibile configurare un server SMTP per indirizzare tutta la posta al proprio indirizzo di scelta. Questo ha il vantaggio di non cambiare affatto la tua app, il che può essere utile se la modifica del comportamento impedisce che si verifichino bug che stai provando a riprodurre, ecc. La mia azienda utilizza questo approccio per il QA e funziona abbastanza bene.

Puoi inserirlo nel tuo codice ovunque lo usi:

if (System.Web.HttpContext.Current.IsDebuggingEnabled)
{
 mail.To = "debug@debug.com";
}
else
{
 mail.To = recipientAddress;
}

O semplicemente creare un semplice wrapper per ottenere indirizzi e-mail (funzionerebbe anche qualcosa nel getter del metodo per gli indirizzi dei destinatari) o un wrapper per l'intera classe smtpclient o mailmessage.

Devo essere sincero, uso il buon vecchio

#if DEBUG
    Mail.To("debug@debugaddress.com");
#else
    Mail.To("actualrecipient@destinationaddress.com");
#endif

Per impedirmi di avere il codice di debug fluttuante nelle mie app di produzione. Un approccio che utilizzo per l'accesso al database è l'uso di una voce dns, cioè database1.domain.com e nel file hosts sul mio computer di sviluppo punta al mio sistema locale e sul mio computer di produzione punta al server di database. Puoi usare qualcosa di simile per avere un mail server di debug e un mail server di produzione ma sembra eccessivo rispetto alla prima soluzione sopra.

Il modo migliore per gestirlo, penso, è tramite una classe proxy per il client di posta. Quando si crea la classe proxy, utilizzare un parametro per indicare se operare in modalità debug o meno. Avere il proxy che supporta la stessa interfaccia del client di posta, ma sostituisce silenziosamente gli indirizzi di posta elettronica in uscita quando funziona in modalità debug.

public class MailProxy
{
     private bool IsDebug { get; set; }
     private string DebugAddress { get; set; }
     private SmtpClient Client { get; set; }

     public MailProxy( SmtpClient client,
                       bool debugging,
                       string debugAddress )
     {
         this.IsDebug = debugging;
         this.DebugAddress = debugAddress;
     }

     public void Send( MailMessage message )
     {
         if (this.IsDebug)
         {
             message.To = new MailAddress(this.DebugAddress);
         }
         this.Client.Send( message );
     }

     ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top