[Dovecot] Using a Sieve script to handle delivery to public mailboxes
Alessandro Menti
alessandro.menti at hotmail.it
Sat Mar 15 13:57:05 UTC 2014
Hello everyone,
I'm setting up a Postfix+Dovecot stack with virtual domains and public
mailboxes.
I set up a shared mailbox "office at mydomain.com" as described in the
Dovecot Wiki [1], that is:
- I created the directory "/var/mail/mydomain.com/public/" and inside
it I created the ".office" mailbox;
- I added an appropriate ACL to allow the account
"president at mydomain.com" to read and edit that mailbox under a public
namespace;
- I added a Sieve script to handle delivery to the public mailbox (its
location is /var/mail/mydomain.com/public/.office/.dovecot.sieve).
Some other relevant details about my configuration:
- The backend used by Postfix and Dovecot to handle virtual
aliases/domains/maps is a MySQL database. Since the virtual user
table is used by other applications as well, I decided to keep it
"clean" and to make use of another "virtual mailboxes" table (see
/etc/dovecot/dovecot-sql.conf.ext below). The password_query setting
returns only results from the virtual user table (so that only real
users can authenticate on the IMAP server), while the user_query
setting returns results from both the virtual user and the virtual
mailbox table (so that dovecot-lda can choose the correct mailbox).
- The queries saved in password_query and user_query return the correct
results when executed manually: the home directory for the
"office at mydomain.com" virtual mailbox is set to /var/mail/mydomain.com
/public/.office.
- Delivery from and to the "president at mydomain.com" account is regular,
and that account is able to access the "office at mydomain.com" virtual
mailbox (I have tested this by speaking IMAP to the server and by
performing a manual check using Thunderbird).
I encountered a problem with this setup: when I send a message to the
"office at mydomain.com" account, the Postfix logs say it is correctly
delivered via Dovecot, but the Sieve script says it can not find the
folder "Public/.office". As a consequence, Dovecot creates a new Maildir
in /var/mail/mydomain.com/office and delivers the mail there instead of
saving it in the correct directory (/var/mail/mydomain.com/public/.office).
Is there something I set incorrectly in my configuration? What is
causing Dovecot not to recognize the correct mailbox during delivery? Is
there a way to list all mailboxes seen by dovecot-lda itself?
Thanks,
Alessandro Menti
[1] http://wiki2.dovecot.org/SharedMailboxes/Public
-----
Dovecot and OS version: 2.0.19, Ubuntu 12.04 LTS
Output of "dovecot -n":
> # 2.0.19: /etc/dovecot/dovecot.conf
> # OS: Linux 3.5.0-46-generic i686 Ubuntu 12.04.4 LTS ext4
> auth_mechanisms = plain login
> login_greeting = IMAP server ready.
> mail_debug = yes
> mail_gid = vmail
> mail_location = maildir:/var/mail/%d/%n/Maildir
> mail_plugins = acl
> mail_uid = vmail
> namespace {
> inbox = yes
> location =
> prefix =
> separator = /
> type = private
> }
> namespace {
> list = children
> location = maildir:/var/mail/mydomain.com/public
> prefix = Public/
> separator = /
> subscriptions = no
> type = public
> }
> passdb {
> args = /etc/dovecot/dovecot-sql.conf.ext
> driver = sql
> }
> plugin {
> acl = vfile
> sieve = ~/.dovecot.sieve
> sieve_before = /var/mail/sieve/
> sieve_dir = ~/sieve
> }
> postmaster_address = postmaster at mydomain.com
> protocols = " imap"
> service auth {
> unix_listener /var/spool/postfix/private/auth {
> group = postfix
> mode = 0660
> user = postfix
> }
> unix_listener auth-userdb {
> group = vmail
> mode = 0660
> user = dovecot
> }
> }
> ssl_cert = </etc/ssl/srvcerts/mailcert-withintcas.cer
> ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:AES256-SHA256:AES256-SHA:RC4-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
> ssl_key = </etc/ssl/private/mailcert.pvk
> userdb {
> args = /etc/dovecot/dovecot-sql.conf.ext
> driver = sql
> }
> protocol lda {
> info_log_path = /var/log/dovecot-lda.log
> log_path = /var/log/dovecot-lda-errors.log
> mail_plugins = acl sieve
> }
> protocol imap {
> mail_plugins = acl imap_acl
> }
/etc/dovecot/dovecot-sql.conf.ext:
> driver = mysql
> connect = host=127.0.0.1 dbname=dbname user=username password=password
> default_pass_scheme = SHA512-CRYPT
> password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
> user_query = SELECT home FROM virtual_users WHERE email = '%u' UNION SELECT home FROM virtual_shared_mailboxes WHERE email = '%u'
Extract from /var/log/mail.log:
> Mar 15 11:43:07 phoenix postfix/pickup[1404]: 3BA221FFD1: uid=0 from=<sysadmin>
> Mar 15 11:43:07 phoenix postfix/cleanup[4871]: 3BA221FFD1: message-id=<20140315104307.3BA221FFD1 at mail.mydomain.com>
> Mar 15 11:43:07 phoenix postfix/qmgr[7691]: 3BA221FFD1: from=<sysadmin at mydomain.com>, size=316, nrcpt=1 (queue active)
> Mar 15 11:43:07 phoenix dovecot: auth-worker: mysql(127.0.0.1): Connected to database mailserver
> Mar 15 11:43:07 phoenix postfix/pipe[4875]: 3BA221FFD1: to=<office at mydomain.com>, relay=dovecot, delay=0.15, delays=0.05/0.03/0/0.07, dsn=2.0.0, status=sent (delivered via dovecot service)
> Mar 15 11:43:07 phoenix postfix/qmgr[7691]: 3BA221FFD1: removed
Extract from /var/log/dovecot-lda.log:
> Mar 15 11:43:07 lda: Debug: Loading modules from directory: /usr/lib/dovecot/modules
> Mar 15 11:43:07 lda: Debug: Module loaded: /usr/lib/dovecot/modules/lib01_acl_plugin.so
> Mar 15 11:43:07 lda: Debug: Module loaded: /usr/lib/dovecot/modules/lib90_sieve_plugin.so
> Mar 15 11:43:07 lda: Debug: auth input: office at mydomain.com home=/var/mail/mydomain.com/public/.office
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: Effective uid=1002, gid=999, home=/var/mail/mydomain.com/public/.office
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: No acl_shared_dict setting - shared mailbox listing is disabled
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: Namespace : type=private, prefix=, sep=/, inbox=yes, hidden=no, list=yes, subscriptions=yes location=maildir:/var/mail/mydomain.com/office/Maildir
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: maildir++: root=/var/mail/mydomain.com/office/Maildir, index=, control=, inbox=/var/mail/mydomain.com/office/Maildir, alt=
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: Namespace : /var/mail/mydomain.com/office/Maildir doesn't exist yet, using default permissions
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: Namespace : Using permissions from /var/mail/mydomain.com/office/Maildir: mode=0700 gid=-1
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: initializing backend with data: vfile
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: acl username = office at mydomain.com
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: owner = 1
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl vfile: Global ACL directory: (none)
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: Namespace : type=public, prefix=Public/, sep=/, inbox=no, hidden=no, list=children, subscriptions=no location=maildir:/var/mail/mydomain.com/public
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: maildir++: root=/var/mail/mydomain.com/public, index=, control=, inbox=, alt=
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: initializing backend with data: vfile
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: acl username = office at mydomain.com
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: owner = 0
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl vfile: Global ACL directory: (none)
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl: No acl_shared_dict setting - shared mailbox listing is disabled
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: none: root=, index=, control=, inbox=, alt=
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: Destination address: office at mydomain.com (source: user at hostname)
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: sieve: include: sieve_global_dir is not set; it is currently not possible to include `:global' scripts.
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: sieve: using sieve path for user's script: /var/mail/mydomain.com/public/.office/.dovecot.sieve
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: sieve: opening script /var/mail/mydomain.com/public/.office/.dovecot.sieve
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: sieve: script binary /var/mail/mydomain.com/public/.office/.dovecot.svbin successfully loaded
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: sieve: binary save: not saving binary /var/mail/mydomain.com/public/.office/.dovecot.svbin, because it is already stored
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: sieve: executing script from /var/mail/mydomain.com/public/.office/.dovecot.svbin
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl vfile: reading file /var/mail/mydomain.com/public/.office/dovecot-acl
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl vfile: file /var/mail/mydomain.com/public/dovecot-acl not found
> Mar 15 11:43:07 lda(office at mydomain.com): Debug: acl vfile: file /var/mail/mydomain.com/office/Maildir/dovecot-acl not found
> Mar 15 11:43:07 lda(office at mydomain.com): Info: sieve: msgid=<20140315104307.3BA221FFD1 at mail.mydomain.com>: stored mail into mailbox 'INBOX'
Extract from /var/mail/mydomain.com/public/.office/.dovecot.sieve.log:
> sieve: info: started log at Mar 15 11:43:07.
> error: msgid=<20140315104307.3BA221FFD1 at mail.mydomain.com>: failed to store into mailbox 'Public/office': Mailbox doesn't exist: office.
Listing of /var/mail/mydomain.com/public/.office:
> $ sudo ls /var/mail/mydomain.com/public/.office -lA
> total 56
> drwxr-x--- 2 vmail vmail 4096 mar 14 17:14 cur
> -rw-r--r-- 1 root root 98 mar 9 18:05 dovecot-acl
> -rw-r----- 1 vmail vmail 18432 mar 15 10:36 dovecot.index.cache
> -rw-r----- 1 vmail vmail 1088 mar 15 10:36 dovecot.index.log
> -rw-r--r-- 1 vmail vmail 0 mar 14 21:50 dovecot-shared
> -rw-r--r-- 1 root root 50 mar 15 11:42 .dovecot.sieve
> -rw------- 1 vmail vmail 188 mar 15 11:43 .dovecot.sieve.log
> -rw-r--r-- 1 vmail vmail 124 mar 15 11:42 .dovecot.svbin
> -rw-r----- 1 vmail vmail 98 mar 14 17:13 dovecot-uidlist
> drwxr-x--- 2 vmail vmail 4096 mar 14 16:25 new
> drwxr-x--- 2 vmail vmail 4096 mar 15 08:48 tmp
Contents of /var/mail/mydomain.com/public/.office/.dovecot.sieve:
> require "fileinto";
> fileinto "Public/office";
ACL for the "office" shared mailbox:
> $ sudo cat /var/mail/mydomain.com/public/.office/dovecot-acl
> user=president at mydomain.com lrwstipe
Transcript of an IMAP session listing all folders:
> * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] IMAP server ready.
> a01 LOGIN president at mydomain.com password
> a01 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS ACL RIGHTS=texk] Logged in
> a02 LIST "" "*"
> * LIST (\HasNoChildren) "/" "Infected Items"
> * LIST (\HasNoChildren) "/" "Recycle Bin"
> * LIST (\HasNoChildren) "/" "Spam"
> * LIST (\HasNoChildren) "/" "Trash"
> * LIST (\HasNoChildren) "/" "Drafts"
> * LIST (\HasNoChildren) "/" "Sent Mail"
> * LIST (\HasNoChildren) "/" "INBOX"
> * LIST (\HasNoChildren) "/" "Public/office"
> a02 OK List completed.
> a03 LOGOUT
> * BYE Logging out
> a03 OK Logout completed.
More information about the dovecot
mailing list