[Dovecot] Auto create folder(s)

mouss mlist.only at free.fr
Mon Oct 1 01:45:53 EEST 2007


Fábio M. Catunda wrote:
> Charles Marcus escreveu:
>> On 9/26/2007, Bill Landry (bill at inetmsg.com) wrote:
>>>> But with maildrop you still run the process of creating/checking on
>>>> every delivery, same thing as dovecot, right?
>>
>>> Correct. If the folder does not exist, maildrop will create it on
>>> first delivery. If the end user deletes the folder, maildrop will
>>> recreate the folder on the next message delivery to that account.
>>
>> Could it could be written to simply create the folder if the target
>> folder doesn't exist (ie, if the initial save fails due to
>> non-existent folder)? Then there would be no performance hit...
>>
> There will be a performance hit couse you have to check if the folder
> exists or not.

Charles did not say you need to check if the folder exists or not.

> With maildrop its pretty easy to do that, but you will have an extra
> access to your HD on every message delivery.
> Maildrop can run shell commands it the user that runs it have a valid
> shell (Debian-exim do NOT have a valid shell, I created another user
> just to make the delivery), so, you can run something like
> 
> /^Envelope-to:.*/
> getaddr($MATCH) =~ /^.*/;
> DEST = $MATCH
> USER = `/bin/echo $DEST | /usr/bin/cut -f1 -d'@'`
> DOMAIN = `/bin/echo $DEST | /usr/bin/cut -f2 -d'@'`
> 
> DOEXIST=`[ -d /var/mail/$DOMAIN/$USER/Maildir ]; echo $?`
> 
> if ($DOEXIST == 1){
>    <RUN SOMETHING HERE TO CREATE MAILDIRS>
> }
> 
> Thats it!
> 

There's a pattern here. instead of

	if (file|dir) (exists|is writable) ... write to ...

use

	write to ...
	if (error)  handle it

This has multiple benefits:
- optimized for the common case
- less vulnerable to race conditions (things happen between the time you
check and the time you do).
- if the file/dir exists/writable, no check to do.

with maildrop, this is done with exceptions (otherwise trying to deliver
would result in an error reported to the MTA).

# try writing
exception {
	TO $folder
}
# failed. maybe folder doesn't exist. try creating it
# add whatever checks or actins inside this...
`$maildirmake $folder`
# try writing again
TO $folder


you can adapat this to delivering spam to the Inbox if the user has
deleted his Junk folder (a method to opt-out).


More information about the dovecot mailing list