Subscribe
およびメソッドは、フォルダー (別名メールボックス) に購読済みまたは購読解除済みのフラグを付けるだけです。Unsubscribe
通常、これは、ユーザーが既定のフォルダー リストでフォルダーを表示するかどうかを決定するために、メール クライアントによってのみ使用されます。
このイベントは、通常、送信されたばかりのコマンドへの応答の一部として、CountChanged
MailKit が 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 サンプルがあり、その使用方法を確認できます。