使用节流阀使用 MailKit 发送批量电子邮件失败,延迟 10 秒或更长时间

Sending bulk emails with MailKit using a throttle fails with a delay of 10 seconds or more

我正在使用循环通过 MailKit 发送批量电子邮件,并增加节流(延迟)。我的想法是,我打算每秒向多个收件人发送最多 20 封单独的电子邮件。为了限制发送,我在循环中添加了一个 Task.Delay (例如 int delay = 1000 / 20 )。

我们使用的是每秒发送 40 次的 ESP (AWS SES),因此它肯定不是 SMTP 服务器。

除了我尝试延迟 10 秒或更长时间对其进行测试时,这似乎运行良好。我强调,我只是测试。

这是我的测试发件人:

    protected void Send( )
    {
        var messages = new List<MimeMessage>( );

        for( int i = 1; i < 4; i++ )
        {
            var message = new MimeMessage
            {
                Sender = new MailboxAddress( "Sender Name", "Sender Email Address" ),
                Subject = "Test email " + i.ToString( ),
                Body = new TextPart( TextFormat.Html ) { Text = "Test body " + i.ToString( ) }
            };
            message.To.Add( new MailboxAddress( "test" + i.ToString( ) + "@example.com" ) );
            messages.Add( message );
        }

        MailNew.SendMultipleAsyncMails( messages );
    }

这是发件人代码:

    public static void SendMultipleAsyncMails( List<MimeMessage> messages )
    {
        Task t = Task.Run( async ( ) =>
        {
            using( var client = new SmtpClient( ) )
            {
                await client.ConnectAsync( "Host", 587, SecureSocketOptions.StartTls );
                await client.AuthenticateAsync( "UserName", "Password" );
                foreach( var message in messages )
                {
                    await client.SendAsync( message );
                    await Task.Delay( 10000 );
                }
                await client.DisconnectAsync( true );
            }
        } );
    }

如果有 10 秒或更长时间的延迟,它会在第一次发送后抛出异常:'MailKit.Net.Smtp.SmtpCommandException' in mscorlib.dll。我不明白为什么这会有所作为。

实际上,您永远不会为此过程添加 10 秒或更长时间的延迟,但出于好奇,我想知道为什么会这样,并确认我没有错过任何重要的事情。

谁能弄清楚为什么延迟 10 秒以上会失败?

好的,找到问题了。它是 AWS SES。电子邮件服务器响应以下错误代码:

451 Timeout waiting for data from client Too much time elapsed between requests, so the SMTP server closed the connection.

现在可以理解为什么代码中没有异常,但有趣的是应用程序继续 运行 就好像没有问题一样。

跟踪此错误的唯一方法是使用@jstedfast 建议的协议日志