使用 office 365 smtp 加速 PHPmailer

Speed up PHPmailer with office 365 smtp

我正在使用 PHPMailer 通过 office365 帐户从我的服务器发送邮件。

然而,发送电子邮件似乎需要大约 10-12 秒,这让客户不耐烦,他们再次点击发送按钮。

这是我的代码

$mail->IsSMTP();                                // enable SMTP
$mail->SMTPAuth     = true;                     // turn on SMTP authentication
$mail->SMTPSecure   = "tls";                    // Secure type = tls
$mail->Host         = "smtp.office365.com";     // Hostname
$mail->Username     = "user@domain.co.uk";      // Username
$mail->Password     = "password";            // Password
$mail->Port         = 587;                      // Office 365 Port

$mail->IsHTML(true);
$mail->setFrom('online@domain.co.uk','Website Email');
$mail->AddReplyTo("sales@domain.co.uk","Sales");
$mail->AddAddress($value);
$mail->Subject($subject);
$mail->Body($body);
if(!$mail->Send()) {
     $string = date('Y-m-d').','.date('H:i:s').','.$mail->ErrorInfo;
     $this->writetolog('mailLog',$string);
 } else {
      echo "Message sent!";
 }

邮件发送正确,但发送时间太长了。

这是常见的事情还是我可以做些什么来加快这个过程。

在我使用 smtp 并从服务器发送之前,它是即时的,但客户有时会将邮件放入垃圾箱等,他们看起来并不专业。

非常感谢。

你的代码没问题。 SMTP 只是不太适合交互式使用——它是为存储转发而设计的——而且它通常很慢。 Office365 还以速度慢和不可靠而著称。如果您 运行 您自己的邮件服务器(例如 postfix),您可以在本地提交(或多或少是即时的)并将其配置为 relay through office365.

感谢您的帮助,

为了解决这个问题,我决定将电子邮件存储到数据库中。 然后我每 2 分钟 运行 一个 cron 作业来清除邮件队列并使用 exchange smtp

发送

即使在幕后花 10-12 秒也不会破坏我的客户体验。

有些进程很慢;有时根本没有办法解决它。我不能专门针对 Office365 中的 SMTP 发表评论,但我的建议适用于许多可能很慢的进程。

到目前为止,处理此类问题的最佳方法是将延迟移出用户界面。

做到这一点的方法就是在用户要求您时不发送电子邮件。相反,只需在数据库中创建一条记录,指出已发出发送电子邮件的请求。

所以你有一个数据库 table,其中有一堆有效地形成队列的记录。

然后您编写一个单独的批处理程序来读取队列,执行队列中请求的作业(即发送电子邮件),并将相关记录标记为已完成。

此批处理程序将设置为定期(例如,每五分钟)运行一次的自动化进程,以查找新请求并对其执行操作。

所有这一切的净效果是:

  • 您的用户界面永远不会等待电子邮件发送;它会立即响应。
  • 电子邮件可能不会立即发送,但绝不会延迟超过五分钟(或您的批处理作业的间隔时间)。老实说,谁在乎电子邮件延迟五分钟?

您也可以将此技术用于其他耗时的任务;您的队列不必只包含电子邮件请求。

这是一个很常见的技术;事实上,围绕这种方式构建了整个框架和库。如上所述设置一个基本系统相当容易,但更复杂的排队系统可能会非常强大。