我有一个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 +用户填充了我的测试数据库,显然这个脚本失败了,内存不足,死了......
我知道这是发送这么多电子邮件的不好方法,这就是为什么我想问你更有效的方法来做到这一点!
非常感谢!
答案 0 :(得分:2)
您遇到的超时是因为Apache和PHP执行限制。
您需要将其作为具有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 &");
这将确保调用它的脚本在完成之前不会挂起。
答案 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)
请参阅此网址: -
首先,使用PHP附带的mail()函数不是最佳解决方案。它很容易被标记为垃圾邮件,您需要设置标题以确保正确发送HTML电子邮件。至于代码片段是否可行,它会,但我怀疑你会在没有specifying extra headers的情况下正确地获取HTML代码
我建议你看一下SwiftMailer,它有HTML支持,支持不同的mime类型和SMTP身份验证(不太可能将你的邮件标记为垃圾邮件)。