asp.net net.mail - rota todos os e-mails para um endereço de email diferente no modo de depuração
-
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?
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 );
}
...
}