php - PHPmailer 给我一个 504 网关超时错误
问题描述
使用 phpmyadmin 向大约 1200 个用户的列表发送个人电子邮件时,我的服务器收到 504 网关超时错误
我需要将电子邮件一一发送给用户,因为我不想将列表中的任何电子邮件地址暴露给任何其他用户
当我发送到一个小列表时,它似乎工作得很好,但是当我想发送到一个大列表时,我收到了这个错误
发送一封电子邮件,重置请求并发送列表中的下一封电子邮件,因为它通过循环的最佳方式是什么?
此外,我希望在每次电子邮件发出时看到发送到 [name] 的消息
这是我的php
require('connection.inc.php');
include ("PHPMailer/class.phpmailer.php");
include ("PHPMailer/class.smtp.php");
require 'PHPMailer/PHPMailerAutoload.php';
$mail = new PHPMailer();
if (isset($_POST['submit'])) {
error_reporting(E_STRICT | E_ALL);
date_default_timezone_set('Etc/UTC');
$message = $_POST['message'];
$UeMail = uniqid();
$UDomain = uniqid();
$domain = '@zzz.org';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->Host = 'zzz.zzz.com';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead
$mail->Username = 'zzz@zzz.com';
$mail->Password = 'zzz';
$mail->setFrom('zzz' . $UeMail . $domain);
$mail->addReplyTo('zzz@zzz.com');
$mail->WordWrap = 9999; // set word wrap
// I ADDED THIS TO BYPASS SSL ERRORS
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
// SET ENVOIRMENT #1 (DONT FORGET TO SET #2)
// LIVE ENVIORMENT EMAIL TO SMS
$result = mysqli_query($con, "SELECT name, mob_email FROM `user` WHERE mob_email<>''");
// TEST ENVIORMENT
// $result = mysqli_query($con, "SELECT email, name FROM user_test WHERE email<>''");
foreach($result as $row) {
set_time_limit(60);
$mail->Body = $message; //HTML Body
$mail->AltBody = $message; //Text Body
// SET ENVOIRMENT #2
// LIVE ENVIORMENT EMAIL TO SMS
$mail->addAddress($row['mob_email'], $row['name']);
// TEST ENVIORMENT
// $mail->addAddress($row['email'], $row['name']);
if (!$mail->send()) {
echo "Mailer Error (" . str_replace("@", "@", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />';
break; //Abandon sending
}
else {
echo "Message sent to :" . $row['name'] . ' (' . str_replace("@", "@", $row['email']) . ')<br />';
// Mark it as sent in the DB (NOT USING THIS RIGHT NOW)
/*
mysqli_query(
$mysql,
"UPDATE mailinglist SET sent = TRUE WHERE email = '" .
mysqli_real_escape_string($mysql, $row['email']) . "'"
);
*/
}
// Clear all addresses and attachments for next loop
$mail->clearAddresses();
$mail->clearAttachments();
}
}
这是我的html
<!DOCTYPE html>
<html>
<head>
<title>Form submission</title>
</head>
<body>
<form action="" method="post">
Message:<br><textarea rows="5" name="message" cols="30" maxlength="110"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
所有代码都在一个文件中(sendEmail.php)
解决方案
我可以看到您的代码基于 PHPMailer 邮件列表示例(尽管看起来您可能是从旧版本开始的,所以请检查您使用的是最新版本),并且看起来基本正确。
但是,在页面加载时发送这么多消息永远不会可靠地工作。您需要从 cron 运行它,以免它受到此类超时的影响。set_time_limit(60)
调用;也没有任何意义。这不会延长您达到的整体超时时间。
除非您确切地这样做,否则永远不要禁用 SSL 证书验证- 正确修复它。PHPMailer 故障排除指南提供了大量有关如何检查问题的信息。
推荐阅读
- c++ - Qt - 如何从 QObject 同步请求数据
- groovy - 完成后如何重新运行groovy脚本
- javascript - 赛普拉斯测试 - 期望文本是其中之一
- vxworks - 如何对 VxWorks Workbench 项目进行版本控制
- tcl - 是否可以有条件地包含一个包?
- javascript - 如何使用javascript获取Json对象中字符串的实例数
- jquery - html2xlsx - 如何使用 jQuery 选择表格
- sql-server - 具有空 DELETED 逻辑表的 SQLServer 更新触发器
- c++ - 无锁slist擦除
- git - 如何获得原始的 git 存储库