我正在为1k用户制作批量电子邮件脚本,我想发送电子邮件,但我的脚本给了我错误,超时。
如何处理页面超时。任何关于后端运行此脚本的建议。
如果用户单击“发送”按钮,则在用户关闭此页面但脚本正常工作时运行此脚本后端。
$Email_ID="";
$queryUser=mysql_query("SELECT `email` From `users`",$conn);
while($User=mysql_fetch_array($queryUser))
{
$to = $User["email"];
$Email_ID=$User["email"];
$from = 'donotreply@abc.com';
$from_name = 'Test bulk email';
$senderMail="donotreply@abc.com";
$senderName="abc";
$message=$_POST["message"];
$subject = $_POST["subject"];
$html_content = $_POST["message"];
$from = $senderName." <".$senderMail.">";
$headers = "From: $from";
$headers = "CC: jignesh.tplabs@gmail.com";
$headers = "BCC: jignesh.tplabs@gmail.com";
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
$message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";
$upload_file="";
if(isset($_SESSION["uniqid"]))
{
$query=mysql_query("SELECT * From `bulk_email_attchment` where `unique_id`='".$_SESSION["uniqid"]."' ",$conn);
while($row=mysql_fetch_array($query))
{
$files = "Attchment/".$row["name"];
$message .= "--{$mime_boundary}\n";
$fp = @fopen($files,"rb");
$data = @fread($fp,filesize($files));
@fclose($fp);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: application/octet-stream; name=\"".basename($files)."\"\n" .
"Content-Description: ".basename($files)."\n" .
"Content-Disposition: attachment;\n" . " filename=\"".basename($files)."\"; size=".filesize($files).";\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
}
}
$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $senderMail;
//send email
$mail = mail($to, $subject, $message, $headers, $returnpath);
}
}
答案 0 :(得分:0)
您可以设置cron脚本。所以你的电子邮件脚本由cron处理并在后台运行。
答案 1 :(得分:0)
如果您想在用户中止时继续使用脚本,则可以使用ignore_user_abort()
。
// Ignore if a user aborts
ignore_user_abort(true);
set_time_limit(0);
// Send your emails here
有关更多信息,请查看PHP ignore_user_abort()
(文档)[http://php.net/manual/fr/function.ignore-user-abort.php]
将所有提交的表单数据插入数据库。然后,您可以创建一个cron作业,检查是否有新的电子邮件作业要提交和提交。通过这种方式,用户无需等待,也不会出现关闭浏览器的问题。
答案 2 :(得分:0)
正确的方法:创建一个带有命名管道的php队列,它连接到另一个PHP脚本,每次调用它时都会发送电子邮件。如果你只是在盯着php,它需要一段时间才能正确编码。
中等但不理想的方式:设置一个Cron作业来调用你的脚本(每次调用时会发送20封左右的电子邮件。如果你使用像Godaddy这样的服务,只需谷歌:“ CronJob godaddy设置“
Hacky Way:让页面中的脚本重定向到自身,并使用查询字符串更新发送的电子邮件数量:
发送20封电子邮件后,请使用以下代码:
$count = 20;
header('Location http://www.example.com/index.php?count='.$count);
我不推荐使用The Hacky Way,因为作为程序员,我们应该尝试遵循最佳实践,但我个人不能阻止你:)