gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:20:53 24 4
gpt4 key购买 nike

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();
}
}

下面是我如何调用这个方法

use fordev\app\helpers\Mailer;

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

最佳答案

使用 SMTP 传输的 SingleTo

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

由于您使用“SMTP”传输,SingleTo 将不起作用。 PHPMailer 类的作者应该抛出一个异常来排除类似 SingleTo 实际上不被接受的情况。如果您使用 SMTP 传输,只需一个接一个地循环发送每个地址(只需调用一次 $mail->addAddress 为 PHPMailer 类的每个实例传递一个地址),并且不要触摸 SingleTo属性值,保持默认(false)。

PHPMailer future 版本中的 SingleTo 计划

SingleTo 计划在 PHPMailer 6.0 版本中弃用,并在 7.0 中删除。 PHPMailer 的作者解释说,最好在更高级别控制发送给多个收件人:

PHPMailer isn't a mailing list sender.

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

Use of the PHP mail() function needs to be discouraged because it's extremely difficult to use safely; SMTP is faster, safer, and gives more control and feedback."

你的问题

问题是“那么我该怎么做才能让每个收件人只发送一封电子邮件呢?”

只需修改 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 而不是邮件),请不要使用第三方库中的\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 设置为您有权访问的文件的路径名。

关于PHP Mailer 正在发送重复的电子邮件(一次发送两封电子邮件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43902916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com