【问题标题】:Duplicate emails being sent from php mail从 php 邮件发送的重复电子邮件
【发布时间】:2014-09-08 06:14:42
【问题描述】:

我有一个看起来像这样的 cron 任务:

00 12 * * 1     /usr/bin/php    /path/to/php/script/cron_job.php
45 20 * * 1     /usr/bin/php    /path/to/php/script/cron_job.php
00 12 * * 2     /usr/bin/php    /path/to/php/script/cron_job.php
45 20 * * 2     /usr/bin/php    /path/to/php/script/cron_job.php
00 12 * * 3     /usr/bin/php    /path/to/php/script/cron_job.php
45 20 * * 3     /usr/bin/php    /path/to/php/script/cron_job.php
00 12 * * 4     /usr/bin/php    /path/to/php/script/cron_job.php
45 20 * * 4     /usr/bin/php    /path/to/php/script/cron_job.php
00 12 * * 5     /usr/bin/php    /path/to/php/script/cron_job.php
45 20 * * 5     /usr/bin/php    /path/to/php/script/cron_job.php
00 12 * * 6     /usr/bin/php    /path/to/php/script/cron_job.php
45 20 * * 6     /usr/bin/php    /path/to/php/script/cron_job.php

该文件中的 php 代码如下所示:

$employeesArray = array(
    'employee1@company.com',
    'employee2@company.com',
    'employee3@company.com'
);

if (date('A', time()) == 'AM')
{
    foreach($employeesArray as $employee)
    {
        echo $employee.' - AM';

        $mail->
        addTo($employee)->
        setFrom('email@domain.com')->
        setHtml('Dont forget to Log In.');
        $result = $sendgrid->smtp->send($mail);

        echo ' -> '.$result.'<br />';
    }
} 
else 
{
    foreach($employeesArray as $employee)
    {
        echo $employee.' - PM';

        $mail->
        addTo($employee)->
        setFrom('email@domain.com')->
        setHtml('Dont forget to Log Out.');
        $result = $sendgrid->smtp->send($mail);

        echo ' -> '.$result.'<br />';
    }
}

此脚本用于在所有员工开始工作前和轮班结束前的第一时间向所有员工发送消息;仅在周一至周五。电子邮件即将发出,但 Employee1 和 Employee2 收到了 4 份邮件,而 Employee3 收到了 7 份。当我通过导航到 Web 浏览器中的页面“cron_job.pnp”手动运行脚本时,它只向每个发送一次,所以我假设这是我的 cron 作业多次触发的问题。

提前感谢您的帮助。

【问题讨论】:

  • 旁注:您可以在第 1 天到第 6 天使用 00 12 * * 1-6 定义 00 12
  • @fedorqui 谢谢,这很方便。
  • 消息是同一消息的多个副本,还是它们实际上是单独的消息?查看消息 id 标头可能会告诉您,因为时间戳很可能是相同的。如果是前者,则更可能是您的邮件服务器而不是 cron 问题。
  • @Synchro 你是对的,我使用外部 SMTP 服务器作为中继,他们说有一个 API 建议避免他们在使用 mail() 函数时遇到的问题。现在效果很好。

标签: php cron crontab phpmailer


【解决方案1】:

您正在对循环的每次迭代进行-&gt;addTo 调用。你基本上是在每次迭代中建立一个地址数组..

iteration #1: 
   "To:" list is: (empty)
   add: user#1
   send()  (one email goes out)
iteration #2:
   "To:" list is: user #1
   add: user #2
   send() (two emails go out)
iteration #3
   "To:" list is: user #1, user #2
   add: user #3
   send() (three emails go out)
etc...

由于您已使用 PHPMailer 标记此内容,因此您需要在每个循环中使用 $mailer-&gt;ClearAddresses(),以便删除存储的 To: 名称:

foreach($user as $user) {
   $mail->AddUser($user);
   $mail->send();
   $mail->ClearAddresses();
}

【讨论】:

  • 我现在实际上正在使用 SendGrid Mailer,但同样的原则也适用。我删除了 foreach() 循环,并使用 $mail->setTos($employeesArray) 一次将所有地址添加到同一条消息中,因为 setTos() 方法接受一个数组作为参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多