繁体   English   中英

PHPMailer 没有将所有电子邮件发送到最后一个电子邮件地址

[英]PHPMailer not sending all emails to last email address

我正在使用 PHPMailer 发送电子邮件。 我创建了一个函数,可以向 3 个不同的电子邮件地址发送 3 封电子邮件(总共发送 9 封电子邮件)。

  • 第一个电子邮件地址正在接收所有 3 封电子邮件。
  • 第二个电子邮件地址正在接收 2 封电子邮件。
  • 第三个电子邮件地址仅收到 1 封电子邮件。

为什么会发生这种情况?

这是我的代码:

use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\Exception;

require 'lib/phpmailer/vendor/autoload.php'; 

$mail = new PHPMailer(true);

$mail1 = phpmaileremail($reciever1, $usertype1, $file, $subject1, $body1);
$mail2 = phpmaileremail($reciever2, $usertype2, $file, $subject2, $body2);
$mail3 = phpmaileremail($reciever3, $usertype3, $file, $subject3, $body3);

function phpmaileremail($reciever,$usertype, $file, $subject, $body)
{
    global $mail;
    $mail->SMTPDebug = 0;                                        
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'xxx@gmail.com';
    $mail->Password = 'xxx';
    $mail->SMTPSecure = 'tls';                               
    $mail->Port = 587;   

    $mail->setFrom('xxx', 'xxx');            
    $mail->addAddress($reciever); 
    $mail->addAddress($reciever, $usertype); 

    $mail->addAttachment($file);

    $mail->isHTML(true);                                   
    $mail->Subject = $subject; 
    $mail->Body = $body; 
    $mail->AltBody = 'NA'; 
    $mail->send();

    echo "Mail sent";
}

因为您将$mail对象重用于addAddress()send() 因此,当您第一次调用phpmaileremail() ,第一个地址会收到电子邮件。 然后,当您第二次调用它时,会添加第二个地址,并且第一个和第二个地址会收到电子邮件。 等等。

一个简单的解决方案是在phpmaileremail()函数中创建$mail对象:

function phpmaileremail($reciever,$usertype, $file, $emailsubject, $email_body )
{

  $mail = new PHPMailer(true);

  $mail->SMTPDebug = 0;                                        
  $mail->isSMTP();                                             
  $mail->Host       = 'smtp.gmail.com;';                     
  $mail->SMTPAuth   = true;                              
  $mail->Username   = 'XXXXXXXX@gmail.com';                  
  $mail->Password   = 'XXXXXXXXXXXXXXXXXX';                         
  $mail->SMTPSecure = 'tls';                               
  $mail->Port       = 587;   

  $mail->setFrom('XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXX');            
  $mail->addAddress($reciever); 
  $mail->addAddress($reciever, $usertype); 
  // Attachments
  $mail->addAttachment($file);         // Add attachments

  $mail->isHTML(true);                                   
  $mail->Subject = $emailsubject; 
  $mail->Body    = $email_body; 
  $mail->AltBody = 'NA'; 
  $mail->send(); 

  echo "Mail sent"; 

}

PS:这不是问题,但reciever写入receiver 我也犯过这样的错误。

Kiko 的答案会奏效,但这不是最好的方法。 顾名思义, addAddress添加一个地址,它不会绝对设置或替换您已经添加的现有收件人。

PHPMailer 有一个标准函数来清除您要结束的地址列表,称为clearAddresses ,因此正确的方法是在您发送的每条消息之后调用它并在发送下一条消息之前添加新地址,因此序列大致如下:

addAddress();
send();
clearAddresses();
addAddress();
send();

等等。 这在PHPMailer 提供的邮件列表示例中得到最清楚的证明,它在循环中发送,每次都调用clearAddresses

您可以每次使用 PHPMailer 的新实例来实现相同的目的(它具有清除地址的效果,但也清除其他所有内容),但重用该实例更有效。 如果您通过 SMTP(您是)发送,则尤其如此,因为它允许您使用 keepalive,从而大大减少了建立 SMTP 连接的开销。 如果您使用新实例,则每次都会断开并重新创建连接。 您可以通过将 PHPMailer 实例设为静态来在您的函数中实现这一点:

function phpmaileremail($reciever, $usertype, $file, $emailsubject, $email_body)
{
    static $mail;

    if ($mail === null) {
        //Set everything that remains the same all the time in here
        $mail = new PHPMailer();
        $mail->SMTPDebug = 0;
        $mail->isSMTP();
        $mail->Host = 'smtp.gmail.com;';
        $mail->SMTPAuth = true;
        $mail->Username = 'XXXXXXXX@gmail.com';
        $mail->Password = 'XXXXXXXXXXXXXXXXXX';
        $mail->SMTPSecure = 'tls';
        $mail->Port = 587;
        $mail->SMTPKeepAlive = true;
        $mail->setFrom('XXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXX');
    }
    $mail->addAddress($reciever, $usertype);
    // Attachments
    $mail->addAttachment($file);         // Add attachments

    $mail->isHTML(true);
    $mail->Subject = $emailsubject;
    $mail->Body = $email_body;
    $mail->AltBody = 'NA';
    $mail->send();
    $mail->clearAddresses();
    $mail->clearAttachments();
    echo "Mail sent";
}

这具有不使用全局的额外好处。 还要注意clearAttachments的使用,因为它的工作方式与地址相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM