O que devo saber sobre o envio de e -mails em um tópico de segundo plano? ASP.NET
-
21-09-2019 - |
Pergunta
Eu tenho um thread em segundo plano que dormirá e puxará dados do banco de dados quando algo o acordar. Estou enviando os e -mails usando o Google Apps usando o SMTPClient (código abaixo).
Eu queria saber se há algo que eu saiba? Planejo enviar apenas um email por vez (um e -mail de senha de registro ou esqueci). Estou um pouco preocupado que algo possa acontecer como um email inválido, bloqueando o tópico, porque não defini um tempo limite ou talvez os aplicativos do Google sejam feitos e fazendo com que o aplicativo explodisse. O que devo estar ciente? Devo perguntar como devo testar também?
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential(fromAddr, pass),
EnableSsl = true
};
MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
mail.IsBodyHtml = true;
client.Send(mail);
Solução
Se você está usando o IIS. Instale o SMTP no seu servidor e envie todos os e -mails para localhost. Dessa forma, se um email não for imediatamente, o servidor SMTP fará fila o email em vez de pendurar seu aplicativo.
Você precisará configurar o servidor SMTP para usar o Gmail como um Smarthost. Se você precisar de mais informações sobre como configurar isso, entre em contato.
Outras dicas
Adicione uma tentativa/captura ao código e você está bem. Na pior das hipóteses, será o tempo limite. Não vai correr para sempre, e o Google não manterá a conexão aberta para sempre (na verdade, o SMTP é bastante implacável quando se trata de tempo limite ... se você for lento, isso matará a conexão).
try
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential(fromAddr, pass),
EnableSsl = true
};
MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
mail.IsBodyHtml = true;
client.Send(mail);
}
catch
{
// do something
}
Quando se trata de testar ... use uma conta Gmail diferente. Além disso, você pode verificar seu limite de e -mails enviados por dia. Não tenho certeza de qual é o número do Gmail, mas eles não permitem que você envie como você deseja enviar.
Estou assumindo que isso está sendo feito no ASP.NET, pois é uma das tags.
Quão importante é esse processo? Este pode ser um bom candidato a um serviço do Windows, em vez de parte do tempo de execução do ASP.NET, se o seu ambiente permitir.
Você mencionou que retira os dados do banco de dados e envia o email. Nada disso se baseia no Asp.net. Além disso, um serviço pode oferecer melhores opções de rosqueamento, teste, log e assíncronas.
Se você quiser ficar com o tempo de execução do ASP.NET, também pode considerar Páginas assíncronas se você ainda não o fez. Isso permitirá gerar vários tópicos de correio e ter seu tópico de página principal, aguarde os resultados. Você também pode definir um valor de tempo limite que permitirá cancelar e registrar threads presos. Definir e lidar com um tempo limite assíncrono cuidaria de muitas das suas preocupações que suspeito. Esta solução levará pelo menos o seu e -mail enviando seu tópico de solicitação de página para fazer.
Os testes devem ser diretos. Você pode registrar contas do Google separadas para testes.
Você pode definir o Timeout
propriedade de SmtpClient
, e depois lidar com todas as exceções jogadas pelo Send
ligar. Em seguida, ele não bloqueará o encadeamento, embora você deva lidar com a causa da exceção à medida que considerar apropriado.