Why?

Due to a complete power loss at hetzner I had to reboot my server (crying). After reboot I had the problem that courier was restartet and what should I say - it was unable to load the *.so files for the vpopmail support. As it looks like upstream has stopped to support vpopmail. So I'd to find a different new solution and I've decided to kick qmail -> I switched to Postfix. Of course I am running gentoo and have followed (at least parts of it) this doku.

What I've missed in this doku was all about delivering and filtering the mails. Therefore I'll describe here what I've done.

SQL table

I've done some slight different handling of the homedir in the user table.

In the following I assume some virtual mailing directory like the following

/var/vmail/ -\
             |
             |- foo-domain.com/ -\
             |                   |- user1/.maildir
             |                   |- user2/.maildir
             |
             |- bar-domain.com/ -\
                                 |- user1/.maildir
                                 |- user2/.maildir

I'd suggest to set the homedir for each user to /var/vmail/${domain} and not to /var/vmail as suggested in the howto. Therefore the maildrop rules in one file apply to a domain - seams the more natural way to me.

Postfix modifications

In the main.cf we have to modify the transport mechanism. Therefore the following 2 lines are important.

maildrop_destination_recipient_limit = 1
virtual_transport = maildrop

The next part is to modify the master.cf to configure the maildrop handling

maildrop  unix  -       n       n       -       -       pipe
      flags=ODRhu user=vmail argv=/path/to/maildrop -d ${recipient} ${user} ${domain}

I've appended ${user} and ${domain} to use the data as $1 and $2 resp. in the .mailfilter. Some more information on which my configuration is based can be found here. The variables which are provided by the postifx pipe are described in the manpage.

Maildrop

A very cute way to check if maildrop is working correctly - especially together with the courier authlib is the following statement.

$ echo "Hello" | maildrop -V 5 user1@foo-domain.com user1 foo-domain.com
maildrop: authlib: groupid=1006
maildrop: authlib: userid=1006
maildrop: authlib: logname=user1@foo-domain.com, home=/var/vmail/foo-domain.com, mail=/var/vmail/foo-domain.com/user1/.maildir
maildrop: Changing to /var/vmail/foo-domain.com
Message start at 0 bytes, envelope sender=hugo@eierbaer.at
...

I've placed the .mailfilter file inside of /var/vmail/${domain}. And you should see the filtering - of course you can even feed maildrop with a real testmail:

$ cat ${test_file} | maildrop -V 5 user1@foo-domain.com user1 foo-domain.com

And here some example .mailfilter file

MAILBOX = "/var/vmail/$2/$1/.maildir"

if( /^Subject:.*\*\*\*SPAM\*\*\*/ )
{ 
  to "${MAILBOX}/.spam"
}

if( ${1}=="gentoo" )
{ 

  if( /^From:.*bugzilla-daemon@gentoo.org/ )
  { 
    to "${MAILBOX}/.gentoo-bgo"
  }

  if( /^Subject:.*\[gentoo-dev\]/ )
  { 
    to "${MAILBOX}/.gentoo-dev"
  }

  if( /^Subject:.*\[gentoo-dev-announce\]/ )
  { 
    to "${MAILBOX}/.gentoo-dev-announce"
  }

  if( /^Subject:.*\[gentoo-project\]/ )
  { 
    to "${MAILBOX}/.gentoo-project"
  }

  if( /^Subject:.*\[gentoo-core\]/ )
  { 
    to "${MAILBOX}/.gentoo-core"
  }

  if( /^(To|Cc):.*heimdal-discuss@sics.se/ )
  { 
    to "${MAILBOX}/.heimdal"
  }

  if( /^Subject:.*\[Heimdal-bugs]/ )
  { 
    to "${MAILBOX}/.heimdal"
  }

}

to $MAILBOX

Happy hacking!