所以您想通过 IMAP 执行电子邮件备份。有专业的软件工具可以做到这一点。
让我们从简单的事情开始:从收件箱文件夹中为特定用户下载一封电子邮件。这需要您 (a) 使用用户的凭据登录,(b) 选择收件箱文件夹,以及 (c) 下载消息(假设您已经知道它的 UID,即 55)。您在 IMAP 中按如下方式执行此操作(仅限请求 - 未显示响应):
01 LOGIN username password
02 SELECT INBOX
03 UID FETCH 55 BODY[]
特定文件夹中的每条消息都被赋予一个UID。这是永远不会更改的消息的唯一标识符 - 该文件夹中的任何其他消息都不能使用它。新消息的 UID 必须高于以前的消息。这使它成为确定您之前是否已经下载过邮件的有用工具。
下一步:现在让我们看看下载收件箱文件夹中的所有新邮件。假设您是第一次下载消息,而收件箱当前有 UID 为 54、55 和 57 的消息。您可以使用以下命令一次性下载这些消息:
03 UID FETCH 54,55,57 BODY[]
(如果有很多要下载的内容,您可能希望分批拆分(例如一次 30 个)。)完成此操作后,您将存储迄今为止下载的最高 UID。下次,您可以检查是否有高于此的 UID,如下所示:
04 UID FETCH 58:* UID
这将(仅)检索 UID 从 58 开始的消息的 UID。如果得到结果,则下载这些结果,然后再次存储 UID。以此类推。
有一个问题。只要文件夹的 UIDVALIDITY 属性(包括在对 SELECT 命令的响应中)不更改,消息的 UID 就有效。如果由于某种原因发生更改,该文件夹将失效,您需要重新下载该文件夹中的所有邮件。
最后,您希望将此扩展为适用于所有用户的所有文件夹。为了获取特定用户的所有文件夹,您可以使用 IMAP LIST 命令:
05 LIST "" "*"
您需要事先知道用户的凭据并遍历它们。
这是您需要做的事情背后的 IMAP 理论。在 PHP 中实现它留作练习。