7

複数のメールボックスをデータベースにエクスポートしようとしています。私の現在のスクリプトは IMAP に接続し、すべてのメッセージをループします。ただし、より大きなメールボックスではこれは機能せず、速度が低下するか、停止することさえあります。

アイデアは、スクリプトを毎日実行して、まだデータベースにないすべてのメッセージをデータベースに「コピー」することです。大量の電子メールを取得する最良の方法は何ですか (約 40 ~ 50 のフォルダーに分散する 20,000 通のメール)。

最終的には、単一のサーバーから毎日数百または数千のアカウントをスキャンする必要があります (データの量を想像してみてください)。メール (uid と件名) をデータベースに保存し、データサーバーに保存されるパッケージを作成します (したがって、添付ファイルも取得する必要があります)。

4

2 に答える 2

6

そのため、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 での実装は演習として残されています。

于 2013-03-04T19:48:39.923 に答える
2

を使用していimap_pingますか?

imap_ping() は、ストリームがまだアクティブかどうかを確認するために ping を実行します。新しいメールを発見するかもしれません。これは、定期的な「新着メール チェック」および非アクティブ タイムアウトのあるサーバーの「キープ アライブ」に推奨される方法です。

他に注目すべきもの:imap_timeout imap_reopen

というメソッドがあるという事実は、reopen何かを示唆していますね:)

接続を維持できない場合に思いつく別のオプションは、データをエクスポートしてmboxフォーマットし、ローカルで取得することです。巨大なメールボックスの場合は高速になる可能性があり、タイムアウト/接続の問題を取り除くことができます.

于 2013-03-01T20:31:16.990 に答える