我们构建了一个需要不断检查电子邮件的 Web 服务。基本上,用户向我们发送一封电子邮件,服务器应该根据该电子邮件采取行动。我们可以使用 crontab PHP 脚本,通过 POP 每分钟检查一次新邮件。但这对 popserver 来说有点冒犯,而且效率不高(1 分钟太长了)。
但是,我读过关于在移动设备上使用 IMAP 推送电子邮件的文章。在我的例子中,不是移动设备,而是网络服务器。
我可以将电子邮件推送到我的网络服务器并让其执行 PHP 脚本吗?我们使用 GMail 作为 POP/SMTP/IMAP 服务器。
编辑1 从答案中我们发现:
我的网络服务器上必须有一个 24/7 全天候运行的进程(守护进程)来检查电子邮件
该守护进程可以使用以下方式与 Gmail 通信:i) POP 与 NOOP 或 ii) IMAP 与 IDLE
哪个最好?POP 还是 IMAP?Google 似乎更倾向于使用 IMAP。
我不想过度使用 Gmail(他们检查电子邮件的“合理用途”是什么?每 10 秒一次?
谢谢!
答案1
如果您使用 POP3 并保持连接打开,您可能无法收到新消息 - 我不记得这是否是规范的一部分,但我处理过的 POP3 服务器基本上会在 POP3 会话期间锁定邮箱,因此只要 POP3 会话打开,就不会(似乎)有新邮件到达(STAT 和 UIDL 和 LIST 和 LAST - 始终 - 返回相同的响应,直到您退出并重新登录)。
如果您使用 IMAP,您应该能够保持 IMAP 连接打开,并定期轮询是否有新邮件。这比每 (例如) 10 秒登录、检查和断开连接要便宜得多。
我不会在前端 Web 服务器中运行轮询器。我会有一个后端长期运行的进程(守护进程),轮询更改,并通过一些消息传递系统与前端 Web 服务器中的 PHP 应用程序进行通信。(“消息传递系统”可以像将请求和状态信息写入共享数据库中的表一样简单)。
如果您愿意,您可以用 PHP 编写轮询守护程序。您可以对这个过程进行额外的改进,让它适应不断变化的邮箱:如果用户邮箱不断变化,则保持连接并频繁轮询。如果邮箱没有变化,则断开 IMAP 连接并在 5 分钟后再次检查。
詹姆士
答案2
如果你控制你的网络服务器:您可以使用 gmail 将电子邮件转发到 Web 服务器,然后使用 /etc/aliases 文件中的管道将电子邮件提供给 php 脚本,该脚本可以从标准输入读取电子邮件。(或者使用等效机制将电子邮件通过管道传输到您选择的任何电子邮件服务器 (MTA) 中的脚本,我个人使用 exim。)基本上,您的别名文件看起来像
username: |/var/www/myphpscript.php
并且 myphpscript.php 会读取 STDIN 上的电子邮件并采取行动。
如果您无法控制您的网络服务器:IMAP 支持 IDLE 命令,允许客户端在等待电子邮件到达时打开与服务器的连接。(这有点像 PUSH 通知,只是客户端必须建立并保持与服务器的开放连接)您可以编写一个脚本,打开与 gmail IMAP 服务器的连接并使用 IDLE 命令等待新电子邮件。这需要在服务器上运行持久进程的能力。可能有一种方法可以使用类似 fetchmail 的程序来执行此操作,然后将电子邮件传递给 php 脚本。
希望有帮助!
答案3
如果你托管自己的邮件服务器,则可以使用类似进程邮件。我认为没有自动处理电子邮件的选项。
答案4
您不能推送 POP,它是一种严格的来获取协议。
您能使用自己的邮件服务器代替 GMail 吗?如果不行,GMail 是否允许自动转发电子邮件?无论哪种情况,您都可以设置邮件服务器,然后根据收到的邮件触发操作。