Non tutti i messaggi di posta elettronica inviati utilizzando SmtpClient in ASP.NET MVC ottenere consegnato. Perché? Come risolvere?
-
21-09-2019 - |
Domanda
Ecco il set-up:
- Ho un regolatore di notifiche che viene chiamato da Utilità di pianificazione 1x / giorno
- 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
}
Soluzione
c'è un timeout di default con il client SMTP e il valore predefinito è 100sec
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);
}
}