如何在后台使用PHPMailer发送电子邮件?

时间:2014-04-21 05:42:53

标签: php email background phpmailer background-process

PHPMailers在从Gmail帐户发送电子邮件方面做得很好。但这需要相当多的时间,在电子邮件发送之前,页面不会显示响应。有什么方法可以在后台发送电子邮件,以便为用户提供更好的用户体验?谢谢!

5 个答案:

答案 0 :(得分:10)

使用电子邮件队列 php exec()是最好的方法之一。

它会在需要时触发(避免使用CRON),它会很快,因为它被称为后台立即,并且是立即的。

<强> 1。电子邮件队列。 使用插入来获取表格MySQL中的所有字段,例如:

$queryIN="INSERT INTO email_queue (date,subject,body,destination,idle) values (...)";
mysql_query($queryIN);

这一点非常重要,因为您需要一个独立的后台流程,因此注册和审核所有外发电子邮件也是一个好主意。

<强> 2。 PHP exec()。在MySQL中插入后可以调用外部执行:

exec("wget -qO- http://example.com/index.php?process_email_queue=1 &> /dev/null &");
  • 请注意,需要wget -q0-&> ... /dev/null &中的选项来抑制输出并将其作为后台进程调用。

第3。相同的脚本文件index.php或其他用于处理队列调用的内容:

这样,它会调用我们的index.php(你可以使用其他名称文件),并处理传出:

if ($_GET['process_email_queue']==1) { ...code for sending idle emails queue...  }

也许你必须触及exec()的一些php.ini选项,这不是什么大问题。

一切正常运行后,您将提供更好的网络导航和电子邮件处理,以实现快速响应和零等待。

在某些情况下,您将从等待直接邮件2.60秒传递到queue-exec-background 0.024秒,速度提高了11倍。

答案 1 :(得分:0)

您可以使用AJAX请求将数据发布到PHP脚本,然后PHP脚本将发送电子邮件。

答案 2 :(得分:0)

如果您有兴趣通过异步PHP发送电子邮件,可以查看此答案。 https://stackoverflow.com/a/22627769/829533

<?php
class AsyncEmail extends Thread {

    public function __construct($arg){
        $this->arg = $arg;
    }

    public function run() {
        /** Add your email sending code here. **/
    }
}

// and call this following lines in loop
$aEmail = new AsyncEmail( $arg );
var_dump($aEmail->start());
?>

正在使用php PECL pthreads库的Thread

请注意为您的Apache环境设置PECL是最棘手的部分

另外在同一篇文章中,人们建议为此类要求设置玉米作业,但这完全取决于您的要求。你可以

  • 创建一个新表来安排电子邮件。
  • 编写一个php脚本,使用新创建的表格中的详细信息发送电子邮件
  • 设置玉米作业以一定间隔运行此脚本

答案 3 :(得分:0)

您可以使用exec告诉PHP CLI解释器在后台运行您的脚本。

如果你在linux上:

exec("/path/to/php /path/to/your/mailer/script \"arg1\" \"arg2\" \"arg3\" \"arg4\"  > /dev/null 2> /dev/null &");

如果你在Windows上:

 pclose(popen("start /B /path/to/php /path/to/php/script \"arg1\" \"arg2\" \"arg3\" \"arg4\"","r"));

这要求您的服务器安装了PHP的CLI解释器,并要求您知道PHP二进制文件的路径(如果您不知道,请询问您的主机)。您还需要知道PHP脚本的绝对路径,您可以使用get_cwd()找到它。

答案 4 :(得分:0)

有许多后台处理软件,如Beanstalkd,GearMan等......

我建议使用beanstalkd,因为它重量轻且简单。轻松创建工作并传递到队列(按照他们的条件管)。

另外一名工人要求继续关注Tube并处理任何工作。

给你一些可能对你有帮助的链接,

  1. Beanstalkd
  2. Gearman
  3. 实际上还有更多,但我现在不记得名字。

    此致