[Dovecot] auto-detection of user mailbox type - followup

John Harper harper at utsc.utoronto.ca
Fri Feb 9 17:57:24 UTC 2007


In http://www.dovecot.org/list/dovecot/2006-December/018253.html

Timo Sirainen wrote
> 
> You can still change NAMESPACE_* environments. I don't remember how  
> exactly now, but you can do eg. "set > /tmp/sets" in the script, see  
> what it has set and modify them in the script.

in response to my query regarding setting the mail_location in
namespaces from a mail_executable script. The purpose of this is to be
able to select on a per-user basis whether they're using Maildir or
mbox format (I don't want to convert 12000 users all at once, and some
users have no need or desire to change formats - they still use
mail/elm etc) and also have the UW-IMAP compatibility namespaces to
take care of all the clients currently configured with imap server
directory = mail/.

This all works, with one small bug left. For reference, here's the gist:

In the dovecot.conf file place the usual namespace directives
following the Namespaces wiki:

namespace private {
            separator = /
            prefix = 
            inbox = yes
}
#for UW backwards compatibility:
namespace private {
            separator = /
            prefix = mail/
            hidden = yes        
}
namespace private {
             separator = /
             prefix = ~/mail/
             hidden = yes       
}
namespace private {
             separator = /
             prefix = ~%u/mail/
             hidden = yes       
}

define the mail_executable under protocol imap:

  mail_executable = /usr/local/dovecot/lbin/imap.sh

and write the imap.sh script:

------start imap.sh---------------------------------------------------
#!/bin/sh

# determine if user is in mbox or Maildir mode
# Maildir takes precedence and is identified by the existence of 
# both a .procmailrc recipe and the Maildir directory.
# Without a .procmailrc file, there's no recipe to force delivery in
# Maildir format, so any existing Maildir is spurious
# The .procmailrc should contain  DEFAULT=Maildir/
 
# Set the absolute path to this script as the mail_executable for
# the imap protocol in dovecot.conf. 

# It appears that this script is run as the user in their home dir

if [ -f .procmailrc -a -d Maildir ]; then
    MAIL='maildir:~/Maildir'; export MAIL
else
    MAIL='mbox:~/mail:INBOX=~/.mail'; export MAIL
fi

# each namespace defined in the conf file needs to have the mail
# location defined which is set in environment vars
# NAMESPACE_1 etc

NAMESPACE_1=$MAIL; export NAMESPACE_1
NAMESPACE_2=$MAIL; export NAMESPACE_2
NAMESPACE_3=$MAIL; export NAMESPACE_3
NAMESPACE_4=$MAIL; export NAMESPACE_4

#debugging to see what else we can play with
#set >> /tmp/d

exec /usr/local/dovecot/libexec/dovecot/imap

------end imap.sh-----------------------------------------------------

However, it appears that the root dir '~/mail' string is used at some
point before the tilde-expansion takes place. I see a literal ~
directory in the users home, with an empty mail directory
inside. After that it picks up the proper location and works
correctly. I tried a %h and got a literal %h directory. So for now I
made a simple workaround by using the absolute path to the home
directory:

# use home variable (depends on this script running in users home)
# During startup it seems like ~/mail is interpreted as a string and
# a spurious ~ folder is created, before the ~ is expanded
home=`/bin/pwd`
if [ -f .procmailrc -a -d Maildir ]; then
    MAIL="maildir:$home/Maildir"; export MAIL
else
    MAIL="mbox:$home/mail:INBOX=$home/.mail"; export MAIL
fi

Thanks,

John Harper
-------------------------------------------------
Senior Systems Administrator
Information and Instructional Technology Services
University of Toronto Scarborough
harper at utsc.utoronto.ca



More information about the dovecot mailing list