【问题标题】:PHPMailer hangs on sending bulkmailsPHPMailer 挂起发送批量邮件
【发布时间】:2018-08-30 06:53:12
【问题描述】:

我已经成功地在 centos 服务器上使用 PHP、PHPmailer 设置了一个 Web 应用程序,用于向客户发送批量电子邮件。客户电子邮件从 SQL 数据库中获取。它成功运行并发送一封电子邮件并休眠 20 秒,然后将此过程作为循环执行。该数据库有 6000 个电子邮件地址。在此过程中,服务器通过发送大约 100 封电子邮件而挂起。所以我必须再次运行这个程序。 为什么会挂起? 我没有收到 PHP 错误或 PHP 超时。

这是我的代码:`

<?php

require 'PHPMailerAutoload.php';
$con = mysql_connect("localhost", "root", "test");
mysql_select_db("user", $con);
$query = "select email from client_detail";
$result = mysql_query($query, $con);
$email = array();
while ($row = mysql_fetch_assoc($result)) {
    $email[] = $row['email'];
}
foreach ($email as $to) {
    $mail = new PHPMailer;
    $mail->setFrom('bestweb@nic.lk');
    $mail->addAddress($to);
    $mail->Subject = 'Bestweb2018';
    $mail->isHTML(true);
    $mail->Body = '<html>
                        <head>
                            <title>BestWeb.lk 2018</title>
                        </head>
                        <body>
                            <table style="width: 760px;" >
                                <tr>
                                    <td>
                                        <img src="cid:banner" alt="bestweb.lk 2018" width="760px" height="167px" /> 
                                    </td>
                                </tr>
                                </table>
                              </body>
                    </html>
            ';
    $mail->AddEmbeddedImage('images/bannergold.gif', 'banner');

    if (!$mail->send()) {
        echo 'Message was not sent ' . $to;
        echo "<br>";
        echo 'Mailer error: ' . $mail->ErrorInfo;
    } else {
        echo 'Message has been sent ' . $to;
        echo "<br>";
    }

    sleep(20);
}
?>

【问题讨论】:

  • 然后会发生什么?日志中没有错误?
  • sleep(20) 太高,小于 5 就够了。像 2 或 3。
  • 我完全不明白你为什么要睡觉。难道你不想打开一个 STMP 连接,让它保持打开状态,然后尽可能快地发送它们吗?
  • 错误日志中没有错误
  • 邮件服务器发送过多的公司工作邮件。这就是为什么我将睡眠时间设置为 20 秒。我会尝试睡眠时间少于 5 秒

标签: php email centos phpmailer html-email


【解决方案1】:

由于每次迭代需要 20 秒睡眠 sleep(20),服务器可能会过载。

将睡眠时间减少到几秒钟,例如 2 或 3 秒。

sleep(3)

启用显示错误,添加此脚本顶部

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

在日志文件中记录电子邮件完成状态,因为您正在运行一个循环,所有回显数据都进入缓冲区,因此在循环完成之前不会打印任何内容。

if (!$mail->send()) {
    @file_put_contents('email-logs.txt', 'Message was not sent ' . $to ." - error :" . var_export( $mail->ErrorInfo, true) . "\n", FILE_APPEND);
} else {
    @file_put_contents('email-logs.txt', 'Message has been sent ' . $to . "\n", FILE_APPEND);
}

【讨论】:

  • 通过终端直接在服务器上运行后,问题解决。谢谢
  • 很高兴知道您将其整理出来。快乐编码
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2013-03-19
  • 2016-10-13
  • 2012-09-15
  • 1970-01-01
相关资源
最近更新 更多