c# - 使用 AWS SES 时的 C# SmtpClient 连接池问题
问题描述
我有一个向 AWS SES 发送电子邮件的单例 SmtpClient。
问题是我SmtpException
太频繁了:
System.Net.Mail.SmtpException:处理错误。服务器响应为:4.4.2 等待来自客户端的数据超时。
基本上,几乎对于每个新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() {
//
}
}
解决方案
推荐阅读
- python - Python安装问题
- javascript - Quill js 在编辑器中放置嵌入或 html 内容
- r - 基于R中多元回归中的变量从lm()中提取R2列表
- java - 以多线程方式浏览 Jms Queue
- git - 通过源树提交时如何停止打开流失败错误
- python - tkinter.Toplevel 大小自动适合其小部件
- ms-access - 基于在一个文本字段中具有多个条件的表单进行查询
- java - 使用 dnsjava 使用 java 查询?
- javascript - 当原始请求是 POST 方法时,身份验证刷新令牌不起作用
- node.js - 从 docker 容器内发布 NPM 包