First, add your server to mx zone.
Install postfix :
# pacman-g2 -Sy postfix
Create Mysql database :
CREATE DATABASE `postfix`;
USE postfix;
--
-- Structure de la table `domain`
--
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';
--
-- Structure de la table `mailbox`
--
CREATE TABLE `mailbox` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`actif` tinyint(1) NOT NULL default '1',
`imap` tinyint(1) NOT NULL default '1',
`pop3` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites Emails Virtuelles';
--
-- Structure de la table `alias`
--
CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias Virtuels';
Create vmail group/user :
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m
Configure postfix (adapt configuration with your server)
# cd /etc/postfix/
# nano main.cf
# /etc/postfix/main.cf
# Configuration Postfix
#
config_directory = /etc/postfix
daemon_directory = /usr/lib/postfix
mailq_path = /usr/bin/mailq
newaliases_path = /usr/bin/newaliases
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
smtpd_banner = $myhostname ESMTP (frugalware/GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes
# ajoute le domaine aux emails de la distribution locale
# ainsi vous pourrez envoyer des emails sans @domain.priv
# par la commande sendmail
mydomain = domain.priv
append_dot_mydomain = yes
# Envoi une alerte de dépassement de délai par email
#delay_warning_time = 4h
myhostname = frogdev.org
# domaine de distribution local
mydestination = localhost, localhost.localdomain
# Mettez ici le relais smtp de votre FAI si vous avez des problèmes de blacklist
# à cause de votre IP
relayhost =
# adresseIP/Masque des réseaux locaux (réseaux autorisés pour l'envoi de courier)
mynetworks = 127.0.0.0/8
inet_interfaces = all
#restrictions d'accès
# adresses d'expédition
# le "reject_unknown_sender_domain" verifie que le domaine existe
smtpd_sender_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
warn_if_reject reject_unverified_sender
# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient
# client
smtpd_client_restrictions =
reject_unknown_client,
permit_mynetworks
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf,mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine, essayez plus tard."
virtual_overquota_bounce = yes
Edit mysql-virtual_domains.cf :
# mysql-virtual_domains.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif=1
Edit mysql-virtual_mailboxes.cf
# mysql-virtual_mailboxes.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif=1
Edit mysql-virtual_aliases.cf
# mysql-virtual_aliases.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif=1
Edit mysql-virtual_aliases_mailbox.cf
# mysql-virtual_aliases_mailbox.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif=1
Edit mysql-virtual_mailbox_limit_maps.cf
# mysql-virtual_mailbox_limit_maps.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = quota
table = mailbox
where_field = email
Fix permission :
# chgrp postfix /etc/postfix/mysql-virtual_*.cf
# chmod u=rw,g=r,o= /etc/postfix/mysql-virtual_*.cf
# chown postfix:postfix /var/spool/postfix/saved
Configure alias :
# touch /etc/aliases
# postalias hash:/etc/aliases
Restart postfix and test it :
# systemctl start postfix.service
# /usr/sbin/chkconfig --add rc.postfix
# postfix reload
Install and configure courier
# pacman-g2 -Sy courier-authlib courier-imap
authdaemonrc will use mysql
# nano /etc/courier/authdaemonrc
authmodulelist="authmysql"
Configure mysql access
# nano /etc/courier/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD MOTDEPASSE
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/var/spool/vmail/"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
MYSQL_QUOTA_FIELD quota
Enable service :
# mkdir -p /var/run/courier
# mkdir -p /var/run/courier/authdaemon
# service courier-authlib start
# service courier-authlib add
# service courier-pop3d start
# service courier-pop3d add
# service courier-imapd start
# service courier-imapd add
Verify your mx zone
# pacman-g2 -S bind
# host -t MX frogdev.org
Result : frogdev.org mail is handled by 1 mx.frogdev.org. => cool :D
Create a domain and a mail adress
# mysql -p
use postfix
INSERT INTO `domain` (`domain`,`actif`) VALUES ('test',1);
INSERT INTO `mailbox` (`email`,`password`,`quota`,`actif`,`imap`,`pop3`)
VALUES ('user@domain.priv',ENCRYPT('secret'),0,1,1,1);
Now you can receive mail and send mail from localhost
Use sasl for securise sendmail :
# pacman-g2 -S saslauthd pam-mysql
Edit smtpd_recipient_restrictions section :
# nano /etc/postfix/main.cf
# Support SASL
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path = smtpd
Configure saslauthd :
# nano /etc/sysconfig/saslauthd
# /etc/sysconfig/saslauthd
# set this value to 0 if you want to start saslauthd
SASL_DIE=0
# set the authentication mechanism
auth_mechanism="pam" # authentication mechanism can be:
# extra options
options="-r"
Configure pam smtp :
# nano /etc/pam.d/smtp
auth required pam_mysql.so user=root passwd=rootpassword host=127.0.0.1 db=postfix table=mailbox usercolumn=email passwdcolumn=password crypt=1 md5=1
account sufficient pam_mysql.so user=root passwd=rootpassword host=127.0.0.1 db=postfix table=mailbox usercolumn=email passwdcolumn=password crypt=1 md5=1
restart saslauthd :
# service saslauthd start
# service saslauthd add
add SASL to POSTFIX group
# usermod -G daemon postfix
# nano /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
# mkdir -p /etc/sasl2
# ln -s /etc/postfix/sasl/smtpd.conf /etc/sasl2/smtpd.conf
You can send/receive create account ....
You can install roundcube for have a webmail.