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

时间:2019-07-16 01:15:17

标签: c# async-await amazon-ses mailkit mimekit

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

我们使用的ESP每秒发送40次(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秒以上的延迟会失败吗?

1 个答案:

答案 0 :(得分:2)

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

  

451超时等待来自客户端的数据   请求之间的时间过长,因此SMTP服务器关闭了连接。

这对于为什么代码中没有异常很有意义,但是有趣的是,应用程序继续运行就好像没有问题一样。

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