如何发送大邮件?

时间:2016-05-24 09:05:12

标签: php phpmailer sleep large-data

$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? enter image description here

2 个答案:

答案 0 :(得分:2)

消息队列。

beanstalkd is a good solution.

然后,您可以使用像pheanstalk这样的SDK来处理队列及其作业。

编辑:如果您对服务器的访问权限受限(例如,如果您使用的是共享主机)消息队列即服务也是一种选择。

答案 1 :(得分:-1)

快速发送大量电子邮件的好方法是让很多工作人员脚本完成工作,而不是1个php页面( GiamPy 为其中一个提供了一个很好的例子可以做的方式,我不会提及它,因为我不想多余)。

一个简单的(虽然有点hacky)选项是:你可以在一个文件中制作20个php脚本。您可以将其命名为mailer1.phpmailer1.php,...,mailer20.php。然后,您可以创建一个名为mail的文件夹,并将两个文件放在其中:

mail/config.txt

mail/email.txt

mail/config.txt内,您将包含以下几行文字:

T
15

其中第一行的TTRUE,这意味着您希望邮件程序以最快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;例如),然后所有脚本都将终止。

这个选项的缺点是它有点笨拙,但好处是可以在几分钟内开发出来。