【问题标题】:Sending SMTP e-mail at a high rate in .NET在 .NET 中以高速率发送 SMTP 电子邮件
【发布时间】:2011-02-12 09:56:54
【问题描述】:

我有一个 .NET 服务,它在后台线程上处理队列,并从队列中的项目以非常高的速率发送大量小型电子邮件消息(如果这是偶数,则每秒发送 100 条消息)可能的)。目前,我使用SmtpClient.Send(),但我担心它可能会影响性能。

Send() 的每次调用都会经历一个完整的循环,即打开套接字、执行 SMTP 会话(HELO、MAIL FROM、RCPT TO、DATA)和关闭套接字。在伪代码中:

for each message {
  open socket
  send HELO
  send MAIL FROM
  send RCPT TO
  send DATA
  send QUIT
  close socket
}

编辑:这个关于SmtpClient.Send() 的陈述实际上是错误的,正如我在回答中所解释的那样。)

我认为下面的伪代码会更优化:

open socket
send HELO
for each message {
  send MAIL FROM
  send RCPT TO
  send DATA
}
send QUIT
close socket

在高速率发送电子邮件时,我应该关注SmtpClient.Send() 的性能吗?我有哪些优化性能的选择?

【问题讨论】:

  • 这些邮件通常是相同的,但收件人不同,还是电子邮件的内容不同?
  • @Rob Levine:相同的收件人,但内容不同。
  • 每秒数百?到底谁愿意被埋在这么多电子邮件下面?
  • 任何体面的 SMTP 服务器都会让你很快慢下来。

标签: .net email smtp


【解决方案1】:

SmtpClient 类在后台缓存 SMTP 服务器连接。重复调用SmtpClient.Send() 将多条消息提交到同一个SMTP 服务器将有效地执行第二个示例中的伪代码。

提高性能的一种方法可能是使用在多个线程上运行的多个SmtpClient 实例。该服务现在将拥有许多并发连接,而​​不是只有一个与 SMTP 服务器的连接。传入的电子邮件从队列中取出并分派到工作线程池,该线程池调用 SmtpClient.Send() 将消息发送到 SMTP 服务器。

我进行了一些初步测试,发现这可以将性能提高多达 100%。但是,最佳并发连接数和实际性能改进可能在很大程度上取决于 SMTP 服务器。扩展此想法的一种方法是连接到多个 SMTP 服务器。

【讨论】:

    【解决方案2】:

    创建一个使用线程池或其他东西异步发送电子邮件的电子邮件服务器。这样你就可以在服务器上“解雇并忘记”你的电子邮件,让它担心将它们全部发送出去。设置几个线程或更多线程,它应该能够快速浏览电子邮件。

    【讨论】:

    • 这正是我们正在做的,只是我们似乎有一些性能问题。我的问题是关于从 .NET 服务“触发并忘记”电子邮件的最高效方式。
    • 什么性能问题?在我的实现中,我每分钟可以发送数千封电子邮件。是否抛出异常?这些邮件的速度非常慢,因为您经常需要等待套接字超时。
    • 目前我们平均每秒发送 20 封电子邮件,但我们的环境中有很多因素可能会影响这个数字。我正在调查我们是否可以改进邮件发送方面。
    • 如果我是你,我会设置一小段监控代码来检测发送缓慢的电子邮件,并记录有关它们的信息。通过这种方式,您可以快速判断某些参数是否会减慢速度。
    【解决方案3】:

    使用 SMTP 发送电子邮件的过程(最初)在 RFC 821 中指定。从那以后进行了许多更新和添加,但基本协议仍然相同。您需要使用 HELO 命令开始每个事务,然后添加发件人信息、收件人等。如果您向所有收件人发送相同的消息,那么您可以在一封邮件中添加多个收件人。但是,如果每个收件人的消息文本不同,我认为您将需要向每个收件人发送单独的消息,这意味着每个收件人都有单独的交易。

    【讨论】:

    • 我发现SmtpClient.Send()在重复调用时只会打开一次套接字,发出一个EHLO命令,然后在同一个连接上提交多个MAIL FROM、RCPT TO和DATA命令。
    猜你喜欢
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2017-09-11
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多