我写了一个支持phpmailer / swiftmail的邮件脚本。实际上,小型广告系列运行正常,所有邮件都会在没有垃圾邮件或服务器资源问题的情况下到达接收方。
我对每个连接发送性能有疑问。哪种方式更适合发送动作? (订阅者特定的不同邮件正文)
第一种情况;
$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类称为记录循环);
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();
我对此感到困惑,如果我选择大量邮件列表,可能会出现任何服务器或脚本问题?
祝你好运!
答案 0 :(得分:2)
从PHPMailer发送的最快方法是通过SMTP将所有邮件提交到附近(或本地主机)邮件服务器。这(令人惊讶地)通常比调用mail()
更快,因为邮件调用sendmail实用程序,它只打开与localhost 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。
完成所有这些操作,您可以轻松地每秒接收数百封邮件。
答案 1 :(得分:0)
发送电子邮件的绝大部分时间是您的网络服务器与其正在与之通话的SMTP服务器之间的SMTP通信。
两种情况都可能相当快。
如果您需要提高性能,请考虑让多个线程同时发送到不同的电子邮件地址。