7

C# を使用してメール クライアント プロジェクトに取り組んでいます。サーバーとの通信に POP プロトコルと IMAP プロトコルの両方を使用しています。問題は、メッセージの UID を取得したいときに、POP サーバーと IMAP サーバーからの結果が異なる理由がわからないことです。

POP
C: UIDL 1
S: +OK 1 UID2-1269789826

IMAP
C: $ FETCH 1 (UID)
S: * 1 FETCH (UID 2)
S: $ OK Fetch completed.

UID の取得結果がこれほど異なるのはなぜですか? IMAP には、このための別の機能がありますか? どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

15

POP3とIMAPは2つの異なるプロトコルです。これらの2つのプロトコルで使用されるUIDは関連しておらず、まったく同じであるとは想定されていません。実際、POP3 UIDは任意の文字列ですが、IMAP UIDは32ビットの数値(文字列として送信)です。

理論的には、IMAPとPOP3の両方をサポートするメールサーバーを作成することは可能ですが、両方のプロトコルに同じUIDを使用しますが、実際にこれを行うサーバーはありません。実際には、POP3UIDとIMAPUIDを無関係な値として扱う必要があります。

RFC 1939(POP3): メッセージのunique-idは、サーバーによって決定される任意の文字列であり、0x21から0x7Eの範囲の1から70文字で構成され、メールドロップ内のメッセージを一意に識別し、セッション間で存続します。

RFC 3501(IMAP):( 一意の識別子(UID)メッセージ属性は)各メッセージに割り当てられた32ビット値であり、一意の識別子の有効性値(以下を参照)とともに使用すると、参照してはならない64ビット値を形成します。メールボックスまたは同じ名前の後続のメールボックス内の他のメッセージ。

于 2010-03-30T19:31:15.067 に答える
8

非常に重要な IMAP の事実

これは私が GMail で遊んで学んだことです (他のシステムも同じだと思います):

  • 受信トレイにメッセージを送信しました
  • UID 45 を持っています
  • メッセージを迷惑メールに移動
  • UID 5 になりました (UID はメールボックスごとに一意であるため)
  • 受信トレイに戻す
  • UID 46 になりました
  • ジャンクに戻す
  • これで UID 6 になりました
  • アイデアを得る...

GMail.com UI を使用してメッセージを移動しました

私が知る限り、UID はフォルダー内の最新のメールを見つける場合にのみ役立ちます。コマンド Search(" UID 34:*) を実行すると、UID が 34 以上のフォルダー内のすべてのメッセージを取得できます。

ただし、データベース内のそのメッセージのキーとして UID を使用しないでください。

受信した時間を取り、メッセージの内容でハッシュして、実際にデータベースに入れることができる UID を取得すると思います。

于 2013-12-21T04:28:31.713 に答える