20

IMAP サーバーから電子メールを取得してデータベースに保存するクライアント アプリケーションを作成しています。問題は、一度メールをチェックしたら、次はそれ以降に届いたメールだけをダウンロードしたいということです。そのため、サーバーで 2 時間前にメールをチェックした場合、過去 2 時間以内に到着したメールのみを取得する必要があります。

SINCE DATE で SEARCH を使用できますが、時間と日付はサポートされていないため、簡単に偽装できます。

RECENT フラグも試しましたが、gmail では機能しないようです (Ruby では毎回 nil と表示されます)。

4

3 に答える 3

41

メッセージに UniqueId (UID) を使用します。これが特に作成された理由です。

最後に要求された UID を追跡し、すべての新しいメッセージを要求するには、メッセージ セット "[UID]:*" を使用します。[UID] は実際の UID 値です。

たとえば、最後にフェッチされたメッセージの一意の ID が「123456」だったとします。あなたはフェッチするでしょう

123456:*

次に、最初に返されたメッセージを破棄します。

UID は、セッション全体で安定しており、変更されることはなく、常に値が増加することが「想定」されています。これを確認するためのキャッチは、フォルダーを選択するときに UIDValidity を確認することです。UIDValidity 番号が変更されていない場合、UID はセッション間で有効である必要があります。

RFC の関連部分は次のとおりです。

2.3.1.1. 一意識別子 (UID) メッセージ属性

各メッセージに割り当てられた 32 ビットの値。一意の識別子の有効値 (以下を参照) と共に使用すると、64 ビットの値が形成され、メールボックス内の他のメッセージまたは同じ名前の後続のメールボックスを永久に参照してはなりません。一意の識別子は、メールボックス内で厳密に昇順で割り当てられます。各メッセージがメールボックスに追加されると、以前に追加されたメッセージよりも高い UID が割り当てられます。メッセージ シーケンス番号とは異なり、一意の識別子は必ずしも連続しているわけではありません。

メッセージの一意の識別子は、セッション中に変更してはならず、セッション間で変更するべきではありません。セッション間の一意の識別子の変更は、以下で説明する UIDVALIDITY メカニズムを使用して検出可能でなければなりません。クライアントがサーバーとの以前のセッションからの状態を再同期するには、永続的な一意の識別子が必要です (たとえば、切断されたクライアントまたはオフライン アクセス クライアント)。これについては、[IMAP-DISC] でさらに説明します。

注: 次の一意の識別子の値は、クライアントが前回この値をチェックしてからメッセージがメールボックスに配信されたかどうかを判断する手段を提供することを目的としています。

詳細情報のリンクは次のとおりです。

http://www.faqs.org/rfcs/rfc3501.html

私がすることは、ダウンロードされたメッセージの InternalDate も追跡することです。これにより、UID 同期が失われた場合でも、少なくともメッセージを繰り返し処理し、メッセージの InternalDate に基づいて最後にダウンロードしたメッセージを見つけることができます。

于 2009-07-06T13:03:26.823 に答える
4

「見られた」と呼ばれるimapフラグがあります。ほとんどのクライアントは、メッセージを表示するときに表示されたメッセージをマークするため、そのフラグが設定されていないサーバー上のメッセージを反復処理する必要があります。

これは、正しいアイデアを提供するコード スニペットです。もちろん、操作ビットは

imap.search(["NOT", "SEEN"]).each do bla.bla.bla
于 2009-07-05T21:07:59.320 に答える
0

サーバー側で受信メールを特定の IMAP フォルダーにフィルター処理できる場合、アプリはそのフォルダー内の新しいメッセージを読み取り、完了後に標準の INBOX フォルダーに移動できます。

于 2009-07-05T23:03:44.157 に答える