そのため、IMAP 経由でメールのバックアップを実行したいと考えています。これを行う専門的なソフトウェア ツールがあります。
簡単なことから始めましょう。特定のユーザー宛てのメールを受信トレイ フォルダーからダウンロードします。これには、(a) ユーザーの資格情報でログインし、(b) INBOX フォルダーを選択し、(c) メッセージをダウンロードする必要があります (メッセージの UID が 55 であることが既にわかっていると仮定します)。次のように IMAP でこれを行います (要求のみ - 応答は表示されません)。
01 LOGIN username password
02 SELECT INBOX
03 UID FETCH 55 BODY[]
特定のフォルダ内の各メッセージにはUIDが与えられます。これは、変更されることのないメッセージの一意の識別子です。そのフォルダ内の他のメッセージでは使用できません。新しいメッセージには、以前のメッセージよりも高い UID が必要です。これにより、以前にメッセージをダウンロードしたかどうかを判断するのに便利なツールになります。
次のステップ: INBOX フォルダにあるすべての新しいメッセージをダウンロードする方法を見てみましょう。メッセージを初めてダウンロードする場合、現在 INBOX には UID 54、55、および 57 のメッセージがあるとします。次のようなコマンドを使用して、これらのメッセージを一度にすべてダウンロードできます。
03 UID FETCH 54,55,57 BODY[]
(ダウンロードするものが多い場合は、これをバッチに分割することをお勧めします (たとえば、一度に 30 ずつ)。) その後、これまでにダウンロードした最大の UID を保存します。次回は、次のようにそれよりも大きい UID を確認できます。
04 UID FETCH 58:* UID
これにより、UID が 58 以降のメッセージの UID (のみ) が取得されます。結果が得られたら、それらをダウンロードして、UID を再度保存します。等々。
1つのキャッチがあります。メッセージの UID は、フォルダーの UIDVALIDITY 属性 (SELECT コマンドへの応答に含まれる) が変更されない限り有効です。これが何らかの理由で変更された場合、フォルダーは無効になり、そのフォルダー内のすべてのメッセージをもう一度ダウンロードする必要があります。
最後に、これを拡張して、すべてのユーザーのすべてのフォルダーで機能するようにします。特定のユーザーのすべてのフォルダーを取得するには、IMAP LIST コマンドを使用します。
05 LIST "" "*"
ユーザーの資格情報を事前に把握し、それらをループする必要があります。
これは、あなたがしなければならないことの背後にある IMAP 理論です。PHP での実装は演習として残されています。