This is an old revision of the document!
ALERT: This is a document being rewritten, only experienced people should use this
This is an improved version from the original article in ispcp (http://isp-control.net/documentation/howto:mail:replace_courier_with_dovecot) All the parts related to the default install where removed since imscp already takes care of that, and it's focused to add the functionality that is available only on dovecot (instead of courier).
Please report any bugs/hints/whatever in the following board thread: http://forum.i-mscp.net/showthread.php?tid=61
NOTE: There are currently no means to configure the quota for imscp other than fiddling with the database. The functionality from http://www.isp-control.net/forum/thread-8483.html should be imported.
NOTE: If you want to edit the quota directly; it is stored in bytes in the table “mail_users” in a field named “quota”.
You can do it by re-running the installer and changing the default imap server when asked you can choose between courier or dovecot.
Create the sieve script to redirect spam to junk folder /etc/dovecot/sieve/dovecot.sieve If you have a spam filter such as amavis, it will add the header “X-Spam-Flag = yes”, with this little sieve all this mail will go to Junk folder in webmail. Very practical because all the users can check their own spam without the need of the server admin.
mkdir /etc/dovecot/sieve chown -R vmail:mail /etc/dovecot/sieve/ touch /etc/dovecot/sieve/dovecot.sieve
require "fileinto"; if exists "X-Spam-Flag" { if header :contains "X-Spam-Flag" "NO" { } else { fileinto "INBOX.Junk"; stop; } }
Set correct permissions for dovecot.conf (the deliver command accesses this file too)
chmod 0644 /etc/dovecot/dovecot.conf
Making a small change in postfix configuration, we can use the domain alias as a mail ailas. Being example2.com an alias of example1.com, whenever I create a mailbox in example1.com the same mailbox in example2.com becomes a redirection. So creating [email protected] will also receive the mail from [email protected] automatically.
/etc/postfix/mysql_virtual_domains.cf
user = ispcp_dovecot password = PASS_MAILRW hosts = 127.0.0.1 dbname = ispcp query = (SELECT domain_name FROM domain_aliasses INNER JOIN domain ON domain_aliasses.domain_id=domain.domain_id WHERE domain.domain_status='ok' AND domain.domain_mailacc_limit > '-1' AND domain_aliasses.alias_name='%s') UNION (SELECT domain_name FROM domain WHERE domain.domain_status='ok' AND domain.domain_mailacc_limit > '-1' AND domain_name='%s')
/etc/postfix/mysql_virtual_forwards.cf
user = ispcp_dovecot password = PASS_MAILRW hosts = 127.0.0.1 dbname = ispcp query = SELECT DISTINCT CONCAT(CONCAT(mail_users.mail_acc, "@"), domain.domain_name) from mail_users INNER JOIN domain ON mail_users.domain_id = domain.domain_id INNER JOIN domain_aliasses ON domain.domain_id = domain_aliasses.domain_id WHERE domain_aliasses.alias_name = '%d' AND mail_users.mail_acc = '%u'
You can configure Dovecot to execute an external command if an user's quota exceeds a specified limit. In this example the user receives alert emails if his quota exceeds 80% / 95% percent.
Append the following in your plugin section in /etc/dovecot/dovecot.conf:
quota_warning = storage=95%% /usr/local/bin/dovecot-quota-warning.sh 95 quota_warning2 = storage=80%% /usr/local/bin/dovecot-quota-warning.sh 80
If the user's quota reaches the limit the external script dovecot-quota-warning.sh is run. If you define quota warnings make sure that you start with the highest limit because Dovecot only runs the command for the first limit that is exceeded.
Create /usr/local/bin/dovecot-quota-warning.sh
#!/bin/sh PERCENT=$1 cat << EOF | /usr/lib/dovecot/deliver -d $USER -c /etc/dovecot/dovecot-no-quota-warning.conf From: [email protected] To: $USER Subject: quota warning Content-Type: text/plain; charset="UTF-8" Attention! The emails in your mailbox are using more than $PERCENT% of your total mail space. EOF
Create /etc/dovecot/dovecot-no-quota-warning.conf
This is basically the same file as dovecot.conf but the quota rules are stripped out in order to avoid looping. You can strip the quota lines manually or let it grep do for you:
grep -v "quota" dovecot.conf > dovecot-no-quota-warning.conf
At last set correct permissions to dovecot-no-quota-warning.conf
chmod 0644 /etc/dovecot/dovecot-no-quota-warning.conf
For more information about this have a look at http://wiki.dovecot.org/Quota/1.1
The parameters for master.cf in postfix need to be changed according the architecture of the system:
for Debian Squeeze (dovecot >= 1.2)
dovecot unix - n n - - pipe flags=DRhu user=vmail argv=/usr/lib/dovecot/deliver -d ${recipient} -s
for Debian Lenny (dovecot >= 1.0.15)
dovecot unix - n n - - pipe flags=DROhu user=vmail:mail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient} -s
for *BSD dovecot from port
dovecot unix - n n - - pipe flags=DROhu user=vmail:mail argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient} -s
for CentOS it should be something like this:
dovecot unix - n n - - pipe flags=DROhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
This will create also the database to store quota
mysql -u root -p mysql mysql> USE ispcp; mysql> CREATE TABLE quota_dovecot ( username varchar(100) not null, bytes bigint not null default 0, messages integer not null default 0, primary key (username) );
mysql> GRANT SELECT,INSERT,UPDATE ON imscp.quota_dovecot to 'ispcp_dovecot'@'localhost' mysql> FLUSH PRIVILEGES; mysql> QUIT;
Replace /etc/dovecot/dovecot.conf with the following one (you should backup the original because there are a lot of comments in it explaining all the configuration parameters).
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org
Then save this content as your /etc/dovecot/dovecot.conf
base_dir = /var/run/dovecot/ protocols = imap pop3 #Uncomment if using ssl #protocols = imap pop3 imaps pop3s disable_plaintext_auth = no listen=* syslog_facility = mail login_greeting = Dovecot ready. mail_location = maildir:%h mail_privileged_group = mail #Uncomment these lines to enable dovecot ssl support #Dovecot 1.2+ (i.e *BSD ports, lenny backport or squeeze) ssl = yes # #Certificate location #ssl_cert_file = /etc/ssl/certs/servername.crt #ssl_key_file = /etc/ssl/certs/servername.key protocol imap { mail_plugins = quota imap_quota } #Uncomment to enable debugging #mail_debug = yes #auth_debug = yes #auth_verbose = yes namespace private { prefix = INBOX. inbox = yes } protocol pop3 { pop3_uidl_format = %u-%v mail_plugins = quota } protocol lda { postmaster_address = [email protected] auth_socket_path = /var/run/dovecot/auth-master mail_plugins = quota sieve } auth default { mechanisms = plain login passdb checkpassword { args = /var/www/ispcp/engine/ispcp-dovecot-mngr } userdb sql { args = /etc/dovecot/dovecot-sql-domain.conf } userdb sql { args = /etc/dovecot/dovecot-sql-aliasdomain.conf } userdb sql { args = /etc/dovecot/dovecot-sql-subdomain.conf } socket listen { client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } master { path = /var/run/dovecot/auth-master mode = 0660 user = vmail group = mail } } user = root } #If you don't want to save quota occupation in a database, you should comment this: dict { quotadict = mysql:/etc/dovecot/dovecot-dict-sql.conf } plugin { #Enable sieve for everybody (in dovecot >= 1.2 it is configured here) global_script_path = /etc/dovecot/sieve/dovecot.sieve #Uncomment this if you are using managesieve or per-user rules #sieve = ~/sieve/.dovecot.sieve #sieve_dir = ~/sieve #Enable per-user quota #OPTION A: Using per user maildir files (no database) #quota = maildir:User quota #OPTION B: Using per user database quota (can be read from ispCP) quota = dict:user::proxy::quotadict quota_rule = *:bytes=1G }
Create a new file
/etc/dovecot/dovecot-sql-domain.conf
with the following content:
NOTE: In the SQL query for user_query there are uids and gids 'hardcoded'. The uid must be the uid of your vmail user and gid the gid of the mail group. Maybe you have to change the defaults (1001/8))
driver = mysql connect = host=localhost dbname=ispcp user=ispcp_dovecot password=PASS_MAILRW user_query = SELECT CONCAT('/var/mail/virtual/', domain.domain_name, '/',mail_acc) AS home, '1001' AS uid, '8' AS gid, CONCAT('maildir:storage=', FLOOR(quota/1024)) AS quota FROM mail_users INNER JOIN domain ON mail_users.domain_id = domain.domain_id WHERE mail_acc='%n' and domain.domain_name='%d' AND (mail_type='normal_mail' OR mail_type='normal_mail,normal_forward'); # Use this for Dovecot 1.1+ # user_query = SELECT CONCAT('/var/mail/virtual/', domain.domain_name, '/',mail_acc) AS home, '1001' AS uid, '8' AS gid, CONCAT('*:bytes=',quota,'B') AS quota_rule FROM mail_users INNER JOIN domain ON mail_users.domain_id = domain.domain_id WHERE mail_acc='%n' AND domain.domain_name='%d' AND (mail_type='normal_mail' OR mail_type='normal_mail,normal_forward'); #Use this if you don't want quota # user_query = SELECT CONCAT('/var/mail/virtual/', domain.domain_name, '/',mail_acc) AS home, '1001' AS uid, '8' AS gid FROM mail_users INNER JOIN domain ON mail_users.domain_id = domain.domain_id WHERE mail_acc='%n' AND domain.domain_name='%d' AND (mail_type='normal_mail' OR mail_type='normal_mail,normal_forward');
Create a new file
/etc/dovecot/dovecot-sql-subdomain.conf
with the following content:
(In the sql for user_query there are uids and gids 'hardcoded'. The uid must be the uid of vmail user and gid the gid of the mail group. Maybe you have to change the defaults (1001/8))
driver = mysql connect = host=localhost dbname=ispcp user=ispcp_dovecot password=PASS_MAILRW user_query = SELECT CONCAT('/var/mail/virtual/', subdomain.subdomain_name, ".", domain.domain_name, '/',mail_acc) AS home, '1001' AS uid, '8' AS gid FROM (mail_users INNER JOIN subdomain ON mail_users.sub_id = subdomain.subdomain_id) INNER JOIN domain ON mail_users.domain_id = domain.domain_id WHERE mail_acc='%n' and concat(subdomain.subdomain_name,".",domain.domain_name)='%d';
Create a new file
/etc/dovecot/dovecot-sql-aliasdomain.conf
with the following content:
(In the sql for user_query there are uids and gids 'hardcoded'. The uid must be the uid of vmail user and gid the gid of the mail group. Maybe you have to change the defaults (1001/8))
driver = mysql connect = host=localhost dbname=ispcp user=ispcp_dovecot password=PASS_MAILRW user_query = SELECT concat('/var/mail/virtual/', domain_aliasses.alias_name, '/',mail_acc) as home, '1001' as uid, '8' as gid FROM (mail_users INNER JOIN domain_aliasses ON mail_users.sub_id = domain_aliasses.alias_id) INNER JOIN domain ON mail_users.domain_id = domain.domain_id WHERE mail_acc='%n' and domain_aliasses.alias_name ='%d';
Create the file used to store the quotas on the db /etc/dovecot/dovecot-dict-sql.conf
# v1.2+ only: connect = host=localhost dbname=ispcp user=ispcp_dovecot password=PASS_MAILRW map { pattern = priv/quota/storage table = quota_dovecot username_field = username value_field = bytes } map { pattern = priv/quota/messages table = quota_dovecot username_field = username value_field = messages }