.net - 使用SmtpClient发送邮件的最佳方式?

标签 .net performance email smtp smtpclient

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

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

SmtpClient是如何工作的,它会在自己的生命周期内打开连接吗? (不是IDisposable,所以看起来不是这样)
还是为每个发送的电子邮件打开一个连接?
还是一直保持连接打开?
还是它有合适的魔术来打开和关闭连接?

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

最佳答案

它仅从连接发送单个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命令。

关于.net - 使用SmtpClient发送邮件的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/968506/

相关文章:

java - Java 应用程序中每个类的成本 - 更少的大类或几个更小的类

r - 将针织临时文件附加到 R Shiny 的电子邮件

.net - 在用户注销或 session 结束时删除文件

.net - 使用 Azure SDK for .NET 获取 Azure 资源 SKU

c# - vstest.console.exe 忽略 app.config

javascript - 在计时器中连续访问 cookie 的性能影响

java - Java 与 C++ 中的基元数组

php - 验证电子邮件已打开

email - 处理硬退回/投诉或只是坚持黑名单?

c# - 需要上传文件,并在 pre-init 事件中使用它