PHP群发邮件与AJAX异步

时间:2014-05-14 15:19:03

标签: php ajax email asynchronous phpmailer

好的,基本上我需要使用HostGator从常规主机发送38,400封电子邮件。我目前正在使用PHPMailer工作正常。我所做的是,客户只需填写一封电子邮件模板,然后保存所有电子邮件内容,这样我就可以更轻松地处理电子邮件内容。

当客户端想要发送电子邮件时,我异步调用php代码发送电子邮件。

            $.ajaxSetup({cache: false});
            $.ajax({
                async:true,
                type: "POST",
                dataType: "html",
                contentType: "application/x-www-form-urlencoded",
                url:"operaciones.php",
                data:"idcorreo1="+idCorreo+"&operaciones=enviarPlantilla4",
                success:function(data){
                    console.log(data);
            },
                cache:false
            });

这是我的AJAX代码,基本上调用php进程。现在我的php代码是被调用的代码:

                 if(isset($_REQUEST["idcorreo1"])){
                        $boletin = new Boletin();
                        $boletinesActivos = array();
                        $numBoletinesActivos = $boletin  -> contarBoletinesActivos();


                        $progresoMailing = new ProgresoMailing();
                        $idCorreo = $_REQUEST["idcorreo1"];
                        $tipoCorreo = 1;//correo1, tmpcorreo1;
                        $fechaYHoraInicio = date("Y-m-d h:i:sa");

                        $progresoMailing -> idCorreo = $idCorreo;
                        $progresoMailing -> tipoCorreo = $tipoCorreo;
                        $progresoMailing -> fechaYHoraInicio = $fechaYHoraInicio;
                        $progresoMailing -> numCorreos = $numBoletinesActivos;

                        $progresoMailing -> insertarProgresoMailing();



                        $i = 0;
                        while($i < $numBoletinesActivos){
                            $boletinesActivos = $boletin -> obtenerBoletinesConLimite($i);
                            foreach ($boletinesActivos as $boletinActivo) {
                                    $tempcorreo1= new tempcorreo4($idCorreo,0,$boletinActivo -> idBoletin);
                                    $tempcorreo1->enviar();
                                    $progresoMailing -> agregarUnEnviado();
                                    usleep(200000);
                            }
                            usleep(200000);
                            $i += 100;
                        }

                        $fechaYHoraFinal = date("Y-m-d h:i:sa");
                        $progresoMailing -> fechaYHoraFinal = $fechaYHoraFinal;
                        $progresoMailing -> status = 1;
                        $progresoMailing -> actualizarFechaYHoraFinal();
                        $progresoMailing -> actualizarStatus();

                    }

所以这个代码它的作用是它抓住了数据库中的所有已注册的电子邮件(BOLETIN),因为我不想在内存中加载38,400个对象,所以我限制查询给每100个结果查询。在发送电子邮件(enviar)后,我让这个过程睡眠.2秒,这样主持人就不会发疯。我处理了一个计数器,告诉我发送的电子邮件数量,这样我就可以通知我的客户已经发送了电子邮件,并且我显示了一个进度条,这就是为什么我需要保存电子邮件的数量发送。因此,经过一个小时左右,php进程停止了大约11,000封电子邮件被发送。我没有在erro_log文件中发现任何故障或错误,为什么进程停止了?是操作系统吗?我感谢您对此问题的任何评论,提示或解决方案。谢谢!!

3 个答案:

答案 0 :(得分:0)

我怀疑是max_execution_time

How to increase maximum execution time in php

也可能是主持人限制这种行为。

答案 1 :(得分:0)

我能想到的最常见错误是您的脚本达到了最长执行时间,或者如果浏览器连接丢失,则脚本无法继续工作。

你最好的选择是没有一次执行发送所有邮件,但是每5分钟运行一次脚本并发送1500(如果你睡觉则每秒5个邮件。每次5秒,时间5分钟)。跟踪已发送的内容,以便脚本重新执行将从中断处继续。

答案 2 :(得分:0)

大多数主机(我认为我使用的所有主机)都限制了允许每小时或每天发送一个帐户的电子邮件数量,可能两者都有。

如果你看一下hostgator电子邮件政策http://www.hostgator.com/mailpolicy,它明确指出有限制 - 我很惊讶你实际上已经设法获得了11,000个发送!这假设它们实际上已被发送,并且这不仅仅是发送功能工作的计数器(要求发送某些内容并且它实际上有所不同)。他们都可以以未交付的方式回来。

他们推荐使用限制的PHPlist,以确保您保持在允许的限制之下,并且我过去曾使用它发送大量(100k +)的电子邮件,但除非您支付托管费用以允许您发送大量的电子邮件电子邮件如果您尝试快速发送许多内容,我可以看到您遇到问题。