asp.net net.mail - rota todos os e-mails para um endereço de email diferente no modo de depuração

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Existe uma maneira de ter todos os e-mails ir para um endereço diferente quando System.Web.HttpContext.Current.IsDebuggingEnabled é verdade? Ou eu preciso de uma nova classe que eu uso para enviar e-mail em todos os lugares?

Foi útil?

Solução

Nós usamos uma solução semelhante ao método MailProxy detalhado por tvanfosson. No entanto, temos algumas diferenças que sinto são dignos de menção. A primeira é que nós simplesmente estender a classe SmtpClient e substituir os métodos Enviar Quando um desenvolvimento ou teste ambiente. Nós usamos um arquivo de configuração para determinar o meio ambiente. Em seguida, usamos essa classe a qualquer hora que precisamos para enviar e-mails. Esta classe irá determinar quem está conectado ao aplicativo e redirecionar todos os e-mails gerados para eles, com um failover em uma lista padrão de destinatários se o usuário conectado não está disponível por qualquer motivo. Isso ajuda se você tem várias pessoas que estão testando ou em desenvolvimento como eles só receberá os e-mails que eles gerados. Nós também preceder os destinatários originais da mensagem para o corpo da mensagem. Este novo é útil ao testar mensagens do tipo de fluxo de trabalho para garantir que eles estão indo para as pessoas corretas. Finalmente, acho que é útil para adicionar um [DEV] ou [QA] tag ao assunto da mensagem para que eu possa definir uma regra no meu cliente de e-mail para lidar com todas as mensagens de teste.

Outras dicas

Eu configurar um servidor SMTP e ter o seu uso webapp que como seu servidor de correio de saída (especificado em algum tipo de configuração). Para zonas de produção, o servidor iria se comportar normalmente, mas para depuração, você pode configurar um servidor SMTP para encaminhar todas as mensagens para o seu endereço de escolha. Isto tem a vantagem de não alterar a sua aplicação a todos, o que pode ser útil se mudar o comportamento evita erros de ocorrendo que você está tentando reproduzir, etc. Minha empresa usa essa abordagem para QA e ele funciona muito bem.

Você poderia colocar isso em seu código em todos os lugares que você usá-lo:

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

Ou apenas construir um invólucro simples para a obtenção de endereços de email (mesmo algo no getter do método para os endereços de destinatários iria trabalhar) ou um wrapper para toda a classe SmtpClient ou MailMessage.

Eu tenho que ser eu uso honesto bom e velho

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

Para parar de me ter código de depuração flutuando em meus aplicativos de produção. Um uso I abordagem para acesso de banco de dados é usar uma entrada de DNS, ou seja database1.domain.com e no arquivo de hosts na minha máquina dev ele aponta para o meu sistema local e em minha máquina de produção que aponta para o servidor de banco de dados. Você poderia usar algo semelhante para ter um servidor de correio de depuração e um servidor de correio de produção, mas que parece um exagero em comparação com a primeira solução acima.

A melhor maneira de lidar com isso, eu acho, é através de uma classe proxy para o cliente de email. Quando você cria o uso classe de proxy um parâmetro para indicar se a operar no modo de depuração ou não. Ter o apoio de procuração a mesma interface que o cliente de email, mas silenciosamente substituir os endereços de e-mail enviadas quando está a funcionar no modo de depuração.

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

     ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top