使用 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,其中有一堆有效地形成队列的记录。
然后您编写一个单独的批处理程序来读取队列,执行队列中请求的作业(即发送电子邮件),并将相关记录标记为已完成。
此批处理程序将设置为定期(例如,每五分钟)运行一次的自动化进程,以查找新请求并对其执行操作。
所有这一切的净效果是:
- 您的用户界面永远不会等待电子邮件发送;它会立即响应。
- 电子邮件可能不会立即发送,但绝不会延迟超过五分钟(或您的批处理作业的间隔时间)。老实说,谁在乎电子邮件延迟五分钟?
您也可以将此技术用于其他耗时的任务;您的队列不必只包含电子邮件请求。
这是一个很常见的技术;事实上,围绕这种方式构建了整个框架和库。如上所述设置一个基本系统相当容易,但更复杂的排队系统可能会非常强大。
我正在使用 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,其中有一堆有效地形成队列的记录。
然后您编写一个单独的批处理程序来读取队列,执行队列中请求的作业(即发送电子邮件),并将相关记录标记为已完成。
此批处理程序将设置为定期(例如,每五分钟)运行一次的自动化进程,以查找新请求并对其执行操作。
所有这一切的净效果是:
- 您的用户界面永远不会等待电子邮件发送;它会立即响应。
- 电子邮件可能不会立即发送,但绝不会延迟超过五分钟(或您的批处理作业的间隔时间)。老实说,谁在乎电子邮件延迟五分钟?
您也可以将此技术用于其他耗时的任务;您的队列不必只包含电子邮件请求。
这是一个很常见的技术;事实上,围绕这种方式构建了整个框架和库。如上所述设置一个基本系统相当容易,但更复杂的排队系统可能会非常强大。