php - 使用 PHP 发送电子邮件并使用 Google Apps 邮件作为 SMTP 速度太慢

标签 php zend-framework email gmail google-apps

目前我一直在使用 PHP 和 Zend Framework 通过 SMTP 和 GMail 的 SMTP 服务器发送电子邮件。这是因为我有一个 Google Apps 域设置来处理我的所有电子邮件,所以看起来我的电子邮件来自 [email protected] .

现在,当用户注册或执行某些操作需要我的 Web 服务器向他们发送电子邮件时,PHP 端可能需要 5 秒左右的时间来启动 SMTP 连接并向他们发送电子邮件。这个过程大概是这样的:

  1. 用户填写注册表
  2. 用户提交表单
  3. PHP 脚本将信息保存到数据库并向他们发送电子邮件(5-10 秒)
  4. 用户重定向到另一个页面

现在,当他们刚刚提交表单时,当用户坐在那里 10 秒钟,看起来像是正在加载时,我的网络服务器不会出现巨大的延迟。基本上,发送电子邮件过程是单线程的,因此服务器在完成发送电子邮件之前无法执行任何其他操作,该时间在 5-10 秒之间,如果电子邮件地址有错误,有时需要 20 秒,所以这太长了。

人们通常如何解决此类问题?

最初我尝试了一些事情:

  1. 使用另一个库,例如 SwiftMailer。还是同样的问题。我认为这是 SMTP/TLS 握手需要额外时间的原因。

  2. 将电子邮件数据存储在数据库中,然后使用 fsockopen 向另一个页面发起异步请求,然后该页面从数据库中获取电子邮件数据并发送电子邮件。同时,我的 PHP 脚本可以同步继续,用户在表单提交后将立即重定向到下一页。问题是无法确认电子邮件是否已发送或是否失败。我想我可以在数据库表上设置一个标志,但我想向用户提供他们的电子邮件已发送的即时反馈。这意味着在下一页上,10 秒后向另一个页面发出 Ajax 请求,该请求将检查数据库表上的标志以查看它是否已发送,然后在页面上向用户显示响应。如果他们输入的电子邮件错误并且无法发送电子邮件,则此方法将不起作用,因为 GMail 的响应有时需要 20 秒才能出现错误情况,然后不会设置数据库标志。

  3. 我想到的另一个选项是将电子邮件数据放入 $_SESSION 数组中,因此在提交页面并且用户位于重定向页面上后,它将向另一个页面发送 ajax 请求,该页面将得到 session 数据并发送电子邮件,然后将响应发送回用户所在的页面并告诉他们电子邮件已发送。这很有效,但我觉得这可能不是最好的方法。

所以我想知道最好的实践方法是什么? GMail 对于这种事情来说是否太慢了,因为它必须进行 TLS 握手?我是否应该将所有电子邮件排队到数据库中,每隔几分钟运行一次 CRON 作业来发送它们,然后在发送后将它们从数据库中删除?问题在于,没有向用户提供电子邮件已正确发送的即时反馈。或者我根本不需要为此烦恼?他们要么收到电子邮件,要么收不到。

最佳答案

您是否考虑过使用主机的电子邮件 smtp 服务器并手动设置发件人地址?这通常对我有用。如果这不是一个选项,我的第一 react 将是选项 3 - 这类似于当您在其网络用户界面中选择延迟发送选项时 Google 邮件所做的操作。

关于php - 使用 PHP 发送电子邮件并使用 Google Apps 邮件作为 SMTP 速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177500/

相关文章:

html - 表格内单元格中的 Outlook HTML CSS 透明背景

javascript - 从输入中获取数据并在提交按钮上单击控制台记录数据

php - CSS或PHP以数字格式添加空格

php - 使用Jquery发布单个变量

php - Zend Framework 2 返回对象作为查询结果

zend-framework - Zend 表单显示组装饰器

php - Zend框架的Remember Me功能

php - 使用 curl 检查 301 http 响应

email - Grails电子邮件确认插件假定上下文路径

python - 如何在 python 中使用 cron 和 smtp 安排在特定时间发送电子邮件?