【发布时间】:2015-09-21 10:22:15
【问题描述】:
我们正在使用MailKit 通过创建客户端、建立连接和发送邮件来成功发送电子邮件。非常标准的东西,当我们在应用程序中收到消息时,我们会做一些事情并通过电子邮件发送。
但是,我们希望能够尽快处理成千上万封电子邮件。
我们的目标电子邮件服务器可能不可用,因此我们可以快速备份邮件,从而产生积压。
对于MailKit,处理邮件以便尽快发送邮件的最佳和最快捷方式是什么?例如,目前每封邮件可能会一个接一个地处理,如果每个邮件需要一秒钟来处理,则发送 40000 封邮件可能需要很长时间。
我们一直在使用parallel foreach 来启动多个线程,但这有局限性。任何建议或建议将不胜感激。
添加的代码示例:更正,添加了新的代码示例。这要快得多,但我无法让它每次都创建一个新连接。 Exchange 抛出错误“已指定发件人”。目前平均每秒发送大约 6 封邮件。
var rangePartitioner = Partitioner.Create(0, inpList.Count, 15);
var po = new ParallelOptions { MaxDegreeOfParallelism = 30 };
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
using (var client = new SmtpClient(new SlabProtocolLogger()))
{
client.Connect(_appSettings.RelayAddress, _appSettings.RelayPort);
client.AuthenticationMechanisms.Remove("XOAUTH2");
for (int i = range.Item1; i < range.Item2; i++)
{
var message = _outboundQueueRepository.Read(inpList[i]).Load();
client.Send(message.Body, message.Metadata.Sender, message.Metadata.Recipients.Select(r => (MailboxAddress)r));
_outboundQueueRepository.Remove(inpList[i]);
};
}
});
【问题讨论】:
-
您能否用代码示例更新您的问题:
parallel foreach -
始终将代码编辑到问题中,而不是 cmets。那么你不必为格式化道歉
-
好的,谢谢。希望这会更好。
-
首先我会假设你的任务主要是在等待 io - 完成,所以你可以增加并行度。其次,您不是每项任务都需要一个客户吗?你真的可以使用同一个客户端同时发送多条消息吗?我会假设 client.send 锁定了套接字,所以对 || 感到失望foreach 你一次只发送一条消息...
-
您好,正如 cmets 中提到的,我们已经尝试增加并行度,但这并没有太大的区别。在 10、50 和 -1 处尝试过(我相信是无限的)。我不知道如何在不编写更多代码的情况下解决这个问题。是的,使用相同的客户端是可行的,但我们也尝试通过将其放置在循环中来为每条消息创建客户端。仍然有效,但速度稍慢。显然,发送电子邮件永远不会很快,这就是为什么我们需要同时发送尽可能多的电子邮件。