Postfix

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Agent de transport de courrier (MTA)
Fichier principal /etc/postfix/main.cf
Commandes clés postconf, postqueue, postsuper, postmap
Service systemctl restart postfix
Voir aussi Configuration postfix · Postconf · Aliases

Postfix est un agent de transport de courrier électronique (MTA — Mail Transfer Agent) développé par Wietse Venema, conçu comme une alternative plus simple et plus sûre à Sendmail tout en restant compatible avec lui en ligne de commande (sendmail, mailq, newaliases). C'est le MTA par défaut de la plupart des distributions Linux modernes (RHEL/CentOS depuis la version 5, Debian/Ubuntu).

Architecture

Postfix n'est pas un unique démon mais un ensemble de petits processus spécialisés, orchestrés par master et communiquant par files d'attente sur disque :

  • smtpd — reçoit le courrier entrant (port 25)
  • cleanup — normalise et met en file les messages reçus
  • qmgr — gestionnaire de file d'attente, planifie la livraison
  • smtp — envoie le courrier sortant vers d'autres MTA
  • local / virtual — livraison locale

Cette séparation en petits processus, chacun avec un minimum de privilèges, est un des arguments de sécurité historiques de Postfix face à l'architecture monolithique de Sendmail.

Configuration

Le fichier de configuration principal est /etc/postfix/main.cf (voir Configuration postfix pour le détail des directives usuelles, et Postconf pour la commande d'inspection/édition à chaud). Un second fichier, master.cf, définit les processus lancés et leurs paramètres.

Scripts utiles

Lister les identifiants de messages en file d'attente (utile pour scripter des actions en masse avec Postsuper) :

for QUEUE_ID in $(mailq | grep -E '^[0-9A-F].* ' | awk '{ print $1 }' | cut -d '*' -f1); do
    echo "$QUEUE_ID"
done

Relayer via un serveur SMTP externe

Pour faire passer tout le courrier sortant par un relais SMTP intermédiaire (fournisseur d'accès, service anti-spam, passerelle interne) plutôt que de livrer en direct par MX :

relayhost = smtp.fournisseur.tld

Pour un relais différent selon le domaine destinataire (multi-relais), utiliser une table de transport plutôt qu'un unique relayhost :

# main.cf
transport_maps = hash:/etc/postfix/transport
# /etc/postfix/transport
@domaine-a.tld    [mail.prestataire-a.tld]
@domaine-b.tld    [mail.prestataire-b.tld]

Compiler la table après chaque modification (l'étape est systématiquement oubliée, c'est la cause n°1 d'une table de transport qui « ne prend pas ») :

postmap /etc/postfix/transport
systemctl restart postfix

Une approche alternative, à base de sender_dependent_relayhost_maps (relais choisi selon l'expéditeur plutôt que le destinataire), existe également mais est plus rarement nécessaire — réservée aux cas où plusieurs domaines d'envoi doivent sortir par des passerelles différentes (ex. délégation d'une partie du courrier vers un service tiers type Amazon SES).

Voir aussi