php - PHPmailer 多个邮件 - 503 错误
问题描述
我有phpmailer的问题。我想发送多封不同内容的电子邮件。该脚本适用于多个地址,但不适用于数百个地址。当我尝试为 100 个用户发送电子邮件时,出现错误 503“服务不可用。由于维护停机时间或容量问题,服务器暂时无法满足您的请求。”
这是代码:
include('../config_inc.php');
include('../admin-settings.php');
if(isset($_POST['submit'])){
require("../phpmailer/class.smtp.php");
require("../phpmailer/class.phpmailer.php");
$mail = new PHPMailer();
if(!empty($_POST['wyslijemail'])){
foreach($_POST['wyslijemail'] as $ids){
set_time_limit(60);
$iduser = $ids;
$tabelka = '1234567890qwertyuiopasdfghjklzxcvbnm';
$ticket = '';
for ($i=0; $i<7; $i++) {
$ticket .= $tabelka[rand()%(strlen($tabelka))];
}
$zapytanie_user = mysql_query("SELECT * FROM users WHERE id = ".$iduser."");
$user_row = mysql_fetch_array($zapytanie_user);
$admin_email = $settings_cms['email'];
$title_page = $settings['tytul_email'];
$login = $user_row['login'];
$haslo_encode = $user_row['haslo_encode'];
$tytul_aktywacja = $powiadomienia['tytul_aktywacja'];
$tresc_aktywacja = $powiadomienia['tresc_aktywacja'];
$email = $user_row['email'];
$message = $powiadomienia['aktywacja_oferta'];
$message = str_replace("{login}",$login,$message);
$message = str_replace("{domena}",$domena2,$message);
$message = str_replace("{ticket}",$ticket,$message);
$message = str_replace("{iduser}",$iduser,$message);
$message = str_replace("{haslo}",$haslo_encode,$message);
$message = str_replace("{tytul}",$title_page,$message);
$message = str_replace("tytul_aktywacja}",$tytul_aktywacja,$message);
$message = str_replace("tresc_aktywacja}",$tresc_aktywacja,$message);
$mail->IsSMTP();
$mail->CharSet = "UTF-8";
$mail->PluginDir = "phpmailer/";
$mail->From = "".$admin_email."";
$mail->FromName = "".$settings['tytul_email']."";
$mail->Host = "".$settings['smtp_serwer']."";
$mail->Mailer = "smtp";
$mail->Username = "".$settings['smtp_login']."";
$mail->Password = "".$settings['smtp_haslo']."";
$mail->IsHTML(true);
$mail->Port = "".$settings['smtp_port']."";
$mail->SetLanguage("pl", "phpmailer/language/");
$mail->Subject = $powiadomienia['tytul_aktywacja'];
$mail->Body = ''.$message.'';
$mail->AddAddress("".$email."","".$login."");
if($mail->Send()){
$check = 1;
} else {
header('Location: https://xxx?akcja=email_masowo_error');
}
$mail->ClearAddresses();
$mail->ClearAttachments();
}
if($check == 1){
header('Location: https://xxxx/show_users_list.php?akcja=email_masowo');
}
}
}
?>
解决方案
在网页提交期间做一些需要很长时间的事情是不可靠的,并且会得到 503 错误,因为 Web 服务器认为 PHP 已损坏。您可以增加超时时间,但这不是一个合适的解决方案。
使用您的页面提交将消息标记为需要发送(但实际上并不执行发送),然后使用 cron 脚本或长时间运行的守护程序来获取消息并异步发送它们。PHPMailer 提供了一个合适的脚本,用于有效地将消息发送到列表。
为了获得最佳性能,您应该运行本地邮件服务器并通过 SMTP 提交给该服务器。PHPMailer wiki 有一篇关于发送到列表的文章。
您正在运行旧版本的 PHPMailer;获取最新的。
另外,不要使用mysql_*
函数;它们已经过时了。请改用mysqli_*
或 PDO。
推荐阅读
- android - 适用于 Android 和 iOS 的通用图形资源格式
- angular - Angular 服务测试未通过
- kubernetes-helm - 让 Helm 三元运算符返回任意值,而不仅仅是 True / False
- sql - SQL 错误:关键字用户附近的语法不正确
- angular - 在 Angular Material 分页器中处理一百万条数据记录
- php - 在 PHP 中创建表
- intellij-idea - 从 IntelliJ IDEA 2020.1 运行 JUnit 测试会生成 ClassNotFoundException
- python - 在 Linux Mint 上安装 pyttsx3
- sparklyr - sparklyr::spark_read_csv java.net.URISyntaxException 在 Windows
- xml - 如何使用 XSL 访问可变 XML 元素?