我正在使用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并且只是从服务器发送之前,它是即时的,但客户有时会将邮件发送到垃圾箱等,而且看起来并不专业。
非常感谢。
答案 0 :(得分:2)
你的代码很好。 SMTP对于交互式使用来说并不是很好 - 它是专为存储转发而设计的 - 而且它通常很慢。 Office365在缓慢和不可靠方面也有一些声誉。如果您运行自己的邮件服务器(例如postfix),您可以在本地提交(或多或少是即时),并将其配置为relay through office365。
答案 1 :(得分:2)
有些过程很慢;有时候只是没有办法解决它。我无法在Office365中专门评论SMTP,但我的建议适用于许多可能很慢的流程。
到目前为止,处理此类事情的最佳方法是将延迟移出用户界面。
这样做的方法就是在用户要求时不发送电子邮件。相反,只需在数据库中创建一条记录,注意已发出请求以发送电子邮件。
所以你有一个数据库表,其中包含一堆有效形成队列的记录。
然后编写一个单独的批处理程序,该程序读取队列,执行队列中请求的作业(即发送电子邮件),并将相关记录标记为已完成。
此批处理程序将设置为定期运行(例如每五分钟一次)的自动化流程,以查找新请求并对其进行操作。
所有这一切的净效果是:
您还可以将此技术用于其他耗时的任务;您的队列不必包含电子邮件请求。
这是一种非常常见的技术;事实上,有一整套框架和库以这种方式做事。如上所述设置基本系统相当容易,但更复杂的排队系统可能非常强大。
答案 2 :(得分:1)
感谢您的帮助,
为了克服这个问题,我决定将电子邮件存储到数据库中。 每隔2分钟我就会运行一个cron作业来清除邮件队列并使用exchange smtp发送
如果幕后需要10-12秒,它并没有破坏我的客户体验。