Non tutti i messaggi di posta elettronica inviati utilizzando SmtpClient in ASP.NET MVC ottenere consegnato. Perché? Come risolvere?

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

  •  21-09-2019
  •  | 
  •  

Domanda

Ecco il set-up:

  1. Ho un regolatore di notifiche che viene chiamato da Utilità di pianificazione 1x / giorno
  2. Il metodo di azione tira verso l'alto di 300 indirizzi, loop attraverso di loro e utilizza la classe SmtpClient di inviare una e-mail individuale ad ogni Destinatario.

Da quello che posso dire al processo funziona bene senza eccezioni ... tranne che non tutte le e-mail vengono consegnati. Chiunque ha tutte le idee su quello che sta succedendo e come risolvere?

Ecco il codice:

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

UPDATE:

L'aggiunta di una pausa tra l'invio di messaggi di posta elettronica risolve il problema. Ma perché fa questo lavoro? E c'è un modo migliore (per esempio usando asincrono ()) che ugualmente risolvere il problema in un modo migliore ???

codice aggiornato ...

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
}
È stato utile?

Soluzione

c'è un timeout di default con il client SMTP e il valore predefinito è 100sec

maggiori informazioni qui

Altri suggerimenti

Se non si hanno alcuna eccezione Mi piacerebbe controllare cartelle Spam e indirizzi e-mail. Mi piacerebbe anche provare a inviare una e-mail manualmente dalla vostra prospettiva a uno degli indirizzi che non ricevere un messaggio di.

Una nota a parte, a meno che non si sta utilizzando diversi server di posta, penso che si può cambiare questo codice per

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

Si potrebbe anche provare il metodo SendAsync della classe SmtpClient, in questo modo:

// 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
}

caldamente consigli su come utilizzare SmtpClient.SendAsync() come Send () sta bloccando.

Vorrei controllare i log del server SMTP che si sta inviando a. Nota:. Inviando i propri messaggi di posta elettronica sono più probabilità di finire nella posta indesiderata rispetto all'utilizzo di un fornitore di fiducia

Modifica ha aggiunto di codice 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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top