如何解决使用 AWS SES 时的 C# SmtpClient 连接池问题
我有一个向 AWS SES 发送电子邮件的单例 SmtpClient。
问题是我经常收到 SmtpException
:
System.Net.Mail.SmtpException:处理错误。服务器响应为:4.4.2 Timeout waiting for data from client.
基本上,几乎对于每个新的 MailMessage
对象,第一个请求失败,然后下一个请求成功。
我怀疑 SmtpClient 的连接池有问题,客户端试图重用池中的连接,而它在另一端(由 SES)关闭。它赶上异常,开始新的连接,成功发送电子邮件,另一端的连接关闭,循环往复。
这是否意味着我需要更短的 smtpClient 生命周期?喜欢每个请求而不是单例?或者可能介于两者之间 - 用于一组电子邮件的短命 smtpClient(某个时间范围内的所有电子邮件都归入一个组)。
了解什么是 SES 连接超时以及单个 smtpClient 可以重用的程度也很不错。
以下是代码的简化版本,传达了其工作原理:
//resolved as a singleton
public class EmailService: Idisposable {
private readonly BlockingCollection < MailMessage > _messages = new();
private readonly SmtpClient _client;
public EmailService() {
_client = new SmtpClient() {
//fill settings
};
new Thread(ProcessQueue) { IsBackground = true }.Start();
}
public void SendEmail(MailMessage message) {
_messages.Add(message);
}
private void ProcessQueue() {
foreach(var item in _messages.GetConsumingEnumerable()) {
ProcessItem(item);
}
}
private void ProcessItem(MailMessage message) {
using(message) {
try {
_client.Send(message);
} catch (SmtpException) {
// retry
}
}
}
public void dispose() {
//
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。