PHP Mailer发送重复的电子邮件(一次发送两封电子邮件)

时间:2017-05-10 21:19:11

标签: php mailer

PHP邮件程序正在发送两封电子邮件我试图发送它而没有循环只是一封电子邮件但它是相同的结果

我在stackoverflow上找到了这个,但没有改变任何东西

$mail->SingleTo = true;

那么我能为此做些什么?我如何只为每个收件人发送一封电子邮件?

这是我自定义的Mailer类

class Mailer
{
    public static function sendMail($subject, $msgWithHtml, $msgNotHtml, array $recipients, array $attachmentPath = null )
    {
        $mail = new \PHPMailer;

        //$mail->SMTPDebug = 3;                               // Enable verbose debug output

        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = 'mail.lotfio-lakehal.com';                // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = 'noreplay@lotfio-lakehal.com';      // SMTP username
        $mail->Password = '------------';                     // SMTP password
        $mail->SMTPSecure = 'ssl';                            // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 465;                                    // TCP port to connect to

        $mail->setFrom('noreplay@lotfio-lakehal.com');

        foreach($recipients as $email) 
        { 
            $mail->addAddress($email);     // Add a recipient  // Name is optional
        }

        $mail->SingleTo = true; //will send mail to each email address individually

        $mail->addReplyTo('contact@lotfio-lakehal.com', 'Information');

        if($attachmentPath){
            foreach($attachmentPath as $file) 
            { 
                $mail->addAttachment($file);
            }
        }


        $mail->isHTML(true);                 // Set email format to HTML

        $mail->Subject = $subject;
        $mail->Body    = $msgWithHtml;
        $mail->AltBody = $msgNotHtml;

        return $mail->send();
    }
}

以下是iam如何调用此方法

use fordev\app\helpers\Mailer;

   Mailer::sendMail('Email test from mailer', '<div></div>', 'qdqsdq dqsdqsdqsd', ['lotfiolakehal@gmail.com','contact@lotfio-lakehal.com']);

2 个答案:

答案 0 :(得分:-2)

使用SMTP传输的SingleTo

SingleTo仅在“mail”和“sendmail”传输中受支持,而不在“SMTP”中。

由于您使用“SMTP”传输,因此SingleTo将无法使用。 PHPMailer类的作者应该抛出一个异常来排除像SingleTo实际上没有被尊重的情况。如果你使用SMTP传输,只需逐个循环发送每个地址(只需调用$ mail-&gt; addAddress一次,只为PHPMailer类的每个实例传递一个地址),不要触摸SingleTo属性值,保持默认值(false)。

计划在PHPMailer的未来版本中使用SingleTo

计划在PHPMailer 6.0的发行版中弃用SingleTo,并在7.0中删除。 PHPMailer的作者表示,最好控制向更高级别的多个收件人发送邮件:

  

PHPMailer不是邮件列表发件人。

来源:https://github.com/PHPMailer/PHPMailer/issues/1042

  

需要阻止使用PHP mail()函数,因为它非常难以安全使用; SMTP更快,更安全,并提供更多控制和反馈。“

您的问题

问题是“那么我能为此做些什么,我每个收件人只能发送一封电子邮件?”

只需修改sendMail的参数,并将其从“array $ recipients”更改为只有一个$ recipient,这样就可以了:

public static function sendMail($subject, $msgWithHtml, $msgNotHtml, $recipient, array $attachmentPath = null )

并替换以下代码

    foreach($recipients as $email)
    {
        $mail->addAddress($email);     // Add a recipient  // Name is optional
    }

    $mail->addAddress($recipient);

如果你不能修改sendMail函数的声明,因为它已被其他代码使用,请保留它,但将其所有代码移动到另一个函数:

public static function sendMailSingleRecipient($subject, $msgWithHtml, $msgNotHtml, $recipient, array $attachmentPath = null )

所以sendMail函数的代码就是这样:

    foreach($recipients as $email)
    {
        self::sendMailSingleRecipient($subject, $msgWithHtml, $msgNotHtml, $email, $attachmentPath)
    }

整个代码如下:

class Mailer
{
    public static function sendMailSingleRecipient($subject, $msgWithHtml, $msgNotHtml, $recipient, array $attachmentPath = null )
    {
        $mail = new \PHPMailer;

        //$mail->SMTPDebug = 3;                               // Enable verbose debug output

        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = 'mail.lotfio-lakehal.com';                // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = 'noreplay@lotfio-lakehal.com';      // SMTP username
        $mail->Password = '------------';                     // SMTP password
        $mail->SMTPSecure = 'ssl';                            // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 465;                                    // TCP port to connect to

        $mail->setFrom('noreplay@lotfio-lakehal.com');

        $mail->addAddress($recipient);     // Add a recipient  // Name is optional

        $mail->addReplyTo('contact@lotfio-lakehal.com', 'Information');

        if($attachmentPath){
            foreach($attachmentPath as $file)
            {
                $mail->addAttachment($file);
            }
        }


        $mail->isHTML(true);                 // Set email format to HTML

        $mail->Subject = $subject;
        $mail->Body    = $msgWithHtml;
        $mail->AltBody = $msgNotHtml;

        return $mail->send();
    }

    public static function sendMail($subject, $msgWithHtml, $msgNotHtml, array $recipients, array $attachmentPath = null )
    {
        foreach($recipients as $email)
        {
            self::sendMailSingleRecipient($subject, $msgWithHtml, $msgNotHtml, $email, $attachmentPath)
        }
    }

}

如果您仍然不喜欢sendMail函数为每个地址循环,但您需要使用smtp传输(不是sendmail而不是mail),请不要使用该第三方库中的\ PHPMailer类在GitHub上托管并自己实现smtp传输。无论如何,您必须通过TCP / IP连接将每封邮件分别发送到SMTP服务器,但每条邮件只有一个“收件人:”收件人,邮件不会重复。

PHP日志

如果您怀疑现有代码仍然存在,但该函数被调用了两次,只需在代码中添加日志记录功能并检查它被调用的次数。如果你能看到php错误日志,只需将error_log()添加到函数的开头,例如

error_log(print_r($recipients, true));

error_log(implode(',', $recipients));

因此,您将从日志中看到该函数实际被调用了多少次。只是不要忘记从代码中删除error_log行。如果您无权访问错误日志文件,请使用file_put_contents:

file_put_contents($filepath, implode(',', $recipients).PHP_EOL, FILE_APPEND);

在调用它之前,将$ filepath设置为您有权访问的文件的路径名。

答案 1 :(得分:-2)

我遇到了同样的问题。如果您拨打Align Center to Y两次,就会发生这种情况。

删除PHPmailer配置文件的$mail->Send()函数,并在指令末尾添加send语句:

if