我正在使用循环通过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秒以上的延迟会失败吗?
答案 0 :(得分:2)
好的,找到了问题。是AWS SES。电子邮件服务器响应以下错误代码:
451超时等待来自客户端的数据 请求之间的时间过长,因此SMTP服务器关闭了连接。
这对于为什么代码中没有异常很有意义,但是有趣的是,应用程序继续运行就好像没有问题一样。
跟踪此错误的唯一方法是使用@jstedfast建议的协议日志