[Dovecot] Plugin help, number of messages in mailbox

Timo Sirainen tss at iki.fi
Tue Nov 27 03:17:00 EET 2012


On 22.11.2012, at 17.06, Richard Platel wrote:

> We use Dovecot for IMAP and POP (but not LDA), we want to do something when a user has an INBOX that becomes empty, or becomes not empty (set a flag in memcached, but that's not really important).  
> 
> I'm writing a plugin (for Dovecot 2.1.7).  On mailbox_open() I can use mailbox_get_status() to get a count of messages in the mailbox, and then decrement this in expunge() or increment it in mailbox save_finish() (for IMAP APPEND or COPY commands).

So all mailbox access goes through Dovecot. Nothing else changes the underlying storage directly?

> However in expunge() and mailbox_save_finish, even after calling the super function, mailbox_get_status doesn't update the number of messages in the mailbox.

You'll get the updated count only after mailbox_sync_deinit().

> This is a problem if (for example) there are concurrent POP sessions.  Two POP sessions could get all the messages in INBOX, one could logout, calling expunge a few times, eventually causing my plugin to note that the inbox is empty, then our LDA could deliver a message, mark the INBOX not empty, then the other POP session could log out, call expunge and cause my plugin to mark the INBOX empty, when it's not.
> 
> 
> So in summation: how can a plugin be notified of changes to a mailbox, and then accurately get the real number of messages in that mailbox? 


I think if you hook into sync_deinit() and use a local lock file while you send the notification it would probably be race-free.



More information about the dovecot mailing list