是否可以使用 PHP 异步发送邮件,同时向用户实时提供投递反馈?
我最近为我们公司的内部网编写了一个小应用程序,用于向客户发送格式化的电子邮件。界面非常干净,只需要输入作业编号,然后就可以构建并发送邮件。邮件在构建时会从另一台服务器获取大量附件,一切都是自动化的。使用的库是PHPMailer .
有没有一种方法,可以使用其他技术,但仍然使用 PHP 作为主要语言,来显示邮件发送的进度?我已经编写了强大的错误检查代码来检查邮件是否确实已发送等,但我缺少一种为用户提供通过进度条等实际将邮件传递到服务器的视觉线索的方法。
使用 PHP 和 Ajax 之类的东西可以吗?您如何确定邮件在运输过程中的进度?
最佳答案
我不熟悉 PHPMailer,但您当然需要该库的支持才能查询正在发送的电子邮件的状态。
鉴于 PHP 没有线程,我建议使用一个用于交付的数据库队列,并从主站点(或通过 cron)触发一个外部 PHP 进程,该进程在侧面处理交付,并在数据库上进行标记每次交付的当前状态: NOT_PROCESSED、IN_PROGRESS、CONNECTING、CONNECTED、SENDING_DATA、ACCEPTED、FAILURE_X 。您可以通过 Ajax 查询数据库以获取每次交付的状态。
如果 PHPMailer 内部使用标准 PHP mail() 函数,该函数在您的计算机中使用中继 SMTP 服务器,则您无法获得那么多有关状态的信息(如果您自己创建套接字,则将获得这些信息),您可以只三个主要状态 NOT_PROCESSED、IN_PROGRESS、FAILURE_X。
(FAILURE_X确实代表了很多状态,因为它解释了失败的原因)。
使用 mail() 的最后一个考虑因素是,您将能够知道的状态只是来自本地 SMTP 中继的状态,它总是会很快接受,并且您将无法判断是否邮件确实被传送到了发送服务器(至少不需要连接到它或读取 mailq,这些都是令人讨厌的事情)。
免责声明
鉴于即使在您真正了解状态的良好情况下,您也无法知道另一端是否已收到电子邮件,也不知道需要多长时间,我不确定这种结构有多大用处是。编程当然很有趣,但我怀疑它是否真的有用,也许只是一些带有标准电子邮件免责声明的养眼之物(电子邮件可能会在传输过程中丢失,如果失败重试,请在重试之前留出一段时间)就足够了.
关于php - 是否可以使用 PHP 异步发送邮件,同时向用户提供投递反馈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1308583/