【问题标题】:Optimal way to send mail with SmtpClient?使用 SmtpClient 发送邮件的最佳方式?
【发布时间】:2010-11-01 09:29:48
【问题描述】:

我正在寻找发送大量电子邮件时的良好性能。

我听说正确的做法是打开一个连接发送约 20 封电子邮件并关闭连接。一遍又一遍地这样做。 这是正确的吗?

SmtpClient 是如何工作的,它会在它自己的生命周期内打开一个连接吗? (不是 IDisposable,所以看起来不像那样) 或者它是否为每封发送的电子邮件打开一个连接? 或者它是否一直打开连接? 或者它有什么魔法可以在适当的时候打开和关闭连接?

我想知道,所以我知道我应该如何启动 SmtpClient。作为单例或仅用于大量消息...

【问题讨论】:

    标签: .net performance email smtp smtpclient


    【解决方案1】:

    它只从一个连接发送一个 MailMessage。事实上,它甚至没有正确关闭连接。它发送邮件,但它没有告诉邮件服务器它想退出。因此,它只是让它保持打开状态,直到底层池化流决定关闭套接字。

    这是 Reflector 的内部代码:

    ...
            this.GetConnection();
            fileMailWriter = this.transport.SendMail((message.Sender != null) ? message.Sender : message.From, recipients, message.BuildDeliveryStatusNotificationString(), out exception);
            }
            catch (Exception exception2)
            {
                if (Logging.On)
                {
                    Logging.Exception(Logging.Web, this, "Send", exception2);
                }
                if ((exception2 is SmtpFailedRecipientException) && !((SmtpFailedRecipientException) exception2).fatal)
                {
                    throw;
                }
                this.Abort();
                if (this.timedOut)
                {
                    throw new SmtpException(SR.GetString("net_timeout"));
                }
                if (((exception2 is SecurityException) || (exception2 is AuthenticationException)) || (exception2 is SmtpException))
                {
                    throw;
                }
                throw new SmtpException(SR.GetString("SmtpSendMailFailure"), exception2);
            }
    

    顺便说一句,这里有更多关于 SmtpClient 不发出 QUIT 命令的信息。 https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711&wa=wsignin1.0

    编辑:查看上面web.archive.org的死链接

    解决方法是将 SmtpClient.ServicePoint.MaxTimeout 设置为 1。这将更快地关闭套接字,但是,这实际上不会发出 QUIT 命令。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2013-04-28
    • 2014-08-09
    相关资源
    最近更新 更多