2e instance de postfix
Il peut parfois être utile d'avoir une 2e instance de postfix (sur une autre IP, pour d'autres domaines, etc…)
Tout ce qui suit est largement inspiré de http://advosys.ca/papers/postfix-instance.html (publié ici avec l'autorisation de l'auteur). Cette page n'est donc pas sous licence CC, vous devez demander la permission de l'auteur initial pour en reproduire tout ou partie (ma contribution est CC-by-sa).
Dans tout ce qui suit <ip2> doit être remplacé par l'ip spécifique à cette 2e instance.
- On duplique la conf postfix :
cp -a /etcv/postfix /etc/postfix2
- On édite /etc/postfix2/main.cf pour spécifier
myhostname = <host_concerné> alias_maps = hash:/etc/postfix2/conf.d/aliases alias_database = hash:/etc/postfix2/conf.d/aliases myorigin = $myhostname mydestination = $myhostname, localhost relayhost = mynetworks = <ip2> # on écoute seulement sur cette ip inet_interfaces = <ip2> # spécifique à une 2e instance de postfix queue_directory = /var/spool/postfix2 config_directory = /etc/postfix2 data_directory = /var/lib/postfix2 # les mails sortants partent via cette ip smtp_bind_address = <ip2> # facultatif, pour avoir une "facility" spécifique et pouvoir trier les logs dessus syslog_facility = local2 syslog_name = postfix2
(vous devez ajouter évidemment toutes les autres directives spécifiques à votre cas de figure, comme pour une configuration postfix “standard”)
- On crée une file d'attente spécifique à cette 2e instance, et le data_directory (sinon on a un message
fatal: open lock file /var/lib/postfix/master.lock: unable to set exclusive lock
)
# création de la 2e file (en root) mkdir /var/spool/postfix2 # init postfix -c /etc/postfix2 check # si postfix est en chroot, faut ajouter ces rep for r in etc usr lib; do cp -rp /var/spool/postfix/$r /var/spool/postfix2/; done; # le data_directory spécifique cp -a /var/lib/postfix /var/lib/postfix2
- il faut préciser au postfix principal (/etc/postfix/main.cf) qu'il y en a un autre qui tourne
alternate_config_directories = /etc/postfix2
Sinon, ça génère dans les logs des :
postfix2/sendmail[XXX]: warning: command "/usr/sbin/postdrop -r" exited with status 1 postfix2/sendmail[XXX]: fatal: user_concerne(id_user): unable to execute /usr/sbin/postdrop -r: Success
- pour tester, recharger le 1er postfix avec
/etc/init.d/postfix reload
et lancer cette 2e instance avecpostfix -c /etc/postfix2 start
(et l'arrêter avecpostfix -c /etc/postfix2 stop
) - script d'init : il faut créer le script d'init qui va bien pour cette 2e instance,
cp -a /etc/init.d/postfix /etc/init.d/postfix2
, remplacer dedans toutes les références à /etc/postfix par /etc/postfix2 et ajouter à chaque appel de binaire, postfix ou ${DAEMON}, l'option-c /etc/postfix2
; attention, il faut ajouter cette option avant l'action à faire (start|stop|etc.) )
Pour debian, ça donne /etc/init.d/postfix2 (script simplifié, j'ai pas réussi à faire fonctionner le stop sur la base de /etc/init.d/postfix avec le start-stop-daemon, pas trop cherché non plus…):
#!/bin/sh PATH=/bin:/usr/bin:/sbin:/usr/sbin DAEMON=/usr/sbin/postfix NAME=Postfix2 case "$1" in start) echo -n "Starting mail transport agent: Postfix2" $DAEMON -c /etc/postfix2 start 2>&1 | (grep -v 'starting the Postfix2' 1>&2 || /bin/true) echo "." ;; stop) echo -n "Stopping mail transport agent: Postfix2" $DAEMON -c /etc/postfix2 stop 2>&1 | (grep -v 'stopping the Postfix2' 1>&2 || /bin/true) echo "." ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0
- pour que php utilise ce 2e postfix, il suffit de préciser
sendmail_path = /usr/sbin/sendmail -t -i -C /etc/postfix2
dans le php.ini concerné (ou dans le vhost apache). - pour tester :
echo -e "Subject: Test postfix2\r\n\r\nUn message de test">msg sudo -u <user_local_qui_peut_poster> /usr/sbin/sendmail -i -C /etc/postfix2 user@example.com <msg