Speed up PHPmailer with office 365 smtp


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),则可以在本地(或多或少是即时的)提交邮件,并将其配置为通过office365进行中继。

谢谢你的帮助,

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

发送邮件。

如果它在幕后花费10-12秒,它不会破坏我的客户体验。

有些进程很慢;有时候就是没办法。我不能特别评论Office365中的SMTP,但我的建议适用于许多可能很慢的进程。

到目前为止,处理这种事情的最好方法是将延迟从用户界面中移出。

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

所以你有一个DB表,其中有一堆记录,有效地形成了一个队列。

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

这个批处理程序将被设置为一个定期(例如每五分钟)运行的自动过程,以查找新请求并对其进行处理。

所有这些的最终效果是:

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

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

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