Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从php mail发送的重复电子邮件_Php_Cron_Crontab_Phpmailer - Fatal编程技术网

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

从php mail发送的重复电子邮件,php,cron,crontab,phpmailer,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/

我有一个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 />';
    }
}
$employeesArray=数组(
'employee1@company.com',
'employee2@company.com',
'employee3@company.com'
);
如果(日期('A',时间())=='AM')
{
foreach($employeesArray作为$employee)
{
echo$employee.'-AM';
$mail->
添加到($employee)->
设置自('email@domain.com')->
setHtml('别忘了登录');
$result=$sendgrid->smtp->send($mail);
回显“->”。$result.“
”; } } 其他的 { foreach($employeesArray作为$employee) { echo$employee.“-PM”; $mail-> 添加到($employee)-> 设置自('email@domain.com')-> setHtml('别忘了注销'); $result=$sendgrid->smtp->send($mail); 回显“->”。$result.“
”; } }
该脚本用于在所有员工上班前和下班前的第一件事向他们发送消息;只在周一到周五。电子邮件正在发送,但员工1和员工2收到了4份邮件副本,员工3收到了7份。当我在web浏览器中导航到“cron_job.pnp”页面手动运行脚本时,它只向每个页面发送一次,因此我假设我的cron job多次触发是一个问题


提前感谢您的帮助。

在循环的每次迭代中,您都在执行一个
->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()
,以便删除存储的
收件人:
名称:

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

旁注:您可以使用
0012**1-6
在第1天到第6天定义
0012
。@fedorqui谢谢,这很方便。这些消息是同一消息的多个副本,还是实际上是单独的消息?查看消息id头可能会告诉您,因为时间戳很可能是相同的。如果是前者,则更可能是邮件服务器的问题,而不是cron的问题。@Synchro您是对的,我使用外部SMTP服务器作为中继,他们说建议使用一个API来避免mail()函数出现问题。现在效果很好。我现在实际上正在使用SendGrid邮件,但同样的原则也适用。我删除了foreach()循环,并使用$mail->setTos($employeesArray)将所有地址一次添加到同一封邮件中,因为setTos()方法接受数组作为参数。