所以你想通过IMAP进行电子邮件备份.有专业的软件工具可以做到这一点.
让我们从简单的事情开始:从收件箱文件夹下载一个特定用户的电子邮件.这要求您(a)使用用户的凭据登录,(b)选择INBOX文件夹,(c)下载消息(假设您已经知道其UID,即55).您可以在IMAP中执行以下操作(仅请求 - 响应未显示):
01 LOGIN username password
02 SELECT INBOX
03 UID FETCH 55 BODY[]
Run Code Online (Sandbox Code Playgroud)
特定文件夹中的每条消息都有一个UID.这是永不更改的消息的唯一标识符 - 该文件夹中的任何其他消息都不能使用它.新消息必须具有比以前更高的UID.这使它成为确定您之前是否已下载邮件的有用工具.
下一步:现在让我们看看下载INBOX文件夹中的所有新消息.假设您是第一次下载消息,并且INBOX当前具有UID为54,55和57的消息.您可以使用以下命令一次性下载这些消息:
03 UID FETCH 54,55,57 BODY[]
Run Code Online (Sandbox Code Playgroud)
(如果有很多要下载的话,您可能希望批量分解(例如每次30个).)这样做之后,您存储到目前为止下载的最高UID.下次,您可以检查UID高于该值,如下所示:
04 UID FETCH 58:* UID
Run Code Online (Sandbox Code Playgroud)
这将检索具有从58开始的UID的消息的UID(仅).如果您获得结果,则下载这些结果,然后再次存储UID.等等.
有一个问题.只要文件夹的UIDVALIDITY属性(包含在对SELECT命令的响应中)不会更改,消息的UID就是有效的.如果由于某种原因发生更改,则文件夹无效,您需要重新下载该文件夹中的所有邮件.
最后,您希望将其扩展为适用于所有用户的所有文件夹.要获取特定用户的所有文件夹,请使用IMAP LIST命令:
05 LIST "" "*"
Run Code Online (Sandbox Code Playgroud)
您需要事先知道用户的凭据并循环它们.
这是你需要做的IMAP理论.在PHP中实现它只是一个练习.
你正在用imap_ping吗 ?
imap_ping() 对流执行 ping 操作以查看它是否仍然处于活动状态。它可能会发现新邮件;这是定期“新邮件检查”以及具有不活动超时的服务器“保持活动”的首选方法。
其他值得一看的:imap_timeout imap_reopen
事实上,有一种方法叫做reopen“暗示”,不是吗:)
如果您似乎无法保持连接,您想到的另一个选择是将数据导出为mbox格式并在本地获取它。对于大型邮箱来说可能会更快,并且可以消除超时/连接问题。