如何发送大邮件?

How to send a large email?

$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++;
}

在不使用 sleep() 并且不等待页面完成加载的情况下发送大型电子邮件的最佳方法是什么?除了 cron job 你还有其他想法吗?

编辑:我有 680 个用户将收到电子邮件,但过了一会儿我收到 500 个内部服务器错误。为什么?可能是time_limit?

消息队列。

beanstalkd is a good solution.

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

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

快速发送大量电子邮件的一个好方法是使用大量工作脚本而不是 1 php 页(GiamPy 给出了一个可以完成的方法的很好的例子,我不会提及它,因为我不想成为多余的)。

一个简单的(虽然有点老套)选项是:让您在一个文件中制作 20 个 php 脚本。您可以将它们命名为 mailer1.phpmailer1.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 文件是您的控制面板,如果您将 'T' 更改为 'T' 的任何其他内容(例如 'F') , 那么所有的脚本都会终止。

这个选项的缺点是它有点老套,但优点是它可以在几分钟内开发出来。