70次成功发送后,SMTP connect()失败错误

时间:2018-03-23 16:52:14

标签: phpmailer

许多人使用 phpmailer 和g-mail显示了类似的问题。这个问题略有不同,可能需要不同的答案。

phpmailer代码是相当标准的(下面)。我有一个循环,它遍历表中的一些数据,并为收件人构建自定义消息,为表中的每一行发送一条消息。发送邮件时,它成功完成了大约100个收件人中的75个,而在最后25个邮件中,它报告 SMTP连接()失败错误。这不会每次都发生,偶尔,脚本会顺利通过循环。

<?php
$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->SMTPDebug  = 0; // enables SMTP debug information (for testing)
$mail->SMTPsecure = "ssl";
$mail->SMTPAuth   = true; // enable SMTP authentication
$mail->Host       = "smtp.gmail.com"; // sets the SMTP server
$mail->Port       = 587;  // set the SMTP port for the GMAIL server
$mail->Username   = "xx"; // SMTP account username
$mail->Password   = "xx"; // SMTP account password 
$mail->SetFrom("xx@gmail.com");
$mail->isHTML(true);
$mail->CharSet = "utf-8";
$mail->Subject = $msgsubject;
$mail->AltBody = "Invitation";
  do {
    $membername = $row_musicians['name'];
    $membernumber = $row_musicians['number'];
    $emailaddress = $row_musicians['email'];
    $rhdate = $row_musicians['rhdate'];

$mail->clearAttachments();
$mail->Body = 'Dear '.$membername.',
  <p>'.$maintext.'</p>
  ';
// some more text using custom variables from database
// closing part of the message
$mail->Body .= '<p>'.nl2br($closing, false).'</p>
</body>
</html>';
 $mail->AddAddress($emailaddress, $membername); // sending each message
  sleep(1); // wait one second between sends, to avoid spam filters
 echo '<br />
 Recipient: '.$membername.' ('.$emailaddress.') -- ';   
 if(!$mail->Send()) {
        echo "Mailer Error: <div style='color:#009999'>" . $mail->ErrorInfo."        </div>";
        } else {
              echo "Message sent!";
}
  $mail->ClearAddresses();
    } while ($row_musicians = mysql_fetch_assoc($musicians));
mysql_free_result($musicians);
?>

1 个答案:

答案 0 :(得分:0)

我建议您将代码基于the mailing list example provided with PHPMailer

您正在做大部分事情 - 首先初始化PHPMailer并设置所有消息共有的属性,但缺少一个关键因素:

$mail->SMTPKeepAlive = true;

如果没有这个意味着它会关闭并重新打开每条消息的连接,并且您很可能会遇到连接速率限制。

您还使用Port= 587SMTPSecure = 'ssl'的组合,这通常不起作用;切换到Port = 465

我还建议不要使用do/while循环 - 如果您的数据库查询无法找到任何内容,它会失败,因为它经过了底层测试,因此总是会运行一次,即使有没有数据。请改用whileforeach循环。

邮件列表示例已经完成了所有这些事情。

最后一件事 - 如果这是您的所有代码,看起来您正在运行旧版本的PHPMailer,请获取最新版本。