最近在做的一个 Ticket 站点,用户除了按正常流程在网页端提交,还有可能向网页上的邮箱中发送邮件。客服的需求是这部分邮件可以自动转化为 Ticket,同时对于用户回复给发信机器人的邮件也可以自动转化为对于 Ticket 的回复。
参考公司其他同事的处理方式,最终方案概括来讲就是使用 Python 的 poplib 包来定期接收邮件,解析处理后转交给PHP进行业务处理,用py收发邮件主要是py标准库自带处理邮件的特别是收取邮件的功能。这就要求两门语言能互相通信,我考虑了两种办法。
方法 1:文件加Artisan
- py 处理完 email 后把格式化好的数据写入服务器指定目录的一个文件里,每封 email 就是一个文件,在这次的实际例子中我是写在
storage下的子目录里。php 这边提供一个artisan命令,py 通过os.system('php artisan xxxx email_id')调用,php 中file_get_contents后执行业务,成功后删除email文件即可。 - 弊端:py 拿不到 php 的处理结果,再加中转的话会变复杂;分布式使用为 0,php 一定是多台服务器的,这样处理只有部署 py 的服务器能参与。
方法 2:接口处理
- py 调用 php 的接口,这样其实比较粗暴,但是可以很好的解决上面的两个问题。
未实现的方法
- 引入队列,py 作为生成者,php 作为消费者,整体是异步的架构。结果返回的形式反过来,互换角色。
- 完善 python 的逻辑,取消对 php 的依赖。
- py 和 php 都监听一个公共的消息中间件,比如
MQTTpy 把数据发布在一个指定的Topic中,php 处理后把结果发布在另一个Topic中,py拿到返回。 (我能想到最健壮的方案,但是代价比较大)
其他
我想可能 py 和 php 的交互除了:① 终端命令 ② 接口 这两种成本低但是笨蛋系统的方法,可能只能依赖于独立的中间系统了,但是又会带来新的运维成本,还是得依据项目采用不同办法了。


