Метод SmtpClient.SendMailAsync зависает при отправке большого количества писем - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь отправить много писем с использованием метода SmtpClient.SendMailAsync .Вот мой тестовый метод, который я вызываю из простого консольного приложения.

    static void Main(string[] args)
    {

        SendMailsOnebyOneAsync().GetAwaiter().GetResult();

    }


    public static async Task SendMailsOnebyOneAsync()
    {
        for (int i = 0; i < 1000; i++)
        {
            try
            {
                using (SmtpClient sMail = new SmtpClient("XXX"))
                {
                    sMail.DeliveryMethod = SmtpDeliveryMethod.Network;
                    sMail.UseDefaultCredentials = false;
                    sMail.Credentials = null;

                    var fromMailAddress = new MailAddress("XXX");
                    var toMailAddress = new MailAddress("XXX");

                    MailMessage message = new MailMessage(fromMailAddress, toMailAddress)
                    {
                        Subject = "test"
                    };

                    await sMail.SendMailAsync(message);

                    Console.WriteLine("Sent {0}", i);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

Иногда метод зависает - он ожидает SendMailAsync , который кажется зависшим и не возвращает.

Я вижу один связанный вопрос SmtpClient SendMailAsync иногда никогда не возвращает .Но нет никаких исправлений, предлагаемых для меня.

Когда я пытался использовать синхронный метод SmtpClient.Send все в порядке, и приложение никогда не зависает.

Кто-нибудь делаетесть идеи что не так?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Один из моих коллег указал мне на тот факт, что SmtpClient на самом деле устарел, и Microsoft рекомендует не использовать его.

См. Следующую ссылку .

     ************ Update ***********

Я пытался использовать MailKit , как рекомендовано в ссылке.Тот же сценарий прекрасно работает с MailKit для отправки без асинхронной и асинхронной .

   **********************************
0 голосов
/ 11 февраля 2019
  • Для отправки большого количества электронных писем с SmtpClient я помню, что было рекомендовано повторно использовать одно и то же соединение.
  • Я бы изменил способ обработки асинхронных операций для этого.Попробуйте ThreadPool .

. В качестве дополнительного примечания SmtpClient не поддерживает современные протоколы.Это все еще можно использовать для периодической электронной почты для внутреннего использования и тестов.
Вы можете попробовать MailKit

0 голосов
/ 08 февраля 2019

Используйте один клиент для отправки повторных писем.Непрерывно создавая и устраняя, что у многих клиентов могут возникнуть проблемы с портами.

public static async Task SendMailsOnebyOneAsync() {
    using (var sMail = new SmtpClient("XXX")) {
        sMail.DeliveryMethod = SmtpDeliveryMethod.Network;
        sMail.UseDefaultCredentials = false;
        sMail.Credentials = null;

        for (int i = 0; i < 1000; i++) {
            try {
                var fromMailAddress = new MailAddress("XXX");
                var toMailAddress = new MailAddress("XXX");

                var message = new MailMessage(fromMailAddress, toMailAddress) {
                    Subject = "test"
                };

                await sMail.SendMailAsync(message);

                Console.WriteLine("Sent {0}", i);
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            }
        }
    }
}

Во-вторых, хотя, вероятно, так же, как это является примером, нецелесообразно пытаться отправить столько писем за один раз.

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