$i = 1;
foreach ($recipients as $email => $name) {
$mail->ClearAddresses();
$mail->AddBCC($email, $name);
if (!$mail->send()) {
$send = 0;
} else {
$send = 1;
}
$query = "INSERT INTO `newsletter_send`(`email`, `id_newsletter`, `date`, `send`) VALUES ('$email',$id_newsletter, NOW(),$send) ";
$stmt = $link->prepare($query) or die('error');
$stmt->execute();
$mail->clearAllRecipients();
if (($i % 100) == 0) {
sleep(60);
}
$i++;
}
在没有睡眠的情况下发送大型电子邮件的最佳方式是什么()而不等待页面完成加载?除了cron工作,你有其他想法吗?
编辑:我有680位用户将收到该电子邮件,但过了一段时间我得到500内部服务器错误..为什么?它可能是time_limit?答案 0 :(得分:2)
消息队列。
beanstalkd is a good solution.
然后,您可以使用像pheanstalk这样的SDK来处理队列及其作业。
编辑:如果您对服务器的访问权限受限(例如,如果您使用的是共享主机)消息队列即服务也是一种选择。
答案 1 :(得分:-1)
快速发送大量电子邮件的好方法是让很多工作人员脚本完成工作,而不是1个php页面( GiamPy 为其中一个提供了一个很好的例子可以做的方式,我不会提及它,因为我不想多余)。
一个简单的(虽然有点hacky)选项是:你可以在一个文件中制作20个php脚本。您可以将其命名为mailer1.php
,mailer1.php
,...,mailer20.php
。然后,您可以创建一个名为mail
的文件夹,并将两个文件放在其中:
mail/config.txt
和
mail/email.txt
在mail/config.txt
内,您将包含以下几行文字:
T
15
其中第一行的T
为TRUE
,这意味着您希望邮件程序以最快15秒的间隔发送邮件。显然,您可以将间隔时间更改为您喜欢的任何时间。
在mail/email.txt
中,您将拥有要发送的完整电子邮件
完成所有操作后,您可以制作邮件文件。您可以先创建1,编写代码,然后将其复制粘贴19次以共有20个脚本。里面的代码看起来像这样:
<?php
$pathconfig = "mail/config.txt";
$pathemail = "mail/email.txt";
$email = file_get_contents($pathemail);//now you have the email saved
$filehandleconfig = fopen($pathconfig, "r");
$bool = trim(fgets($pathconfig));
$sleeptime = (integer) trim(fgets($pathconfig));
fclose($filehandleconfig);
while ($bool === 'T')
{
//... code that sends the email
//recheck if 'T' is still 'T':
$filehandleconfig = fopen($pathconfig, "r");
$bool = trim(fgets($pathconfig));
fclose($filehandleconfig);
sleep($sleeptime);
}
?>
所以以前的代码基本上做的是提取需要在开始时发送的电子邮件,并提取发送电子邮件后它将睡觉的时间,以及它是否应该继续发送电子邮件。
这意味着mail/config.txt
文件是您的控制面板,如果您更改了&#39; T&#39;做其他事情&#39; T&#39; (比如&#39; F&#39;例如),然后所有脚本都将终止。
这个选项的缺点是它有点笨拙,但好处是可以在几分钟内开发出来。