首页 > 解决方案 > 使用 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() {
        //
    }
}    

标签: c#amazon-sessmtpclient

解决方案


推荐阅读