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

11

PHPMailer在从Gmail帐户发送电子邮件方面表现出色。但是它需要相当长的时间,直到邮件被发送后页面才会显示响应。有什么办法可以在后台发送电子邮件,以便我可以为用户提供更好的用户体验?谢谢!

5个回答

13

使用电子邮件队列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...  }

也许你需要调整一些php.ini选项来使用exec(),这并不是什么大问题。

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

在某些情况下,您将从等待直接电子邮件2.60秒变为队列执行后台任务0.024秒,这意味着速度提高了11倍。


非常好的解决方案,唯一的“缺点”或需要考虑的是,如果您有大量请求发送电子邮件的流量,那么将在内存中保留大量脚本。对于这种情况,值得考虑每5分钟使用cron运行发送电子邮件的脚本,并让它处理尚未处理的所有表项。但是,如果您的流量每小时只有几封电子邮件,那么这是完美的! - Emil Borconi
请确保在真实的服务器-Linux上进行测试。因为,如果您要在像Mac这样的本地机器上使用MAMP服务器进行测试,它是无法正常工作的。 - ekashking

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的ThreadPECL pthreads库。

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

此外,在同一篇文章中,人们建议为这些要求设置corn jobs,但这完全取决于您的要求。您可以:

  • 创建一个新表来安排电子邮件。
  • 编写一个PHP脚本,使用新创建的表中的详细信息发送电子邮件。
  • 设置一个corn job以在某个间隔运行此脚本。

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

你不能这样做,即使你使用ajax,它也需要php邮件程序来发送电子邮件,然后才能返回到ajax/之前的页面。 - RJ Anoop
如果有一个用于开始发送电子邮件的Web界面,那么我认为AJAX没有问题。如果没有Web界面,那么你说得对。我假设这是针对用户界面的Web应用程序。 - Shakeel

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()来查找。

-1

有许多像Beanstalkd、GearMan等后台处理软件...

我建议使用beanstalkd,因为它非常轻量级和简单。易于创建作业并传递到队列(在他们的术语中称为Tube)。

需要一个额外的工作程序,继续关注Tube并处理任何作业。

给你一些可能有用的链接:

  1. Beanstalkd
  2. Gearman

实际上还有很多,但我现在记不起名字了。

问候


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接