从php邮件发送重复的电子邮件

时间:2014-07-17 11:36:18

标签: php cron crontab phpmailer

我有一个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份副本。当我通过导航到页面&#34; cron_job.pnp&#34;手动运行脚本时在网络浏览器中,它只发送一次,所以我假设我的cron作业多次触发是一个问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您正在循环的每次迭代中进行->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->ClearAddresses(),以便删除存储的To:名称:

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