[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