Mail server setup on Ubuntu Lucid

Update: I keep having to redo this setup and get tripped up on what to install all the time so here is the complete install line: apt-get install postfix dovecot opendkim postfix-mysql dovecot-pop3d dovecot-imapd which already assumes you’ve got mysql server installed.

Update: I just had to redo everything from scratch on a new build, here is how to add the virtual user:

groupadd -g 1001 virtual
useradd -g virtual -u 1001 virtual -d /var/spool/vmail -m

Update: I just got SMTP to work on a non default port. I applied the change described here, in my case I changed the line in master.cf so it looks like this:

26 inet n – n – – smtpd

I also applied the changes described by tumbleweed here, don’t know if they are required though, the above master.cf change for sure is. It broke mail receiving/fetching though, had to roll back and haven’t had time to investigate yet.

Update: The below tutorials seem to lack the proper apt-get line, well here it is: sudo apt-get install dovecot-imapd dovecot-pop3d postfix-mysql

Update: Also make sure you have 127.0.0.1 localhost in your /etc/hosts for smtp to work properly!

This is the first time I’ve seriously tried and actually managed to setup a mail server with all the bells and whistles like MySQL based storage of virtual users and passwords, authenticated SMTP relay (mail users can send via SMTP), POP3 and IMAP fetch of mail.

A big part of this massive success has got to do with the fact that I’m now using for instance Postfix 2.7 (apparently >= 2.3 is what you want to have, check which version you have with: postconf -d mail_version).


I first started out with this how to forge tutorial before I found what is probably the best linux email admin tutorial on the net, the ISPmail tutorial by Christoph Haas.

This development left me with a non ISPmail like setup when it comes to the mail directories which in my case looks like this: /var/spool/domain.com/user.name where the email address looks like this: user.name@domain.com. My mail user is also not called vmail but virtual.

Apart from that my setup does not differ from the ISPmail setup, below I merely show my main.cf, master.cf and dovecot.conf as that is something I find lacking with the ISPmail tutorial. You go through it never knowing if the reason for a problem you have is due to the fact that your own setup might differ in ways that are not discussed.

Therefore you have it below, the below config works but might not be optimized in various ways, like avoiding spam filters on outgoing mail for instance. My knowledge of these things are too limited to tell at the moment. This is a good start anyway.

In going through the ISPmail tutorial and you erase your /var/log/mail.log file and logging stops working you can get it running again by running: restart rsyslog.

myhostname = server-serverip.isp.net
mydomain = isp.net
mydestination = $myhostname, localhost.$mydomain, localhost
myorigin = isp.net
mynetworks = 67.89.45.34 127.0.0.0/8
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth
smtpd_sasl_auth_enable=yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_auth_only=no
mailbox_size_limit = 0
recipient_delimiter = +
virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_uid_maps = static:1001
virtual_gid_maps = static:1001
virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
virtual_transport=dovecot
dovecot_destination_recipient_limit=1

There is not much to add to the above, after creating the virtual user you can check what the GID and UID is by running id virtual. The 127.0.0.0/8 value is needed to allow code/scripts like Zend Mail (my preferred PHP email library) to send emails.

pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
	-o smtp_fallback_relay=
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix	-	n	n	-	2	pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}

The above is basically default except for the two last rows which were added in the process of completing the ISPmail tutorial.

protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = /var/spool/vmail/%d/%n
mail_privileged_group = mail

protocol imap {
}

protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}

protocol managesieve {

}

protocol lda {
  log_path = /var/spool/vmail/dovecot-deliver.log
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = hsarvell@gmail.com
  mail_plugins = sieve
}

auth default {
  mechanisms = plain login
  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  userdb passwd {

  }

  userdb static {
    args = uid=1001 gid=1001 home=/var/spool/vmail/%d/%n allow_all_users=yes
  }

  user = root
  
  socket listen {
    master {
        path = /var/run/dovecot/auth-master
        mode = 0600
        user = virtual
    }

    client {
        path = /var/spool/postfix/private/auth
        mode = 0660
        user = postfix
        group = postfix
    }
  }
  
  !include_try /etc/dovecot/auth.d/*.auth
}

dict {

}

plugin {

}

Also basically default with additions prescribed by the ISPmail tutorial, except for this line:

args = uid=1001 gid=1001 home=/var/spool/vmail/%d/%n allow_all_users=yes

It reflects my directory structure as explained above and my different uid and gid.

Note also the mail_plugins = sieve line, it’s not cmusieve like in the tutorial.

The /etc/dovecot/dovecot-sql.conf file:

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=root password=1234
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'

After going through the whole procedure on a new server I got this cryptic message in my /var/log/mail.log from the dovecot startup process:
dovecot: auth(default): Fatal: Socket already exists: /var/spool/postfix/private/auth
dovecot: dovecot: Fatal: Auth process died too early – shutting down

Commenting everything but the first mechanism statement in the file in /etc/dovecot/auth.d/ (mine is called 01-mail-stack-delivery.auth) took care of that problem.

Note that startup problems might be visible in /var/log/mail.log while runtime errors can be found in /var/log/mail.err.

Related Posts

Tags: , , ,