Na aanleiding van een vorige post over Postfix, ben ik begonnen met een mailcluster. Een onderdeel hiervan is een inkomende email server. Deze inkomende email server ontvangt email vanaf het internet. Er wordt gecheckt of deze emails voor onze domeinen bestemd zijn door middel van een MySQL database.

Als we de email accepteren zullen we deze doorsturen naar de server die het verder afhandelt.

Zoals al mijn server beginnen ik met de installatie van Ubuntu 10.04 inclusief vim en openssh-server.
Hierna installeer ik postfix en postfix-mysql
apt-get install postfix postfix-mysql

Om email te accepteren voor gebruikers en domeinen welke geen echte gebruikers en domeinen zijn op onze server, moeten we gebruik maken van virtuele gebruikers en domeinen.
Dit is in te stellen in /etc/postfix/main.cf

/etc/postfix/main.cf:
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:111
virtual_mailbox_base = /srv/vmail
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 103
virtual_transport = virtual
virtual_uid_maps = static:103
transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf

proxy:mysql:bestandnaam wil zeggen dat de gegevens uit de database gehaald moeten worden. Door middel van proxy wordt de database verbinding herbruikt. Hierdoor worden er minder verbindingen naar de database geopend.

De volgende bestanden roepen de database aan.

/etc/postfix/mysql_virtual_alias_maps.cf:
user = <database gebruikersnaam>
password = <database wachtwoord>
hosts = <database server>
dbname = <database naam>
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
# query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

/etc/postfix/mysql_virtual_domains_maps.cf:
user = <database gebruikersnaam>
password = <database wachtwoord>
hosts = <database server>
dbname = <database naam>
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
# query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' \
# AND active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf:
user = <database gebruikersnaam>
password = <database wachtwoord>
hosts = <database server>
dbname = <database naam>
table = mailbox
select_field = CONCAT(domain,'/',username) AS maildir
where_field = CONCAT(username,'@',domain)
additional_conditions = and active = '1'
# query = SELECT CONCAT(username,'@',domain) AS maildir FROM mailbox \
# WHERE CONCAT(username,'@',domain)='%s' AND active = '1'

/etc/postfix/mysql_virtual_transports.cf:
user = <database gebruikersnaam>
password = <database wachtwoord>
hosts = <database server>
dbname = <database naam>
table = domain
select_field = transport
where_field = domain
additional_conditions = and active = '1'
# query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'

De bestanden spreken redelijk voor zich. De database structuur is de structuur die postfixadmin gebruikt. Het bestand mysql_virtual_transport.cf wordt gebruikt om aan te geven, op welke server de email afgeleverd moet worden.

Als dit alles ingesteld is, kan postfix herstart worden en kun je beginnen met ontvangen van email.
service postfix restart

Mocht er toch nog iets niet goed gaat, dan kan er in het logbestand (/var/log/mail.info) gekeken worden.