6

IMAP メッセージには、UID私たち全員が喜ぶ があります。ただし、POP3 メッセージの一意の ID を生成する方法を見つけようとしていて、問題があります (hotmail.com のような古いシステムでは POP3 しか許可されません)。

クライアントへの利用可能なメッセージは、POP セッションがメールドロップを開くときに固定され、そのセッションにローカルなメッセージ番号によって、またはオプションで、POP サーバーによってメッセージに割り当てられた一意の識別子によって識別されます。この一意の識別子は永続的でメールドロップに一意であり、クライアントは異なる POP セッションで同じメッセージにアクセスできます。メールが取得され、メッセージ番号によって削除のマークが付けられます。クライアントがセッションを終了すると、削除対象としてマークされたメールはメールドロップから削除されます。-ウィキペディア

ただし、基本的なLISTコマンドは単に一時番号の配列を返すだけで、メールを取得できるようです。ただし、これらの番号は決して一意ではないため、UIDL と呼ばれる別の拡張機能が追加されたようです: CAPA (POP3 拡張メカニズム)。

POP3UIDLは、メッセージが存在する限りa は一意であると述べています。

メッセージの一意の ID は、0x21 から 0x7E の範囲の 1 から 70 文字で構成される任意のサーバーで決定される文字列であり、メールドロップ内のメッセージを一意に識別し、セッション間で持続します。UPDATE 状態に移行せずにセッションが終了した場合でも、この永続性は必要です。一意の ID を使用するエンティティが存在する限り、サーバーは特定のメールドロップで一意の ID を再利用してはなりません。

削除済みとしてマークされたメッセージはリストされないことに注意してください。

サーバーの実装では、任意に割り当てられた一意の ID をメールドロップに格納することが一般的に望ましいですが、この仕様は、一意の ID をメッセージのハッシュとして計算できるようにすることを目的としています。クライアントは、メールドロップ内のメッセージの 2 つの同一のコピーが同じ一意の ID を持つ状況を処理できる必要があります。

そのため、1 年後に (最初のメッセージが削除された後) 同じ UIDL を持つ別のメッセージをダウンロードする可能性があり、システムで競合する可能性があると思います。

メッセージ本文全体をハッシュして、それを ID として使用する必要がありますか?

電子メール全体を取得してハッシュするTOP [id] 1のではなく、受信サーバーが常に何らかの種類の情報を追加するため、既存の電子メールと一致してはならないヘッダー (および最初の行) をハッシュするために使用する必要がありますか? 攻撃者が衝突を引き起こすことは決してありませんでした。

MDaemon プログラムは、部分的なヘッダー ハッシュの問題に取り組んでいるようです。

MDaemon は、メッセージ名、日付スタンプ、サイズ、およびメッセージに関するその他の詳細を使用して UIDL 結果を構築します。その結果、メッセージがサーバー上で変更されると、名前を変更しなくても、メール クライアントには「新規」として表示されます。

POP3 メールの ID を作成する正しい方法は何ですか?

注: メールにはMessage-IDヘッダーが含まれていることがよくありますが、システムを混乱させる攻撃ベクトルとして使用される可能性があるため、これに頼ることはできません。また、一部の電子メール クライアントでは無視されます。

4

3 に答える 3

3

Date個人的にはFrom、電子メール ヘッダーの小さなサブセットをハッシュするだけSubjectですMessage-ID

私はよくメーリング リストに登録します。誰かがあなたに返信すると、同じメッセージの複数のコピーを受け取る傾向があります。1 つは直接送信され、もう 1 つはメール サーバーを介して送信されます。このような状況では、多くのヘッダーが異なりますが、メッセージのコピーを 2 つ受信したくありません。

そして、同じ人から同時に、同じ件名と同じメッセージ ID を持つ 2 つの異なるメールを受信する可能性は非常に低いようです。

もちろん、不可能ではありません。メッセージ ID を生成しない、件名が空白である、時計が壊れている、これらすべてを同時に持っている可能性があります。しかし、彼らの電子メールが通過するルーターは、宇宙からの巨大な隕石によって一掃される可能性があります。

率直に言って、最も可能性の高いシナリオは、電子メールがスパムによって検出されてしまい、いずれにせよ私がそれを見ることはないということです。電子メールは、それほど信頼できるコミュニケーション形式ではありません。適度にうまく機能するものが必要ですが、100 万分の 1 のエッジ ケースを処理できなくても、おそらく問題ありません。

于 2013-05-09T20:49:15.750 に答える
1

あなたの質問に質問してすみませんが、本当の問題は、なぜあなたは気にするのですか? メールの自然な主キーを考え出すのに本当に苦労しているようです。する必要はありません - とにかく、実際にはありません。あなたが解決しようとしている本当の問題は何ですか?

UIDL に関するあなたの理解は正しいです。メッセージは、特定のメールボックスにある間は同じ UIDL を維持する必要があり、同一のメッセージは同一の UIDL を持つことができます (ただし、そうする必要はありません)。特に最後の要件は、UIDL の範囲と目的を強調しています。クライアントがメールボックスからメッセージを削除すると、UIDL を忘れる必要があります (そして忘れることができます)。これは、その値が再び表示された場合、以前のメッセージとの関係が今後決して伝えられないためです。

于 2013-05-07T20:57:50.013 に答える
0

あなたが言及したUIDLを、番号の一意性を確保する必要がある現在のタイムスタンプとともにハッシュします。メッセージが送信される限り UIDL が一意である場合、タイムスタンプを使用すると、参照するシナリオ (同じ UIDL を持つ別のメッセージ) が発生しないことが保証されます。

于 2013-05-10T13:09:51.203 に答える