我正在使用 PHPMailer 从数据库中的电子邮件列表中发送时事通讯。该脚本查询数据库,使用 while 循环将数据放入数组中,并在 while 循环中创建并发送电子邮件。
它工作正常,直到发送了 150 封左右的电子邮件,然后它随机停止。例如,电子邮件爆炸 #1 在发送 161 封电子邮件后失败,电子邮件爆炸 #2 在发送 165 封电子邮件后失败,电子邮件爆炸 #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
}