3

MailKit を使用して、メールボックスの INBOX にメールまたは変更が発生したときにすぐに通知を受ける最良の方法は何ですか??

私は次のイベントで遊んでいます: ImapClient.Inbox.CountChanged; Exchange サーバーは MessageArrived イベントにまったく反応しないため、これは Exchange サーバーを使用する場合に最適に機能するようです。ふふ..

ImapClient.Inbox.MessagesArrived; これは、SquirrelMail などのオープン ソース メール サーバーでは静かに機能するようですが、Exchange ではまったく機能しません。

メールボックスに新着メールが届いたとき、メールが移動・削除されたとき、この imap フォルダにメールが移動したときに通知を受け取りたいです。INBOX に何かが起こったときにイベントをできるだけ早く取得するには、どのアプローチをとるべきですか?? 私は両方の世界のベストを望んでいます。

ImapClient.Inbox.Subscribe(); とは何ですか? のために使用される??

4

1 に答える 1

8

Subscribeおよびメソッドは、フォルダー (別名メールボックス) に購読済みまたは購読解除済みのフラグを付けるだけです。Unsubscribe通常、これは、ユーザーが既定のフォルダー リストでフォルダーを表示するかどうかを決定するために、メール クライアントによってのみ使用されます。

このイベントは、通常、送信されたばかりのコマンドへの応答の一部として、CountChangedMailKit が IMAP サーバーからタグなしの行を取得するたびに発行されます。"* # EXISTS"

このイベントは、新しいメッセージ数が古いメッセージ数より大きい場合にのみMessagesArrived、イベントの直後に発行されます。CountChanged残念ながら、これは非常に誤解を招く可能性があるため、不適切な設計/名前のイベントです。イベントを発行するかどうかを決定するロジックは、限られたコンテキスト (古いメッセージ数と新しいメッセージ数) しか持たないため、このイベントを発行するかどうかを正確に決定することはできません。

たとえば、次の状況を考えてみましょう。

フォルダを開いたとき、メッセージ数が 10 だったとします。

ここで、一握りのメッセージ (5?) をフォルダーから消去します... しかし、メッセージが消去されている間に、2 つの新しいメッセージが表示されます。

消去コマンドが完了すると、IMAP サーバーは次のように応答します。"* 7 EXISTS"

7 (新しいメッセージ数) は 10 (古いメッセージ数) より小さいため、MessagesArrivedイベントは発行されません。

メールボックスに新着メールが届いたとき、メールが移動・削除されたとき、この imap フォルダにメールが移動したときに通知を受け取りたいです。

新しいメッセージがいつ到着したかを知りたい場合は、CountChangedイベントをリッスンして、新しいメッセージが到着したかどうか、またはメッセージがフォルダーから移動/削除されたかどうかを把握するために、独自の帳簿を付ける必要があります。

フォルダに移動さ​​れたメッセージとフォルダに配信された新しいメッセージを区別する方法はありません(移動を行っている場合を除きます)。

INBOX に何かが起こったときに、できるだけ早くイベントを取得するには、どのアプローチをとるべきですか??

サーバーが IDLE 拡張機能をサポートしている場合、おそらくImapClient.Idle()(またはIdleAsync()) メソッドの使用を検討する必要があります。CountChangedイベントはサーバーからの応答を受信したときにのみ発行され"* # EXISTS"、IMAP サーバーはその応答をクライアントからのコマンドへの応答、またはクライアントが IDLE モードの場合。

ImapClient.NoOp()サーバーが IDLE 拡張機能をサポートしていない場合は、メソッド (何もしないダミー コマンド) を使用して IMAP サーバーに定期的に「ping」を実行し、最後のメッセージ以降に新しいメッセージが到着したかどうかを確認する必要があります。送信したコマンド。

MailKit の GitHub リポジトリにImapIdle サンプルがあり、その使用方法を確認できます。

于 2015-05-07T18:41:16.560 に答える