是否有可能在使用PHP的同时向用户提供反馈,同时发送邮件?

问题描述 投票:2回答:4

是否有可能使用PHP非同步地发送邮件,同时向用户提供实时的交付反馈?

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

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

是否可以使用PHP和类似Ajax的东西?您如何确定邮件在途中的进度?

php email asynchronous feedback
4个回答
0
投票

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


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,这是很讨厌的事情)。

免责声明

鉴于即使在您真正了解状态的好情况下,您也无法知道对方是否收到了电子邮件,也不知道需要多少时间,我不确定这样的构造是否有用。 。编程当然很有趣,但是我怀疑它真的有用,也许只是一些带有标准电子邮件免责声明的令人眼花candy乱的东西(电子邮件可能会在传输中丢失,如果失败则重试,请稍等一段时间再重试)是否足够。


0
投票

如果您的电子邮件过程可以发回信息,则可能会更新进度条或包含消息的进度文本。

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

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


0
投票

我想我们有机会完成它,但不能确定是否有人已经完成了此解决方案。

我的想法:

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

© www.soinside.com 2019 - 2024. All rights reserved.