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