PHP 获取超过 20000 封 imap 电子邮件

标签 php email cron imap

我正在尝试将多个邮箱导出到数据库。我当前的脚本将连接 IMAP 并循环播放所有消息。尽管对于较大的邮箱,这将不起作用,并且会减慢甚至停止。

想法是每天运行脚本,将所有不在数据库中的消息“复制”到数据库中。获取大量电子邮件的最佳方式是什么(2 万封邮件分布在大约 40 - 50 个文件夹中)。

最终,这将需要从一台服务器上工作,每天扫描数百甚至数千个帐户(想象一下数据量)。它将邮件(uid 和主题)存储到数据库中,并创建一个将存储在数据服务器上的包(因此它还需要获取附件)。

最佳答案

所以您想通过 IMAP 执行电子邮件备份。有专业的软件工具可以执行此操作。

让我们从简单的事情开始:从收件箱文件夹中为一个特定用户下载一封电子邮件。这需要您 (a) 使用用户的凭据登录,(b) 选择收件箱文件夹,以及 (c) 下载邮件(假设您已经知道它的 UID,即 55)。您在 IMAP 中按如下方式执行此操作(仅请求 - 未显示响应):

01 LOGIN username password
02 SELECT INBOX
03 UID FETCH 55 BODY[]

特定文件夹中的每封邮件都被赋予一个 UID .这是永不更改的邮件的唯一标识符 - 该文件夹中 中的任何其他邮件都不能使用它。新消息的 UID 必须高于之前的消息。这使它成为确定您之前是否已下载邮件的有用工具。

下一步:让我们看看下载 INBOX 文件夹中的所有新邮件。假设您是第一次下载邮件,收件箱当前有 UID 为 54、55 和 57 的邮件。您可以使用如下命令一次性下载这些邮件:

03 UID FETCH 54,55,57 BODY[]

(如果要下载的内容很多,您可能希望分批进行(例如一次 30 次)。)这样做之后,您将存储到目前为止下载的最高 UID。下次,您可以检查是否有更高的 UID,如下所示:

04 UID FETCH 58:* UID

这将(仅)检索具有从 58 开始的 UID 的消息的 UID。如果得到结果,则下载这些结果,并再次存储 UID。等等。

有一个问题。只要文件夹的 UIDVALIDITY 属性(包含在对 SELECT 命令的响应中)不变,消息的 UID 就是有效的。如果由于某种原因发生变化,该文件夹将失效,您需要重新下载该文件夹中的所有邮件。

最后,您希望将其扩展为适用于所有用户的所有文件夹。为了获取特定用户的所有文件夹,您可以使用 IMAP LIST 命令:

05 LIST "" "*"

您需要事先知道用户的凭据并遍历它们。

这是您需要执行的操作背后的 IMAP 理论。用 PHP 实现它留作练习。

关于PHP 获取超过 20000 封 imap 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166280/

相关文章:

php - 使固定宽度 <div> 的序列按四行显示

php - 如何使用过程代码库在 PHP 中编写单元测试?

php - 如何在 Apache 2.4.x 上运行 PHP 5.2.13?

bash - 电子邮件警报和 ping 脚本

c# - MailKit smtp.office365.com特殊字符编码问题

node.js - 即使我的 Node 服务器重新启动,也保留我的 cron 作业并执行它们

javascript - 改变 CSS :before and :after Using Javascript or PHP

python - 树莓派 : no internet email and mysql connection

php - 按时区 php 发送 cron 作业通知

python - 查询时在 Django TimeStampedModel 中指定时间间隔