【问题标题】:Bulk Mailing Performance Sending Method批量邮寄性能发送方法
【发布时间】:2015-03-22 23:14:30
【问题描述】:

我写了一个支持 phpmailer/swiftmail 的邮件脚本。实际上,小型活动运作良好,所有邮件都到达接收者,没有垃圾邮件或服务器资源问题。

我对每个连接的发送性能有疑问。哪种方式更适合发送操作? (订阅者特定的不同邮件正文)

第一个场景;

  • 打开时事通讯数据
  • 在任务列表中捕获 100 个订阅者
  • 替换每个订阅者的通讯数据/标题并保存到新数组
  • 调用 PhpMailer - 常用 SMTP 连接设置
$mail->SMTPKeepAlive = true;
foreach($newArray as $k=>$v){
  $mail->AddAddress($k, $v['name']);
  $mail->Subject  =  $v['subject'];
  $mail->Body = $v['content'];
  $mail->Send();
}
  $mail->smtpClose();

第二种情况(我脚本上的当前方法,我已经将 phpmailer 类调用到记录循环中);

  • 打开时事通讯数据
  • 打开任务列表 100 条记录
while($rs = $sql->fetch_assoc()){
  Replace Newsletter Data/Header
  Call PhpMailer - Common SMTP Connection settings
  $mail->SMTPKeepAlive = true;
  $mail->AddAddress($rs['mail'], $rs['name']);
  $mail->Subject  =  $campRs['subject'];
  $mail->Body = $campRs['content'];
  $mail->Send();
}
  $mail->smtpClose();

我对此感到困惑,如果我使用大量邮件列表,可能会出现任何服务器或脚本问题?

最好的问候!

【问题讨论】:

    标签: php email phpmailer mailing-list


    【解决方案1】:

    发送电子邮件所花费的大部分时间是您的网络服务器和与之通信的 SMTP 服务器之间的 SMTP 通信。

    这两种情况的速度可能相当快。

    如果您需要提高性能,请考虑让多个线程同时发送到不同的电子邮件地址。

    【讨论】:

    • 谢谢,这意味着 phpmailer 可能会调用循环,新类初始化与每个循环步骤无关,此时 smtp 连接很重要,而 SMTPKeepAlive 可以避免我猜对的连续连接?
    【解决方案2】:

    从 PHPMailer 发送的最快方法是通过 SMTP 将所有邮件提交到附近(或本地主机上)的邮件服务器。这(令人惊讶的是)通常比调用mail() 更快,因为mail 调用sendmail 实用程序,它只是打开到本地主机at least in the case of postfix 的SMTP 连接。

    不要直接发送到收件人地址,因为您的生成脚本不是 MTA,因此将缺少排队、延迟、错误处理、后续退回处理等;为此使用适当的邮件服务器(例如 postfix)。

    不要在循环中每次都创建一个新的 PHPMailer 实例——这是对资源的浪费。仅仅因为它没有 SMTP 开销那么大并不意味着它值得丢弃,尽管 Amdahl 定律当然适用。设置循环外所有收件人共有的所有内容(例如主题)。 PHP 中的真正线程并不简单,但是您可以轻松地分叉多个进程(超过 CPU 内核;请参阅 pcntl 扩展),因为无论如何它们大多是网络绑定的。您可能会发现在 beanstalkd 之类的东西中预先排队您的消息很有用,以允许您的工作进程尽可能快地继续发送。

    在您的第一个示例中,您没有清除每条消息之间的收件人数组,因此第一条消息将发送给第一个收件人,第二条将发送给第二个 和第一个 收件人,依此类推在。您需要在循环结束时调用$mail->clearAllAddresses()。

    您应该使用 SMTPKeepAlive,尤其是当您使用附近的中继时,因为它会大大减少 SMTP 开销。

    如需更完整的示例,请参阅the example included with PHPMailer。

    做到这一切,您每秒可以轻松收到数百条消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 2014-09-14
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多