【问题标题】:PHPMailer randomly stops sending mail after around 175 sent emailsPHPMailer 在发送了大约 175 封电子邮件后随机停止发送邮件
【发布时间】:2012-05-14 09:32:17
【问题描述】:

我正在使用 PHPMailer 从数据库中的电子邮件列表中发送时事通讯。该脚本查询数据库,使用 while 循环将数据放入数组中,并在 while 循环中创建并发送电子邮件。

在发送大约 150 封电子邮件后,它可以正常工作,然后它会随机停止。例如,email blast #1 在发送 161 封电子邮件后失败,email blast #2 在发送 165 封电子邮件后失败,email blast #3 在发送 182 封电子邮件后失败。

我一直在研究和研究,找不到原因。现在我将每封电子邮件都发送到 To: 消息中,而不是使用 BCC: 路由发送它们。可能是我服务器上的设置吗?如果是这样,我应该寻找什么?

我还内置了一些调试功能。最后的 sql 脚本将电子邮件以及发送的具体时间添加到数据库中,这样我就可以准确地知道发送了多少封邮件,哪些邮件停止了过程,以及需要多长时间。

它停止的电子邮件没有显示任何模式(意味着它们是不同的电子邮件提供商),发送这么多只需要大约 10 到 12 分钟。我在服务器上的脚本超时时间比这高得多,所以这不是原因。

我的代码如下:

$mail = new PHPMailer();
$mail->IsSMTP();                                      // set mailer to use SMTP
$mail->Host = "*server ip here*";  // specify main and backup server
$mail->SMTPKeepAlive = true;                  // SMTP connection will not close after each email sent
$mail->SMTPAuth = false;     // turn on SMTP authentication
$mail->Username = "*user*";  // SMTP username
$mail->Password = "*pass*"; // SMTP password

while($select2 = sqlsrv_fetch_array($select)) {
$email = $select2['email'];
$unid    = $select2['id'];
$unemail = $select2['email'];
$to = $email;
$from = "newsletter@site.com";
$new_date = date("n/j/y - g:i:s a");
$headers = "From: $from\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$message2 = "<html><body>";
$message2 .= $message;
$message2 .= "</body></html>";

$mail->From = "newsletter@site.com";
$mail->FromName = "Newsletter";
$mail->AddAddress($to);
$mail->AddReplyTo("newsletter@site.com", "Website.com");

$mail->IsHTML(true);                                  // set email format to HTML

$mail->Subject = $subject;
$mail->Body    = $message2;

if(!$mail->Send()) {
    die("mail() Failed to send email to $to.");
    echo "<br><br>Mailer Error: " . $mail->ErrorInfo;
    exit;
} else {
    $make_sent_query = "INSERT INTO emailssent (email_signup_id, email, datesent) VALUES (?, ?, ?)";
    $params_sent = array($unid, $to, $new_date);
    $add_to_sent = sqlsrv_query($conn, $make_sent_query, $params_sent);
    if($add_to_sent) {
        echo "Message sent for email $to<br>";
    } else {
        die("Mail sent, but failed to insert into Sent Emails database.");
    }
}

$mail->ClearAddresses();  //clear addresses for next loop
}

【问题讨论】:

  • 您是否遇到了 PHP 或 Web 服务器超时?
  • 据我所知,两者都不是。它只是随机停止。我将脚本执行时间设置为一个小时,它会在 15~ 分钟后停止。
  • 它是否在循环中回显您的任何消息?
  • 它会在发送消息以及出现错误时回显。似乎没有特别的错误使它完全停止运行。我今天将尝试使用 sleep() 命令,看看会发生什么。

标签: php email phpmailer


【解决方案1】:

这可能是由您的本地邮件服务器引起的吗?如果您在短时间内发送了 150 封电子邮件,则可能会假定它是垃圾邮件,一旦达到一定数量就停止。

您可以在发送每封邮件后尝试使用 sleep() 减慢速度吗?如果这是原因的话,一两秒钟就足够了....

您是否有不想使用密件抄送的原因?您可以将电子邮件发送给多个收件人,并将您发送的电子邮件数量减少到您现在发送的数量的一小部分,但其代价是无法个性化每封电子邮件。

【讨论】:

  • 我尝试密件抄送没有问题,我只是觉得这样做看起来更垃圾。我知道添加 SPF 记录会对此有所帮助,尽管我对尝试它仍然有些不确定。我也没有尝试过 sleep 命令。我想我会这样做,看看它是如何工作的。
【解决方案2】:

我认为这是超时问题。而 crontab 可以解决你的问题 http://en.wikipedia.org/wiki/Cron 。您可以编写脚本来发送您的电子邮件,并将您的 crontab 设置为每分钟运行一次此脚本。那你就从来没有超时过。

【讨论】:

    【解决方案3】:

    其中一个潜在原因可能是 PHP 使脚本超时。每个脚本都会在有限的时间内运行。如果您的脚本花费的时间比这更多,那么 PHP 将简单地终止该脚本。通常这会导致错误日志中报告错误。检查您的 apache 错误日志消息 - 它们可能包含提示。

    【讨论】:

      【解决方案4】:

      这是由 XAMPP 中的 max_execution_time 引起的,
      因此,当脚本运行超过 max_execution_time 时,发送电子邮件的脚本将停止。 默认的 max_execution_time 是 120 秒。 发送大量电子邮件需要很多时间。

      你可以通过添加这个脚本来改变它

      ini_set('max_execution_time', 0);
      

      把它放在你的电子邮件爆破脚本部分之前,它告诉 php 将它设置为无限的 max_execution_time。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多