Nem todos os e-mails que estão sendo enviados usando o SMTPClient em um MVC ASP.NET é entregue. Por quê? Como resolver?
-
21-09-2019 - |
Pergunta
Aqui está a configuração:
- Eu tenho um controlador de notificações chamado do agendador de tarefas 1x/dia
- O método de ação puxa mais de 300 endereços, loops através deles e usa a classe SMTPClient para enviar um e-mail individual para cada recepiente.
Pelo que posso dizer, o processo funciona bem sem exceções ... exceto que nem todos os e-mails estão sendo entregues. Alguém tem alguma idéia sobre o que está acontecendo e como resolver?
Aqui está o código:
foreach (var emp in division.Users)
{
var fromAddress = "myfromaddress";
var mailServer = "mymailserver";
var toEmail = emp.EmailAddress;
var message = new MailMessage(fromAddress, toEmail)
{
Subject = subject,
Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
IsBodyHtml = true
};
var client = new SmtpClient(mailServer);
client.Send(message);
}
ATUALIZAR:
Adicionar uma pausa entre o envio de e-mails resolve o problema. Mas por que isso funciona? E existe uma maneira melhor (por exemplo, usando async ()) que resolveria igualmente o problema de uma maneira melhor ???
Código atualizado ...
foreach (var emp in division.Users)
{
var fromAddress = "myfromaddress";
var mailServer = "mymailserver";
var toEmail = emp.EmailAddress;
var message = new MailMessage(fromAddress, toEmail)
{
Subject = subject,
Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
IsBodyHtml = true
};
var client = new SmtpClient(mailServer);
client.Send(message);
Thread.Sleep(3000); // Wait 3s until sending next message
}
Solução
Há um tempo limite padrão com o cliente SMTP e o valor padrão é 100s
Outras dicas
Se você não estiver tendo exceções, eu verificaria pastas de spam e endereços de e -mail. Eu também tentaria enviar um e -mail manualmente do seu Outlook para um dos endereços que não recebiam uma mensagem.
Em uma nota lateral, a menos que você esteja usando diferentes servidores de correio, acho que você pode alterar este código para
var client = new SmtpClient(mailServer);
var mailServer = "mymailserver";
foreach (var emp in division.Users)
{
var fromAddress = "myfromaddress";
var toEmail = emp.EmailAddress;
var message = new MailMessage(fromAddress, toEmail)
{
Subject = subject,
Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
IsBodyHtml = true
};
client.Send(message);
}
Você também pode tentar o método sendasync da classe SMTPClient, como este:
// setup the callback method when the send finishes
client.SendCompleted += SendComplete; //new SendCompletedEventHandler(smtpSender_SendCompleted);
// send the email
client.SendAsync(message, null);
private void SendComplete(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
// do stuff on complete
}
Eu aconselharia fortemente o uso SmtpClient.SendAsync()
como send () está bloqueando.
Eu verificaria os logs do servidor SMTP para o qual você está enviando. NOTA: O envio de seus próprios e -mails tem maior probabilidade de terminar em lixo eletrônico do que usar um provedor confiável.
Editar: amostra adicionada Código SendAsync
smtpClient.SendCompleted += smtpClient_SendCompleted;
static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
Log.ErrorFormat("Async Mail exception {0} :: {1}",
e.Error.GetType().Name, e.Error.Message);
}
}