PHP发送批量电子邮件

时间:2012-09-02 16:19:51

标签: php email batch-file

  

可能重复:
  Sending mass email using 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 +用户填充了我的测试数据库,显然这个脚本失败了,内存不足,死了......

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

非常感谢!

5 个答案:

答案 0 :(得分:2)

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

您需要将其作为具有set_time_limit(0);

的CLI应用程序运行

php /path/to/app/script.php就像这样直接在控制台中。

如果您没有SSH访问权限,请使用shell_exec运行它,如下所示:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

分批执行这些操作,这样您一次只能发送一些字段,在数据库中有一个字段,用于检查他们是否已经发送了当月的简报,并在发送简报时将其检出用户,然后你可以继续运行脚本,直到它被发送给每个人。

答案 3 :(得分: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

希望这会有所帮助: - )

答案 4 :(得分:0)

请参阅此网址: -

Sending mass email using PHP

首先,使用PHP附带的mail()函数不是最佳解决方案。它很容易被标记为垃圾邮件,您需要设置标题以确保正确发送HTML电子邮件。至于代码片段是否可行,它会,但我怀疑你会在没有specifying extra headers的情况下正确地获取HTML代码

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