SmtpClient:最大并发连接数超过了限制

时间:2014-03-06 09:05:23

标签: c# smtpclient

我有一个以下方法,我为每个MailMessage调用:

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;
            }

感谢。

2 个答案:

答案 0 :(得分:3)

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

来自MSDN

  

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

     

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

     

当SMTP会话结束并且客户端希望终止时   连接时,必须向服务器发送QUIT消息以指示   它没有更多的消息要发送。这允许服务器释放   从客户端和与客户端连接相关的资源   处理客户发送的消息。

     

SmtpClient类没有Finalize方法,因此应用程序必须   调用Dispose以显式释放资源。 Dispose方法   遍历所有已建立的与SMTP服务器的连接   在Host属性中指定并发送QUIT消息后跟   优雅地结束TCP连接。 Dispose方法也会释放   Socket使用的非托管资源,可选择处理   托管资源。完成使用后调用Dispose   SmtpClient。 Dispose方法使SmtpClient无法使用   州。调用Dispose后,必须释放所有引用   SmtpClient所以垃圾收集器可以回收内存那个   SmtpClient占据了。

答案 1 :(得分:0)

我找不到将 SMTPClient 限制为一定数量的连接的方法,我发现这个问题试图跟踪它。我找到了一种从不同线程同时发送多封电子邮件的方法,并将它们堆叠起来并通过使用一个连接的共享 SMTPClient 运行,使用 AutoResetEvent释放下一封要发送的邮件

在相关问题中查看我对Stack Overflow here.的回答。