【问题标题】:PHP Mailer sending duplicate emailsPHP Mailer 发送重复的电子邮件
【发布时间】:2021-10-15 00:39:39
【问题描述】:

正如标题所暗示的那样 我试图发送一封电子邮件(一封电子邮件),但我面临的问题很奇怪。 每当打开调试时,电子邮件只会发送一次。 但是关闭调试后,一次会发送大约 3 到 4 封电子邮件。

注意:我使用的是 localhost,而不是实际的服务器。

为了诊断问题,我执行了以下操作: 1- 使用 md5 在“主题”中生成随机字符串,以检查发送的电子邮件是否具有相同的内容或不同的内容。结果完全不同。意思是,电子邮件不是重复的,而是实际上被发送了几次。 2- 在没有扩展的浏览器中打开项目,以确保问题不是在多次加载我的项目页面的扩展中。并且结果也与数字1相似,不同的“主题”也。

所以,长篇大论。我不知道是什么导致了这个问题的发生。以及为什么它仅在打开调试时才停止发生。

注意:这不是我第一次使用 PHP mailer,但我第一次遇到这个问题。我也在使用最新版本的 PHP mailer (6.5.1)

这是我的整个代码: 在 PHP 邮件文件中:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require ABSPATH.'inc/phpmailer/script/src/PHPMailer.php';
require ABSPATH.'inc/phpmailer/script/src/Exception.php';
require ABSPATH.'inc/phpmailer/script/src/SMTP.php';



function SendEmail(){
    $mail = new PHPMailer(true);
    try {
        //Server settings
        $mail->SMTPDebug = SMTP::DEBUG_OFF;
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = 'ssl';
        $mail->isSMTP();
        $mail->Host       = '*****';
        $mail->SMTPAuth   = true;
        $mail->Username   = '*****'; 
        $mail->Password   = '*****';
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail->Port       = 465;
        $mail->SMTPAutoTLS = false;
        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->ClearAllRecipients();
        $mail->clearAttachments();
        //Recipients
        $mail->setFrom('*****', '******');
        $mail->addAddress('*******', '*****');
        $mail->addReplyTo('******', '******');
    
        //Attachments
        $mail->addAttachment(ABSPATH.'upload/dog.jpg', 'new.jpg');
    
        //Content
        $mail->isHTML(true);
        $mail->Subject = md5(rand()); //This is how I'm checking whether it sends same email with same subject header or different ones. and it does send different ones
        $mail->Body    = 'This is the HTML message body <b>in bold!</b>'. md5(rand());
        $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
        $mail->ContentType = 'text/html; charset=utf-8\r\n';
        $mail->send();
        echo 'Message has been sent';
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }
}

这是我用来调用函数的文件

<?PHP
// NO LOOP here
require_once(ABSPATH.'inc/phpmailer/phpmailer.php');
SendEmail();

【问题讨论】:

  • “debug”是指 PHPMailer、WordPress 还是 PHP?

标签: php phpmailer


【解决方案1】:

与往常一样,首先要检查的是the docs

由于您已经尝试过主题技巧中的随机哈希(您的逻辑做得很好!),您知道问题不在于您的脚本发送了多条消息,而是您的脚本被重复调用,并且您也应该在您的 Web 服务器日志中看到这方面的证据。造成这种情况的通常原因是浏览器扩展有一个讨厌的习惯,即多次提交。使用没有扩展程序的干净浏览器进行测试(例如,使用您通常不使用的浏览器,如 Opera、Brave 或 Chrome Canary)。

您的浏览器发出的任何请求都应显示在开发控制台的网络选项卡中。在服务器端,您可以设置远程调试以触发断点(棘手),或 var_dump 对日志的每个请求,以便您获得调用脚本的完整详细信息。

顺便说一句,您真的不应该禁用 TLS 验证。正确解决问题而不是隐藏它;故障排除指南有很多关于该主题的内容。

【讨论】:

  • 这不是答案,应该发表评论。他还写道,他使用干净的浏览器进行了尝试。
  • 我确实阅读了文档,实际上我在 github 上提供的启动脚本之上构建了当前脚本。以及关于 tls。我完全忘了让它说实话。除此之外,即使在没有扩展的浏览器上,我也尝试了一切。并且问题仍然存在。另外,这是我第一次遇到这个问题。当我之前使用该脚本但在旧版本上时,我根本没有遇到过这个问题。
  • 那么您在日志中看到了什么?您是否看到多个请求?您是否在客户端和服务器端都看到请求记录?下一步可能是尝试像 Charles、fiddler 或 Burp 套件这样的测试代理,这样您就可以查看所有流量并跟踪它的来源。
【解决方案2】:

我遇到了同样的问题,通过升级到最新版本的 PHPMailer 解决了。

【讨论】:

  • 最新版本是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多