2

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

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

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

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

4

4 回答 4

5

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

免责声明

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

于 2009-08-20T20:39:42.690 回答
0

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

于 2009-08-20T20:35:21.513 回答
0

如果您的电子邮件进程可以发回信息,那么可能会更新进度条或带有消息的进度文本。

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

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

于 2009-08-20T20:55:00.413 回答
0

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

我的想法:

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

于 2012-05-24T08:59:45.750 回答