2009-03-12 6 views

Répondre

1

Nous utilisons une solution similaire à la méthode MailProxy détaillée par tvanfosson. Cependant, nous avons quelques différences qui méritent d'être mentionnées. La première consiste à étendre simplement la classe SmtpClient et à remplacer les méthodes Send dans un environnement de développement ou de test. Nous utilisons un fichier de configuration pour déterminer l'environnement. Nous utilisons ensuite cette classe chaque fois que nous devons envoyer des courriels. Cette classe déterminera qui est actuellement connecté à l'application et redirigera tous les e-mails qui leur sont générés, avec un basculement vers une liste standard de destinataires si l'utilisateur connecté n'est pas disponible pour une raison quelconque. Cela aide si vous avez plusieurs personnes qui sont en train de tester ou de développer car ils ne recevront que les emails qu'ils ont générés. Nous ajoutons également les destinataires originaux du message au corps du message. Cela est utile lorsque vous testez des messages de type workflow pour vous assurer qu'ils vont aux personnes correctes. Enfin, je trouve qu'il est utile d'ajouter une balise [DEV] ou [QA] à l'objet du message afin que je puisse configurer une règle dans mon client de messagerie pour gérer tous les messages de test.

+0

J'ai pensé à cela mais les méthodes sont marquées virtuelles ce qui pourrait vous donner des problèmes si l'objet est casté en tant que SmtpClient. – tvanfosson

+0

je viens d'utiliser les ombres – Shawn

2

Vous pouvez soit mettre cela dans votre code partout où vous utilisez:

if (System.Web.HttpContext.Current.IsDebuggingEnabled) 
{ 
mail.To = "[email protected]"; 
} 
else 
{ 
mail.To = recipientAddress; 
} 

Ou tout simplement construire une enveloppe simple pour l'obtention des adresses e-mail (même quelque chose dans le getter de la méthode pour les adresses des destinataires serait work) ou un wrapper pour l'ensemble de la classe smtpclient ou mailmessage.

1

La meilleure façon de gérer cela, je pense, est via une classe proxy pour le client de messagerie. Lorsque vous créez la classe proxy, utilisez un paramètre pour indiquer si vous souhaitez utiliser le mode de débogage ou non. Demandez au proxy de prendre en charge la même interface que le client de messagerie, mais remplacez silencieusement les adresses électroniques sortantes lorsqu'il fonctionne en mode débogage.

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

    ... 
} 
4

Je créer un serveur SMTP et utiliser votre webapp comme serveur de courrier sortant (spécifié dans une sorte de config). Pour les sites de production, le serveur se comporte normalement, mais pour le débogage, vous pouvez configurer un serveur SMTP pour acheminer tout le courrier à l'adresse de votre choix. Cela a l'avantage de ne pas changer du tout d'application, ce qui peut être utile si la modification du comportement empêche la survenue de bugs que vous essayez de reproduire, etc. Mon entreprise utilise cette approche pour le contrôle qualité et cela fonctionne plutôt bien.

+0

Je considérais cela mais je ne sais pas comment cela fonctionnerait dans des environnements de production partagés – Shawn

+0

Par "production partagée", voulez-vous dire que vous testez sur votre système de production? Si c'est le cas, c'est un non-non majeur. Spammer accidentellement vos clients ne va pas vous gagner de points. Si vous voulez dire que vous partagez le serveur de test avec d'autres développeurs, nous résolvons cela en ayant une boîte aux lettres de test partagée. – rmeador

2

Je dois être honnête, j'utilise le bon vieux

#if DEBUG 
    Mail.To("[email protected]"); 
#else 
    Mail.To("[email protected]"); 
#endif 

Pour me arrêter d'avoir un code de débogage flottant dans mes applications de production. Une approche que j'utilise pour l'accès à la base de données consiste à utiliser une entrée dns, c'est-à-dire database1.domain.com et dans le fichier hosts sur ma machine dev elle pointe vers mon système local et sur ma machine de production vers le serveur de base de données. Vous pouvez utiliser quelque chose de similaire pour avoir un serveur de messagerie de débogage et un serveur de messagerie de production, mais il semble que ce soit excessif par rapport à la première solution ci-dessus.

Questions connexes