SmtpClient.SendMailAsync 方法在发送大量邮件时挂起

Ina*_*ako 5 c# smtpclient async-await

我正在尝试使用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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

有时该方法挂起 - 它等待SendMailAsync似乎卡住了并​​且没有返回。

我看到一个相关的问题 SmtpClient SendMailAsync 有时永远不会返回。但是没有建议的修复方法对我有用。

当我尝试使用同步方法SmtpClient.Send 时一切正常,应用程序永远不会挂起。

有人知道出了什么问题吗?

Ina*_*ako 2

我同事的一篇文章向我指出,SmtpClient实际上已经过时,微软建议不要使用它。

请参阅以下链接

     ************ Update ***********
Run Code Online (Sandbox Code Playgroud)

我尝试按照链接中的建议使用MailKit 。对于非异步异步发送,相同的场景与MailKit完美配合。

   **********************************
Run Code Online (Sandbox Code Playgroud)