grmihel
grmihel

Reputation: 846

Getting notification on inbox changes using Mailkit

What is the best way to be notified instant when mails or changes happens to the INBOX of my mailbox using MailKit??

I have been playing around with following events: ImapClient.Inbox.CountChanged; This seems to work best when using Exchange servers, since they don't react at all on the MessageArrived event. Pff..

ImapClient.Inbox.MessagesArrived; This seems to work quiet well with open source mail servers, like SquirrelMail, but doesn't work at all with Exchange.

I want to be notified when new mails arrive to the mailbox, if any mails are moved/deleted, and if there any mails moved to this imap folder. Which approach should I take to get an event asap when something happens to my INBOX?? I want the best of both worlds.

And what is the ImapClient.Inbox.Subscribe(); used for??

Upvotes: 3

Views: 4932

Answers (1)

jstedfast
jstedfast

Reputation: 38653

The Subscribe and Unsubscribe methods just flag a folder (aka mailbox) as subscribed or unsubscribed - generally this is only used by mail clients to decide whether or not the user wants to see the folder in the default folder list.

The CountChanged event is emitted anytime MailKit gets an untagged "* # EXISTS" line from the IMAP server, typically as part of a response to a command that was just sent.

The MessagesArrived event is emitted immediately following the CountChanged event IF AND ONLY IF the new message count is larger than the old message count. Unfortunately, this is a badly designed/named event because it can be very misleading. Since the logic that determines whether or not to emit the event only has limited context (the old message count and the new message count), it can't accurately decide whether or not to emit this event.

Take the following situation for example:

When you open a folder, let's say that the message count is 10.

Now you expunge a handful of messages (5?) out of the folder... BUT, while the messages are being expunged, you get 2 new messages.

When the expunge command completes, the IMAP server replies back with "* 7 EXISTS"

Since 7 (the new message count) is less than 10 (the old message count), the MessagesArrived event will not be emitted.

I want to be notified when new mails arrive to the mailbox, if any mails are moved/deleted, and if there any mails moved to this imap folder.

If you want to know when new messages arrive, you need to listen to the CountChanged event and do your own book keeping to figure out if new messages arrived or if messages were moved/deleted out of the folder.

There's no way to distinguish between messages being moved into the folder vs new messages being delivered to the folder (unless you are doing the moving).

Which approach should I take to get an event asap when something happens to my INBOX??

If your server supports the IDLE extension, you'll probably want to look into using the ImapClient.Idle() (or IdleAsync()) method since the CountChanged event will only be emitted when it receives a "* # EXISTS" response from the server, and an IMAP server will only send that response as part of a response to a command from the client or if the client is in the IDLE mode.

If your server does not support the IDLE extension, you will need to "ping" the IMAP server using the ImapClient.NoOp() method (which is a dummy command that doesn't do anything) periodically in order to check if any new messages have arrived since the last command you sent.

There's an ImapIdle sample in MailKit's GitHub repository to see how to use it.

Upvotes: 9

Related Questions