如何使用PHP制作批量电子邮件脚本

时间:2016-05-13 06:55:17

标签: php email

我正在为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); 

    }
}

3 个答案:

答案 0 :(得分:0)

您可以设置cron脚本。所以你的电子邮件脚本由cron处理并在后台运行。

答案 1 :(得分:0)

选项1

如果您想在用户中止时继续使用脚本,则可以使用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]

选项2

将所有提交的表单数据插入数据库。然后,您可以创建一个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,因为作为程序员,我们应该尝试遵循最佳实践,但我个人不能阻止你:)