The challenge of customizing Dovecot

Robert Moskowitz rgm at htt-consult.com
Sun Mar 19 20:57:32 EET 2017


I have been running Dovecot for sometime, but I have just used someone 
else efforts on customizing it.  Many of these throw out the 
dovecot/conf.d files for a single dovecot.conf with no explanation on 
what does what.  So tell you a few conf.d files to edit.

So over the past few days, I have rolled up my sleeves and did my best 
to work out how to modify the proper conf.d files.  To 'stay true' to 
the Dovecot maintainer's config organization.

The target is Centos7 with Dovecot 2.2.10-7

It was HARD!

Besides dovecot.conf, I had to modify 13 conf.d files.  Add 3 .ext files 
in /etc/dovecot, and set up sieve.

I will soon have my total instructions available on my server, but to 
share with you what I have done for Dovecot customization and maybe to 
get some recommendations on improvements.  For the most part, I have 
used SED to modify the conf files.

I use a few env variables:

your_domain_tld=
your_host_only=
your_host_tld=$your_host_only.$your_domain_tld
Postfix_Database_Password=


What follows are the pieces of my customization, all comments welcomed 
(this is NOT adequately tested! That is later in the week!):

sed -i -e "/^#protocols/s/$/ sieve/w /dev/stdout" /etc/dovecot/dovecot.conf
sed -i -e "s/^#protocols/protocols/w /dev/stdout" /etc/dovecot/dovecot.conf
sed -i -e "s/#quota = /sqlquota = /w /dev/stdout" /etc/dovecot/dovecot.conf

sed -i -e "/^auth_mechanisms/s/$/ login/w /dev/stdout" 
/etc/dovecot/conf.d/10-auth.conf
sed -i -e 's/^#!include auth-sql.conf.ext/!include auth-sql.conf.ext/w 
/dev/stdout' /etc/dovecot/conf.d/10-auth.conf

sed -i -e "0,/#userdb {/ s/#userdb {/userdb {/w /dev/stdout" 
/etc/dovecot/conf.d/auth-sql.conf.ext
sed -i -e "s/#  driver = prefetch/  driver = prefetch\n }/w /dev/stdout" 
/etc/dovecot/conf.d/auth-sql.conf.ext

sed -i -e "/^#mail_location/s/$/maildir:\/home\/vmail\/%d\/%n/w 
/dev/stdout" /etc/dovecot/conf.d/10-mail.conf
sed -i -e "s/^#mail_location/mail_location/w /dev/stdout" 
/etc/dovecot/conf.d/10-mail.conf
sed -i -e "s/first_valid_uid = 1000/first_valid_uid = 101/w /dev/stdout" 
/etc/dovecot/conf.d/10-mail.conf
sed -i -e "s/#first_valid_gid = 1/first_valid_gid = 12/w /dev/stdout" 
/etc/dovecot/conf.d/10-mail.conf

sed -i "/unix_listener auth-userdb/ a mode = 0666\n     user = 
vmail\n     group = mail" /etc/dovecot/conf.d/10-master.conf
sed -i "/#unix_listener \/var\/spool/ a mode = 0666\n     user = 
postfix\n     group = postfix\n   }" /etc/dovecot/conf.d/10-master.conf
sed -i -e "s/#unix_listener \/var\/spool/unix_listener \/var\/spool/w 
/dev/stdout" /etc/dovecot/conf.d/10-master.conf
sed -i "/unix_listener dict/ a mode = 0666\n     user = vmail\n group = 
mail" /etc/dovecot/conf.d/10-master.conf
sed -i -e "s/^mode/     mode/w /dev/stdout" 
/etc/dovecot/conf.d/10-master.conf

sed -i -e 
"s/dovecot\/certs\/dovecot.pem/tls\/certs\/$your_host_tld.crt/w 
/dev/stdout" /etc/dovecot/conf.d/10-ssl.conf
sed -i -e 
"s/dovecot\/private\/dovecot.pem/tls\/private\/$your_host_tld.key/w 
/dev/stdout" /etc/dovecot/conf.d/10-ssl.conf

sed -i -e "/^#postmaster_address/s/$/ postmaster@$your_domain_tld/w 
/dev/stdout" /etc/dovecot/conf.d/15-lda.conf
sed -i -e "s/^#postmaster_address/postmaster_address/w /dev/stdout" 
/etc/dovecot/conf.d/15-lda.conf
sed -i "/#mail_plugins/ a mail_plugins = quota sieve" 
/etc/dovecot/conf.d/15-lda.conf
sed -i -e "s/^mail_plugins/  mail_plugins/w /dev/stdout" 
/etc/dovecot/conf.d/15-lda.conf
sed -i -e "s/^#lda_mailbox_autocreate = no/lda_mailbox_autocreate = 
yes/w /dev/stdout" /etc/dovecot/conf.d/15-lda.conf
sed -i -e "s/^#lda_mailbox_autosubscribe = no/lda_mailbox_autosubscribe 
= yes/w /dev/stdout" /etc/dovecot/conf.d/15-lda.conf

sed -i "/#mail_plugins / a mail_plugins = quota imap_quota trash" 
/etc/dovecot/conf.d/20-imap.conf
sed -i -e "s/^mail_plugins/  mail_plugins/w /dev/stdout" 
/etc/dovecot/conf.d/20-imap.conf
sed -i "/#imap_client_workarounds/ a  imap_client_workarounds = 
delay-newmail" /etc/dovecot/conf.d/20-imap.conf

sed -i "/#mail_plugins/ a mail_plugins = sieve" 
/etc/dovecot/conf.d/20-lmtp.conf
sed -i -e "s/^mail_plugins/  mail_plugins/w /dev/stdout" 
/etc/dovecot/conf.d/20-lmtp.conf
sed -i -e "s/^#lmtp_save_to_detail_mailbox = 
no/lmtp_save_to_detail_mailbox = yes/w /dev/stdout" 
/etc/dovecot/conf.d/20-lmtp.conf

sed -i -e "s/#service managesieve-login/service managesieve-login/w 
/dev/stdout" /etc/dovecot/conf.d/20-managesieve.conf
sed -i -e "s/#inet_listener sieve {/inet_listener sieve {/w /dev/stdout" 
/etc/dovecot/conf.d/20-managesieve.conf
sed -i -e "s/#  port = 4190/  port = 4190\n  }/w /dev/stdout" 
/etc/dovecot/conf.d/20-managesieve.conf
sed -i "/#vsz_limit/ a }" /etc/dovecot/conf.d/20-managesieve.conf

sed -i "/#mail_plugins/ a mail_plugins = quota" 
/etc/dovecot/conf.d/20-pop3.conf
sed -i -e "s/^mail_plugins/  mail_plugins/w /dev/stdout" 
/etc/dovecot/conf.d/20-pop3.conf
sed -i "/#pop3_client_workarounds/ a pop3_client_workarounds = 
outlook-no-nuls oe-ns-eoh" /etc/dovecot/conf.d/20-pop3.conf

sed -i -e "s/#acl = /acl = /w /dev/stdout" /etc/dovecot/conf.d/90-acl.conf

sed -i -e "s/#sieve_before =/sieve_before = 
\/home\/sieve\/globalfilter.sieve/w /dev/stdout" 
/etc/dovecot/conf.d/90-sieve.conf

cat <<EOF>>/etc/dovecot/conf.d/90-quota.conf || exit 1
plugin {
   quota = dict:user::proxy::sqlquota
   trash = /etc/dovecot/dovecot-trash.conf.ext
}
EOF

cat <<EOF>/etc/dovecot/dovecot-trash.conf.ext || exit 1
# Spam mailbox is emptied before Trash
1 Spam
# Trash mailbox is emptied before Sent
# 2 Trash
# If both Sent and "Sent Messages" mailboxes exist, the next oldest message
# to be deleted is looked up from both of the mailboxes.
# 3 Sent
# 3 Sent Messages
EOF

cat <<EOF>/etc/dovecot/dovecot-sql.conf.ext || exit 1
driver = mysql
connect = host=localhost dbname=postfix user=postfix 
password=$Postfix_Database_Password
default_pass_scheme = MD5-CRYPT

# following should all be on one line.
password_query = SELECT username as user, password, 
concat('/home/vmail/', maildir) as userdb_home, 
concat('maildir:/home/vmail/', maildir) as userdb_mail, 101 as 
userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND 
active = '1'

# following should all be on one line
user_query = SELECT concat('/home/vmail/', maildir) as home, 
concat('maildir:/home/vmail/', maildir) as mail, 101 AS uid, 12 AS gid, 
CONCAT('*:messages=30000:bytes=', quota) as quota_rule FROM mailbox 
WHERE username = '%u' AND active = '1'
EOF

cat <<EOF>/etc/dovecot/dovecot-dict-sql.conf.ext || exit 1
connect = host=localhost dbname=postfix user=postfix 
password=$Postfix_Database_Password
map {
   pattern = priv/quota/storage
   table = quota2
   username_field = username
   value_field = bytes
}
map {
   pattern = priv/quota/messages
   table = quota2
   username_field = username
   value_field = messages
}
EOF

mkdir /home/sieve
cat <<EOF>/home/sieve/globalfilter.sieve || exit 1
require "fileinto";
   if header :contains "X-Spam-Flag" "YES" {
     fileinto "Spam";
   }
   if header :contains "subject" "***SPAM***" {
     fileinto "Spam";
   }
EOF

sievec /home/sieve/globalfilter.sieve
chown -R vmail:mail /home/sieve



More information about the dovecot mailing list