从php mail发送的重复电子邮件
我有一个cron任务,看起来像:从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/
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()方法接受数组作为参数。