Nem todos os e-mails que estão sendo enviados usando o SMTPClient em um MVC ASP.NET é entregue. Por quê? Como resolver?

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

  •  21-09-2019
  •  | 
  •  

Pergunta

Aqui está a configuração:

  1. Eu tenho um controlador de notificações chamado do agendador de tarefas 1x/dia
  2. 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
}
Foi útil?

Solução

Há um tempo limite padrão com o cliente SMTP e o valor padrão é 100s

Mais informações aqui

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top