2017-04-05 8 views
3

IMAPプロトコルでメッセージを処理するためにメールサーバーに接続するJavaMail APIを使用してメールクライアントを実装しました。 implemenetationは、多くの顧客とのメールサーバに正常に動作しますが、我々は問題がある顧客は、IMAP :(JavaMail)UIDVALIDTYの値は常に一部のフォルダの変更

はUIDVALIDTY:は、我々はフォルダ内のメッセージのUID値に頼ることができるかどうかを決定するために、我々は、各フォルダの最近のUIDVALIDTYを格納します。そして、次のプロセスでは、最近格納された値と現在の値を比較します。それらが同じであれば、私たちはUIDに頼ることができます。 IMAP仕様では、この値を不必要に変更しないようにサーバーが最善を尽くすことを要求しています。 (メールサーバーのクラッシュ、再起動、アップグレードなどを除く)

この特定の顧客のメールサーバーでは、毎回一部のフォルダのUIDVALIDTY値が変更されます。テストアカウントには300個のフォルダがあり、そのうち15個は常に同じ特定の定義済みフォルダであり、常に異なるUIDVALIDTY値を持ちます。

その理由は何でしょうか?メールサーバーの設定はありますか?私はそれがJavaメールのAPIの範囲を超えていると思う、それはメールサーバーに関連しています。お客様は、メールサーバーに問題はないと言い、Webインターフェイスで使用できます。メールサーバーに問題があると顧客を説得して納得させるにはどうすればよいですか?

答えて

3

メールボックス形式の中には、UIDを格納するためのスペースがないものもあります。このような形式をサポートしているのは、まだ使用されているサーバーのいくつかです。 Dovecotは、UIDをサポートしていないストレージを含むIIRCなど、多くのストレージ形式をサポートしています。

サーバにする必要がある場合は、send you a UIDNOTSTICKY response code when you open the mailboxとなります。その時点から、それは細い空気の中から新しいUIDSを作り出します。 UIDNOTSTICKYを検出して再生を拒否したり、妥当性の変更処理をテストする機会と見なすことができます。

+0

私たちは、JavaメールAPIを使用してUIDNOTSTICKYを検出できますか? – benchpresser

+1

そうです。私はわかりませんが、[あなたが聞くことができる] StoreEventを取得する可能性が高いです(http://docs.oracle.com/javaee/6/api/javax/mail/Store.html#addStoreListener(javax .mail.event.StoreListener))。人間が読めるテキストがないためにこのメッセージが表示されない場合は、IMAPStoreをサブクラス化し、 'handleResponseCode()'を再実装し、UIDNOTSTICKYをチェックし、 'super.handleResponseCode()'を呼び出すことができます。しかし、StoreEventのリスニングはより良いです。 – arnt

+1

[JavaMailデバッグ出力](http://www.oracle.com/technetwork/java/javamail/faq/index.html#debug)を有効にして、そのレスポンスコードを取得しているかどうかを確認することができますが、あなたが違う何かをすることができるのは明らかではありません。メールボックスが表示されるたびに異なっていると仮定するか、またはキャッシュされた情報がまだ有効かどうかを判断するために独自のヒューリスティックを作成する必要があります。私は、これらのメールボックスが実際に削除されず、あなたがそれらを見るたびに再作成されていないと思いますよね?お客様はどのようなメールサーバーを使用していますか? –

関連する問題