IMAPサーバーからのみ新しいメールを取得します
-
23-08-2019 - |
質問
私は、IMAPサーバーからメールをフェッチし、データベースに格納し、クライアントアプリケーションを書いています。問題は、私は、メール、私は以来、到着したメールをダウンロードしたい次の時間を確認した後ということです。私は2時間前にメールサーバをチェックしていたのであれば、私は、最後の2時間で到着したメールを取得したい。
私はDATE SINCEで検索を使用することができますが、簡単に詐称することができ、時間+日付のサポートはありません。
(ルビーで、それがnil毎回を示して)私はまた、最近のフラグを試してみましたが、それはGmailを利用していないようです。
解決
あなたはメッセージのためにユニークID(UID)を使用します。それが作成された理由は特にあります。
[UID]は、実際のUID値であり、あなたは「* [UID]」、要求された最後のUIDを追跡したいと思うでしょうし、その後、あなたが設定したメッセージを使用するすべての新しいメッセージを要求します
たとえば、「123456」の一意のIDを持っていたfeteched最後のメッセージを言うことができます。あなたがフェッチでしょう。
123456:*
次に、第1の返されたメッセージを破棄する。
の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に基づいて、あなたがダウンロードした最後のものを、見つけることができます。
他のヒント
「見」と呼ばれるIMAPフラグがあります。ほとんどのクライアントがメッセージを表示するときに見たメッセージをマークしますので、あなたは、そのフラグが設定されていないサーバー上のメッセージを反復処理したいと思います。
ここで、あなたに右のアイデアを与える必要がありますコードスニペットです。当然の動作ビットである
imap.search(["NOT", "SEEN"]).each do bla.bla.bla
あなたは、サーバー側で特定のIMAPフォルダに受信メールをフィルタリングすることができるならば、あなたのアプリ そのフォルダに新しいメッセージを読んで、それを行うの後に標準INBOXフォルダにそれらを移動することができます。