【问题标题】:PHPMailer sending identical duplicate emails to only 1 recipient every timePHPMailer 每次仅向 1 个收件人发送相同的重复电子邮件
【发布时间】:2017-01-05 17:22:14
【问题描述】:

我有一个非常简单的脚本,它会定期从服务器发送一封电子邮件,以确认一切正常。电子邮件仅发送到一个地址,并且每次发送两封相同的电子邮件。没有循环,也没有数据库调用其他地址。一切都在脚本中设置和修复。

关于这个话题有很多类似的问题。所有人都处理略有不同的情况 - 添加地址,偶尔重复等 - 我已经仔细遵循了每个建议。我还按照@Synchro 的建议仔细阅读了 PHPMailer 文档。具体来说,我有:

  • 将交互简化为最简单的代码 - 忘记 chron 作业,忘记为电子邮件收集数据等(见下文)
  • 升级到最新版本的PHPMailer
  • 在每个 this post 的条件语句中查找 $mail->send() 的使用(找不到任何内容)
  • 关闭了 Apache 的重写引擎,认为可能的服务器重定向正在复制请求(并重新启动服务器)
  • 使用 firebug 检测页面的重复 get 请求(仅显示一个请求)
  • 在 firefox 中禁用所有插件和扩展并重新启动 firefox
  • 在 Chrome 中尝试了相同的脚本
  • 将 smtp 的调试通知级别设置为 1;这里没有什么惊天动地的,脚本运行一次
  • 比较了电子邮件消息 ID。 smtp 调试消息和两封电子邮件中的 Message-ID 相同
  • 将相关脚本移至不同的开发环境

在每种情况下,我都会得到相同的结果 - 2 封相同的电子邮件使用相同的 Message-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_mail 类如下所示:

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_mail 类中使用的默认值 (CAPITALIZED_TERMS),仅此而已。

环境为:PHP 7.0.13/PHPMailer 5.2.21/Apache 2.4.23

还有什么可能导致重复的电子邮件?

【问题讨论】:

  • 拥有一个同时执行某些操作的构造函数是不好的做法,即$mail-&gt;Send();。您应该将该调用移至 send_mail 类的新成员函数,然后从您的 $mail 实例中调用该函数。
  • 感谢您阅读文档???? !它是发送 2 份完全相同的消息,还是 2 条单独的消息?对此进行测试的一种方法是检查消息 ID,或将随机数附加到主题行。还要启用SMTPDebug = 2,这样您就可以准确地看到您的邮件服务器的内容。那个类有一个非常奇怪的结构,像这样从构造函数发送 - 虽然我没有看到任何会阻止它工作的东西。
  • @Synchro - 如上所述,这是两封具有相同 Message-ID 的相同电子邮件 - 即它们是彼此的副本 - 没有区别。
  • 它在调试输出和邮件服务器日志中的表现如何?
  • @Synchro - SMTP 输出看起来很正常 - 只有一个通过 AUTH LOGIN,身份验证成功,所有邮件内容,然后退出。至于邮件日志,它们会在哪里?电子邮件帐户位于托管服务器上。

标签: php email phpmailer


【解决方案1】:

归根结底,上述现象完全是由“操作员错误”引起的。过去的某个时候,我在 cPanel 中为收件人电子邮件帐户设置了一个电子邮件过滤规则。该规则有效地导致了此特定电子邮件的重复发送。奇怪的是我没有收到其他电子邮件的重复,但事实上,一旦删除了违规规则,上述重复的电子邮件就停止了……所有电子邮件似乎都正常通过。所以根本原因与 PHPMailer、托管公司、Thunderbird 或代码无关。

过滤规则是很久以前创建的,而且很远,所以不是明显的原因。我在这里纪念这个结论,以防万一它有帮助。让它证明你铺设的轨道有时会将你引向错误的方向......

非常感谢其他人为得出这个令人尴尬的结论所提供的所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2018-06-01
    • 2012-05-18
    相关资源
    最近更新 更多