Не все электронные письма, отправляемые с использованием SmtpClient в ASP.NET MVC, доставляются. Зачем? Как решить? - PullRequest
2 голосов
/ 16 февраля 2010

Вот установка:

  1. У меня есть контроллер уведомлений, который вызывается из планировщика задач 1x / день
  2. Метод действия извлекает более 300 адресов, проходит по ним и использует класс SmtpClient для отправки отдельного электронного письма каждому получателю.

Из того, что я могу сказать, процесс работает нормально без исключений ... за исключением , что не все электронные письма доставляются. У кого-нибудь есть идеи о том, что происходит и как решить?

Вот код:

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:

Добавление паузы между отправкой электронной почты решает проблему. Но почему это работает? И есть ли лучший способ (например, с помощью Async ()), который в равной степени решит проблему лучше ???

Обновлен код ...

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
}

Ответы [ 3 ]

0 голосов
/ 16 февраля 2010

Я бы настоятельно рекомендовал использовать SmtpClient.SendAsync(), поскольку Send () блокирует.

Я бы проверил логи SMTP-сервера, на который вы отправляете. Примечание. Отправка ваших собственных писем с большей вероятностью заканчивается нежелательной почтой, чем с использованием доверенного поставщика.

Редактировать: добавлен пример кода 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);
    }
}
0 голосов
/ 16 февраля 2010

Если у вас нет никаких исключений, я бы проверил СПАМ-папки и адреса электронной почты. Я также попытался бы отправить электронное письмо вручную из вашего внешнего вида на один из адресов, который не получил сообщение.

Кстати, если вы не используете разные почтовые серверы, я думаю, вы можете изменить этот код на

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

Вы также можете попробовать метод SendAsync класса SmtpClient, например:

// 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
}
0 голосов
/ 16 февраля 2010

есть тайм-аут по умолчанию с клиентом smtp, и значение по умолчанию составляет 100 сек

подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...