PHPMailer 每次只向 1 个收件人发送相同的重复电子邮件
PHPMailer sending identical duplicate emails to only 1 recipient every time
我有一个非常简单的脚本,可以从服务器定期发送电子邮件以确认一切正常。电子邮件只发送到一个地址,每次,两封相同的电子邮件 sent.There 没有循环,没有数据库调用其他地址。一切都在脚本中设置和固定。
关于这个主题有很多类似的问题。所有处理的情况都略有不同——添加地址、偶尔重复等——我已经仔细遵循了每一个中的建议。我还听从了@Synchro 的建议,仔细阅读了 PHPMailer 文档。具体来说,我有:
- 将交互简化为最简单的代码 - 忘记计时作业,忘记收集电子邮件数据等(见下文)
- 升级到最新版本的PHPMailer
- 在每个 this post 的条件语句中寻找 $mail->send() 的使用(找不到)
- 关闭 Apache 的重写引擎,认为可能的服务器重定向正在复制请求(并重新启动服务器)
- 使用 firebug 检测页面的重复获取请求(仅显示一个请求)
- 禁用 firefox 中的所有插件和扩展并重新启动 firefox
- 在 Chrome
中尝试了相同的脚本
- 将 smtp 的调试通知级别设置为 1;这里没有什么惊天动地的,脚本运行一次
- 比较了电子邮件的 Message-ID。 smtp 调试消息中的 Message-ID 和两封电子邮件相同
- 将相关脚本移动到不同的开发环境
在每种情况下,我都会得到相同的结果 - 发送了 2 封相同的电子邮件,它们具有相同的消息 ID 和完全相同的时间戳。
简化的test_send_mail.php调用脚本:
$subject = 'TEST PHP_MAILER';
$msg = 'this is only a test';
$mail = new send_mail('','',$subject,$msg);
$mail->send_it();
exit('sent');
send_mailclass看起来像这样:
require_once($_SERVER['DOCUMENT_ROOT'].'/core/phpMail_core.php');
set_include_path('c:/Apache24/Core/_common/PHPMailer-master/');
require 'class.phpmailer.php';
require 'class.smtp.php';
class send_mail {
//__CONSTRUCT
function __construct($to='',$from='',$subject='[no subject]',$body='[no content]') {
if(empty($to)) {
$to = DEFAULT_RECIPIENT;
}
if(empty($from)) {
$from = SYS_ADMIN;
}
$this->ready_mail = $this->set_parameters($to,$from,$subject,$body);
}
// SET_PARAMETERS
function set_parameters($to,$from,$subject,$body) {
$mail = new PHPMailer(true); // true = throw exceptions on errors
$mail->IsSMTP();
try {
$mail->clearAddresses();
$mail->Host = SMTP_SERVER;
$mail->SMTPDebug = 0; //0 = none; 1 = some; 2 = all
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->Port = SMTP_PORT;
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;
//for php5.6 to bypass SSL check
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->WordWrap = 50;
$mail->isHTML(true); // Set email format
$mail->SetFrom($from);
$mail->FromName = 'UHMS SysAdmin';
$mail->addAddress($to);
//for local only
$mail->Subject = $subject.' *local*';
//for production only
//$mail->Subject = $subject;
$mail->Body = $body;
} catch (phpmailerException $e) {
pp('phpMailerException',$e->errorMessage());
} catch (Exception $e) {
pp('send_mail exception',$e->getMessage());
}
return $mail;
}
//SEND_IT
function send_it() {
echo '<br>sending...';
$this->ready_mail->Send();
}
PHPMail_core.php只是定义了send_mailclass中使用的默认值(CAPITALIZED_TERMS),仅此而已。
环境是:PHP7.0.13/PHPMailer 5.2.21/Apache 2.4.23
还有什么可能导致重复的电子邮件?
归根结底,上述现象完全是由 "operator error" 引起的。过去的某个时候,我在 cPanel 中为收件人电子邮件帐户设置了电子邮件过滤规则。该规则实际上导致了该特定电子邮件的重复发送。奇怪的是我没有收到其他电子邮件的副本,但事实上,一旦违规规则被删除,上述重复的电子邮件就停止了……而且所有电子邮件似乎都正常发送。所以根本原因与 PHPMailer、托管公司、Thunderbird 或代码无关。
过滤器规则是很久以前创建的,所以不是明显的原因。我在这里纪念结论以防万一。让它证明你铺设的轨道有时会把你引向错误的方向...
非常感谢其他人为得出这个令人尴尬的结论提供的所有帮助。
我有一个非常简单的脚本,可以从服务器定期发送电子邮件以确认一切正常。电子邮件只发送到一个地址,每次,两封相同的电子邮件 sent.There 没有循环,没有数据库调用其他地址。一切都在脚本中设置和固定。
关于这个主题有很多类似的问题。所有处理的情况都略有不同——添加地址、偶尔重复等——我已经仔细遵循了每一个中的建议。我还听从了@Synchro 的建议,仔细阅读了 PHPMailer 文档。具体来说,我有:
- 将交互简化为最简单的代码 - 忘记计时作业,忘记收集电子邮件数据等(见下文)
- 升级到最新版本的PHPMailer
- 在每个 this post 的条件语句中寻找 $mail->send() 的使用(找不到)
- 关闭 Apache 的重写引擎,认为可能的服务器重定向正在复制请求(并重新启动服务器)
- 使用 firebug 检测页面的重复获取请求(仅显示一个请求)
- 禁用 firefox 中的所有插件和扩展并重新启动 firefox
- 在 Chrome 中尝试了相同的脚本
- 将 smtp 的调试通知级别设置为 1;这里没有什么惊天动地的,脚本运行一次
- 比较了电子邮件的 Message-ID。 smtp 调试消息中的 Message-ID 和两封电子邮件相同
- 将相关脚本移动到不同的开发环境
在每种情况下,我都会得到相同的结果 - 发送了 2 封相同的电子邮件,它们具有相同的消息 ID 和完全相同的时间戳。
简化的test_send_mail.php调用脚本:
$subject = 'TEST PHP_MAILER';
$msg = 'this is only a test';
$mail = new send_mail('','',$subject,$msg);
$mail->send_it();
exit('sent');
send_mailclass看起来像这样:
require_once($_SERVER['DOCUMENT_ROOT'].'/core/phpMail_core.php');
set_include_path('c:/Apache24/Core/_common/PHPMailer-master/');
require 'class.phpmailer.php';
require 'class.smtp.php';
class send_mail {
//__CONSTRUCT
function __construct($to='',$from='',$subject='[no subject]',$body='[no content]') {
if(empty($to)) {
$to = DEFAULT_RECIPIENT;
}
if(empty($from)) {
$from = SYS_ADMIN;
}
$this->ready_mail = $this->set_parameters($to,$from,$subject,$body);
}
// SET_PARAMETERS
function set_parameters($to,$from,$subject,$body) {
$mail = new PHPMailer(true); // true = throw exceptions on errors
$mail->IsSMTP();
try {
$mail->clearAddresses();
$mail->Host = SMTP_SERVER;
$mail->SMTPDebug = 0; //0 = none; 1 = some; 2 = all
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->Port = SMTP_PORT;
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;
//for php5.6 to bypass SSL check
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->WordWrap = 50;
$mail->isHTML(true); // Set email format
$mail->SetFrom($from);
$mail->FromName = 'UHMS SysAdmin';
$mail->addAddress($to);
//for local only
$mail->Subject = $subject.' *local*';
//for production only
//$mail->Subject = $subject;
$mail->Body = $body;
} catch (phpmailerException $e) {
pp('phpMailerException',$e->errorMessage());
} catch (Exception $e) {
pp('send_mail exception',$e->getMessage());
}
return $mail;
}
//SEND_IT
function send_it() {
echo '<br>sending...';
$this->ready_mail->Send();
}
PHPMail_core.php只是定义了send_mailclass中使用的默认值(CAPITALIZED_TERMS),仅此而已。
环境是:PHP7.0.13/PHPMailer 5.2.21/Apache 2.4.23
还有什么可能导致重复的电子邮件?
归根结底,上述现象完全是由 "operator error" 引起的。过去的某个时候,我在 cPanel 中为收件人电子邮件帐户设置了电子邮件过滤规则。该规则实际上导致了该特定电子邮件的重复发送。奇怪的是我没有收到其他电子邮件的副本,但事实上,一旦违规规则被删除,上述重复的电子邮件就停止了……而且所有电子邮件似乎都正常发送。所以根本原因与 PHPMailer、托管公司、Thunderbird 或代码无关。
过滤器规则是很久以前创建的,所以不是明显的原因。我在这里纪念结论以防万一。让它证明你铺设的轨道有时会把你引向错误的方向...
非常感谢其他人为得出这个令人尴尬的结论提供的所有帮助。