C# SmtpClient:并发连接的最大数量已超过限制

C# SmtpClient:并发连接的最大数量已超过限制,c#,smtpclient,C#,Smtpclient,我为每封邮件调用了以下方法: public static string SendEmail(MailMessage email) { string rez = ""; try { var smtpserver = "10.xxx.xx.xx"; using (SmtpClient mailclient = new SmtpClient())

我为每封邮件调用了以下方法:

public static string SendEmail(MailMessage email)
        {
            string rez = "";

            try
            {
                var smtpserver = "10.xxx.xx.xx"; 

                using (SmtpClient mailclient = new SmtpClient())
                {
                   mailclient.Host = smtpserver;

                   mailclient.Send(email);

                }

                rez = "OK";
            }
            catch (Exception ex)
            {
                rez = "NOT OK: " + ex.Message;
            }

            return rez;
        }
我一次发送32封电子邮件,其中两封邮件的mailclient.send()错误如下: 不正常:服务不可用,正在关闭传输通道。服务器响应为:4.3.2并发连接的最大数量已超过限制,关闭了传输通道

我想知道这是否是因为我为每封邮件创建了一个新的SmtpClient实例

由于SmtpClient只有一个实例,下面的更改能否解决该问题。不幸的是,我无法测试它,我只能在生产中试用

public static SmtpClient mailclient = new SmtpClient("10.xxx.xx.xx");

 public static string SendEmail(MailMessage email)
            {
                string rez = "";

                try
                {

                       mailclient.Send(email);


                    rez = "OK";
                }
                catch (Exception ex)
                {
                    rez = "NOT OK: " + ex.Message;
                }

                return rez;
            }

谢谢。

您可以重用SmtpClient实例来发送电子邮件,这是一种很好的做法(请参阅),但我认为它不会解决您的问题

来自MSDN

SmtpClient的当前实例建立的连接 如果应用程序希望重新使用SMTP服务器的类 向同一SMTP服务器发送多封邮件。这尤其重要 当使用身份验证或加密来建立 连接到SMTP服务器。认证和验证的过程 建立TLS会话可能是昂贵的操作。要求 在发送大型邮件时为每条邮件重新建立连接 发送到同一SMTP服务器的电子邮件数量可能会产生重大影响 对绩效的影响。有许多高容量的电子邮件 发送电子邮件状态更新、新闻稿分发、, 或电子邮件提醒。还有许多电子邮件客户端应用程序支持 离线模式,用户可以撰写许多 稍后在与SMTP服务器建立连接时发送。它是 电子邮件客户端将所有SMTP邮件发送到特定服务器的典型情况 SMTP服务器(由Internet服务提供商提供),然后 将此电子邮件转发到其他SMTP服务器

SmtpClient类实现池SMTP连接,以便 可以避免为每个节点重新建立连接的开销 将消息发送到同一服务器。一个应用程序可以重复使用相同的数据 SmtpClient对象向同一SMTP发送许多不同的电子邮件 服务器和多个不同的SMTP服务器。因此,没有 使用SmtpClient确定应用程序何时完成的方法 对象,它应该被清理

SMTP会话完成且客户端希望终止时 连接时,它必须向服务器发送退出消息以指示 它没有更多的消息要发送。这允许服务器释放数据 从客户端启动与连接关联的资源,然后 处理客户端发送的消息

SmtpClient类没有Finalize方法,因此应用程序必须 调用Dispose以显式释放资源。处理方法 迭代所有已建立的到SMTP服务器的连接 在主机属性中指定,并发送退出消息,后跟 优雅地结束TCP连接。Dispose方法也会释放 套接字使用的非托管资源,并可选择性地处置 管理的资源。使用完后,请调用Dispose SmtpClient。Dispose方法使SmtpClient处于不可用状态 国家。调用Dispose后,必须释放对的所有引用 SmtpClient,以便垃圾收集器可以回收 SmtpClient正在占用


我无法找到将SMTPClient限制为一定数量的连接的方法,因此我遇到了这个问题,试图找到答案。我找到了一种方法,可以同时从不同的线程发送多封电子邮件,并让它们堆叠起来,通过使用一个连接的共享SMTPClient运行,然后使用AutoResetEvent发布下一条要发送的消息


有关我的答案,请参见相关问题。

我无法测试,只能在生产中试用。那你就完了。抱歉。请尝试在每次调用之间引入一点延迟,比如100ms(只是一个示例),看看它是否会改变某些内容。通常情况下,
Send()
-方法会阻止消息发送(或发送失败),因此连续发送32条消息应该没有问题。您是否使用线程来执行
sendmail()
方法?此错误是否来自接收服务器?只需创建一个电子邮件队列并在计时器上从队列发送电子邮件即可。