使用节流阀使用 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 建议的协议日志
我正在使用循环通过 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 建议的协议日志