4

可能重复:
使用 PHP 发送大量电子邮件

我有一个 PHP 脚本,可以向我的数据库中的所有用户发送一封单独​​的电子邮件,例如每月/每周的时事通讯。

我使用的代码如下:

$subject = $_POST['subject'];
$message = $_POST['message'];

// Get all the mailing list subscribers.
$query = $db->prepare("SELECT * FROM maildb");
$query->execute();

// Loop through all susbcribers, and send and individual email.
foreach ($query as $row) {

    // Setting maximum time limit to infinite.
    set_time_limit(0);

    $newMessage = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        </head>
        <body>';

    // Search for the [unsubscribe] tag and replace it with a URL for the user to unsubscribe
    $newMessage .= str_replace("[unsubscribe]", "<a href='".BASE_URL."unsubscribe/".$row['hash']."/".$row['email']."'>unsubscribe</a>", $message);

    $newMessage .= '</body></html>';

    $to = $row['email'];

    // Establish content headers
    $headers = "From: info@domain.com"."\n";
    $headers .= "Reply-To: bounce@domain.com"."\n";
    $headers .= "X-Mailer: PHP v.". phpversion()."\n";
    $headers .= "MIME-Version: 1.0"."\n";  
    $headers .= "Content-Type: text/html; charset=iso-8859-1"."\n";
    $headers .= "Content-Transfer-Encoding: 8bit;";

    mail($to, $subject, $newMessage, $headers); // Send email to each individual user

}

这段代码与一个非常小的数据库完美配合......我最近用 200k + 用户填充了我的测试数据库,显然这个脚本失败了,内存不足,然后死了......

我知道这是发送这么多电子邮件的不好方法,这就是为什么我想问你更有效的方法来做到这一点!

非常感谢!

4

5 回答 5

2

您遇到的超时是因为 Apache 和 PHP 执行限制。

您需要将其作为 CLI 应用程序运行set_time_limit(0);

php/path/to/app/script.php类似这样的东西直接在控制台中。

如果您没有 SSH 访问权限,请shell_exec像这样运行它:

shell_exec("php /path/to/app/script.php > /dev/null 2>/dev/null &");

这将确保调用它的脚本在完成之前不会挂起。

于 2012-09-02T16:23:34.437 回答
1

您可以将 Cron 调度程序设置为每分钟或某个时间间隔运行。每次执行脚本都会从数据库中挑选几条记录并将它们从数据库中删除或设置为非活动状态。将邮件发送到一小块并让脚本死掉。另一个 cron 调用将选择很少的其他记录并死掉。您也可以利用 exec()。

于 2012-09-02T16:24:46.750 回答
1

分批进行,这样你一次只发送几个,在你的数据库中有一个字段来检查他们是否已经发送了当月的时事通讯,并在时事通讯发送给该用户时检查它,然后您可以继续运行脚本,直到它被发送给每个人。

于 2012-09-02T16:26:48.243 回答
0

我宁愿implode用户进入一个变量并一次性发送电子邮件

$to_array = array();

foreach ($query as $row) {

  $to_array[] = $row['email'];

}

$to = implode(', ', $to_array);

//do your email stuff here

 mail($to, $subject, $newMessage, $headers); // Send email to all users at once

希望这可以帮助 :-)

于 2012-09-02T16:28:49.573 回答
0

看到这个网址:--

使用 PHP 发送大量电子邮件

首先,使用 PHP 自带的 mail() 函数并不是最佳解决方案。它很容易被标记为垃圾邮件,您需要设置标题以确保您正确发送 HTML 电子邮件。至于代码片段是否会起作用,它会起作用,但我怀疑你是否会在不指定额外标题的情况下正确获得其中的 HTML 代码

我建议您看一下SwiftMailer,它支持 HTML,支持不同的 mime 类型和 SMTP 身份验证(不太可能将您的邮件标记为垃圾邮件)。

于 2012-09-02T16:29:02.987 回答