是否可以使用 PHP 异步发送电子邮件,同时向用户提供有关交付的反馈?

Posted

技术标签:

【中文标题】是否可以使用 PHP 异步发送电子邮件,同时向用户提供有关交付的反馈?【英文标题】:Is it possible to send mail asycronously using PHP while giving user feedback on delivery? 【发布时间】:2010-11-21 11:16:21 【问题描述】:

是否可以使用 php 异步发送邮件,同时提供实时用户反馈?

我最近为我们公司的 Intranet 编写了一个小应用程序,用于向客户发送格式化的电子邮件。界面非常干净,只需要输入一个工作编号,然后构建并发送邮件。邮件在构建时会从另一台服务器获取许多附件,并且一切都是自动化的。使用的库是PHPMailer。

有没有办法,可能使用其他技术,但仍使用 PHP 作为主要语言,来显示正在发送的邮件的进度?我已经编写了强大的错误检查来检查邮件是否实际发送等,但我错过了一种通过进度条等为用户提供实际将邮件传递到服务器的视觉线索的方法。

这可能使用 PHP 和 Ajax 之类的东西吗?您将如何确定在途邮件的进度?

【问题讨论】:

Campaign Monitor 提供了大量关于您可以使用电子邮件做什么和不能做什么的重要信息。我建议查看他们的博客和网站以获取监控和指标信息 【参考方案1】:

我不熟悉 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,这是令人讨厌的事情)。

免责声明

考虑到即使在您真正知道状态的好情况下,您也无法知道另一端是否已收到电子邮件,也不知道需要多长时间,我不确定这样的结构会有多大用处是。编程肯定会很有趣,但我怀疑它是否真的有用,也许只是一些带有标准电子邮件免责声明的眼睛糖果(电子邮件可能会在传输过程中丢失,如果它失败重试,请在重试之前离开)就足够了.

【讨论】:

【参考方案2】:

我认为这里最好的选择是估计时间。您可以测试发送一些 10MB 邮件需要多少时间,以了解您的 SMTP 服务器的接收速度。有了这些信息,您就可以根据电子邮件的大小估算任何电子邮件的传输时间,并以此为基础给您的客户一些视觉上的干扰。

【讨论】:

这是我确实考虑过的事情,但不幸的是,由于流量管理,我工作场所的网络连接非常难以预测。 许多专业程序都这样做。浏览器、CD 刻录机,它们经常显示“100%”而没有完成工作,或者在结束之前完成......这是完全正常的,但谁在乎:P【参考方案3】:

如果您的电子邮件进程可以发回信息,则可以使用消息更新进度条或进度文本。

这类似于 Wordpress 升级/安装的工作方式。随着该过程完成,将显示文本告诉每个步骤:“下载 xxxx.xxx.xxx”、“停用插件”、“安装插件”、“尝试重新激活”、重新激活成功“:类似的东西。你需要一个监听器客户端和服务器上的消息发送者:当脚本执行时,它会将消息发送回客户端。

如前所述,这实际上只能到达您的服务器。您可以表明邮件是否成功离开您的服务器,但如果没有某种电子邮件接收者确认步骤,我认为您可以做到这一点。

【讨论】:

【参考方案4】:

我猜我们有机会完成它,但不能确定这个解决方案是否已经由某人完成。

我的想法:

据我所知,您可以在非阻塞模式下使用套接字 stream_set_blocking() 那么您可以尝试使用该方法通过该非阻塞套接字发送电子邮件。

【讨论】:

以上是关于是否可以使用 PHP 异步发送电子邮件,同时向用户提供有关交付的反馈?的主要内容,如果未能解决你的问题,请参考以下文章

用php-redis给全部用户发送邮件,数据量很大,思路应该是啥样的

向用户发送激活电子邮件

如何在 php 中向数千名用户发送安全(爆炸)电子邮件?

PHP 向用户在插件文件中输入的地址发送电子邮件

使用 PHP 向 Facebook 群组邮件地址发送电子邮件

如何在 PHP 中向用户发送每日电子邮件通知?