代码之家  ›  专栏  ›  技术社区  ›  Martin Liversage

在.NET中高速发送SMTP电子邮件

  •  8
  • Martin Liversage  · 技术社区  · 14 年前

    我有一个.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()发送 当以很高的速率发送电子邮件时?我有哪些优化性能的选项?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Martin Liversage    14 年前

    这个 SmtpClient 类正在后台缓存SMTP服务器连接。打电话 SmtpClient.Send() 重复向同一个SMTP服务器提交多封邮件将有效地执行第二个示例中的伪代码。

    提高性能的一种方法可能是使用 smtp客户端 在多个线程上运行。该服务现在将有许多并发连接,而不是只有一个到SMTP服务器的连接。输入的电子邮件将从队列中获取并发送到调用 smtpclient.send()发送 将邮件发送到SMTP服务器。

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

        2
  •  2
  •   Chris    14 年前

    创建一个电子邮件服务器,使用线程池或其他工具异步发送电子邮件。这样你就可以在服务器上“发射并忘记”你的电子邮件,让它担心把它们全部发送出去。设置一些线程或更多,它应该能够快速地通过电子邮件。

        3
  •  0
  •   TLiebe    14 年前

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