2

我写了一个支持 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();

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

此致!

4

2 回答 2

2

从 PHPMailer 发送的最快方法是通过 SMTP 将所有消息提交到附近(或本地主机上)的邮件服务器。这(令人惊讶地)通常比 call 更快mail(),因为 mail 调用 sendmail 实用程序,它只是打开到 localhost 的 SMTP 连接,至少在 postfix 的情况下是这样

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

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

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

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

有关更完整的示例,请参阅PHPMailer 中包含的示例

做所有这些,您可以轻松地每秒收到数百条消息。

于 2015-01-23T21:54:49.660 回答
0

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

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

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

于 2015-01-23T20:17:33.187 回答