Postfix Configuration · 15 min read · Jan 04, 2026
Répondeurs automatiques pour accompagner les utilisateurs virtuels et les domaines avec Postfix, Courier et MySQL
Répondeurs automatiques pour accompagner les utilisateurs virtuels et les domaines avec Postfix, Courier et MySQL
Ce guide se concentre sur le fonctionnement de Yaa! (Yet Another Autoresponder!) avec Debian Sarge et le tutoriel sur les utilisateurs virtuels sur Postfix (voir https://www.howtoforge.com/virtual_postfix_mysql_quota_courier).
La première chose à comprendre à propos de ce guide est qu’il utilise l’Agent de Livraison Virtuel (VDA) et, par conséquent, aucun des répondeurs automatiques que vous pourriez utiliser en les passant à un pipe via un fichier .forward ne fonctionnera simplement pas car le VDA ne prend pas en charge les expansions .forward. Cette limitation peut être contournée via la livraison Procmail/Maildrop, mais c’est désordonné et plus lent, surtout pour les systèmes de messagerie qui sont fortement utilisés. La réponse simple est Yaa!
Téléchargeons Yaa et commençons la fête :
mkdir -p /usr/local/postfix-tools cd /usr/local/postfix-toolswget http://frost.ath.cx/software/yaa/dist/yaa-0.3.tar.bz2tar jxvf yaa-0.3.tar.bz2Ensuite, nous devons obtenir les modules Perl requis pour faire fonctionner Yaa. Yaa fonctionne dans les deux modes daemon, cependant, dans ce guide, je vais seulement me préoccuper du mode non daemonisé du programme.
apt-get install libmldbm-perl libio-lockedfile-perl libnet-perl libcarp-clan-perl libdbi-perl libdbd-mysql-perl libnet-server-perl libio-stringy-perlConfigurons la structure de la base de données afin que Yaa fonctionne :
mysql -uroot -puse mail;CREATE TABLE `autoresponder` (
`active` tinyint(1) NOT NULL default '0',
`message` mediumtext NOT NULL,
`subject` varchar(250) NOT NULL default '',
`charset` varchar(250) NOT NULL default '',
`forward` varchar(250) NOT NULL default '',
`address` varchar(250) NOT NULL default '',
`local_domains` varchar(250) NOT NULL default '',
`tstart` int(32) NOT NULL default '0',
`tfinish` int(32) NOT NULL default '0',
PRIMARY KEY (`address`),
KEY `active` (`active`),
KEY `tstart` (`tstart`,`tfinish`)
)quit;Ensuite, nous voulons configurer Postfix pour invoquer Yaa! via un transport, donc nous devons éditer /etc/postfix/master.cf pour ajouter ce qui suit :
# répondeur automatique yaa
yaa unix - n n - - pipe
user=vmail
argv=/usr/local/postfix-tools/yaa-0.3/bin/yaa.plRedémarrons Postfix pour activer les changements :
/etc/init.d/postfix restartEnfin, nous devons configurer Yaa! Pour faciliter les choses, j’ai fourni mon yaa.conf
######################################################
# !!!!AVERTISSEMENT!!!! #
# NE RETIREZ PAS OU NE COMMENTEZ PAS LA LIGNE SUIVANTE #
use strict; #
######################################################
# REMARQUE :
# Si vous avez des problèmes pour exécuter yaa.pl et que vous
# n'êtes pas sûr de ce qui ne va pas, définissez la variable d'environnement
#
# YAA_DEBUG
#
# et exécutez à nouveau yaa.pl avec les mêmes arguments/fichier de configuration.
#
# La sortie de débogage Yaa sera écrite sur stderr si elle est exécutée en mode de traitement de message unique
# ou en mode daemon avec $daemon_background = 0.
#
# Si vous exécutez en mode daemon avec $daemon_background = 1, les messages de débogage
# seront envoyés au sous-système de journalisation s'il est activé.
#
# exemple pour csh :
# setenv YAA_DEBUG 1
#
# exemple pour sh/ksh/bash :
# export YAA_DEBUG=1
#
# NOTES GÉNÉRALES
#
# extrait du fichier de configuration du projet open source excellent
# appelé amavisd-new
# par Mark Martinec .
#
# Ce fichier est un code Perl normal, interprété par Perl lui-même.
# - assurez-vous que ce fichier (ou le répertoire où il se trouve) n'est PAS ÉCRIT
# par de simples mortels, sinon cela représente un risque de sécurité sévère !
# - pour les valeurs qui sont interprétées comme des booléens, il est recommandé
# d'utiliser 1 pour vrai, et 0 ou undef ou '' pour faux.
# - La syntaxe Perl s'applique. Notamment : les chaînes dans "" peuvent inclure des variables
# (qui commencent par $ ou @) ; pour inclure les caractères @ et $ dans des chaînes entre guillemets doubles,
# précédez-les d'un antislash ; dans des chaînes entre guillemets simples,
# le $ et @ perdent leur signification spéciale, donc il est généralement plus facile d'utiliser
# des chaînes entre guillemets simples. Néanmoins, dans les deux cas, l'antislash doit être doublé.
######################################################
# PARAMÈTRES DU SOUS-SYSTÈME DE JOURNALISATION #
######################################################
# activer la journalisation ?
# type : booléen
# par défaut : 1
# $logging = 1;
# activer la journalisation vers syslog ?
# type : booléen
# par défaut : 1
$log_syslog = 1;
# installation de journalisation syslog
# type : chaîne
# par défaut : "mail"
# ce paramètre s'applique uniquement lorsque la journalisation vers syslog est activée
# $log_syslog_facility = "mail";
# priorité de journalisation syslog
# type : chaîne
# par défaut : "info"
# ce paramètre s'applique uniquement lorsque la journalisation vers syslog est activée
# $log_syslog_priority = "info";
# journaliser dans un fichier texte ?
# type : booléen
# par défaut : 0
#$log_file = 1;
# nom du fichier journal
# type : chaîne
# par défaut : undef
# ce paramètre s'applique uniquement lorsque la journalisation dans un fichier est activée
#$log_file_filename = "/var/log/yaa.log";
# journaliser vers stderr ?
# type : booléen
# par défaut : 0
# !!!! AVERTISSEMENT !!!!
# lorsque le débogage yaa est activé (la variable d'environnement YAA_DEBUG est définie),
# la sortie STDERR est mappée au sous-système de journalisation et rien n'apparaît réellement
# sur le vrai stderr, donc assurez-vous de configurer la journalisation basée sur syslog ou fichier.
# !!!! AVERTISSEMENT !!!!
# $log_stderr = 0;
# format de temps de journal lors de la journalisation dans un fichier
# type : chaîne
# par défaut : "[%a, %b %e %T %Y]: "
# voir strftime(3) pour plus de détails
# $log_time_format = undef;
######################################################
# PARAMÈTRES DU MODE DAEMON #
######################################################
# exécuter en tant que démon ?
# type : booléen
# par défaut : 0, ne pas exécuter en tant que démon
# ce paramètre active le fonctionnement en mode démon.
# $daemon = 1;
$daemon = 0;
$daemon_lockfile = "/tmp/yaa.lock";
$daemon_pidfile = "/tmp/yaa.pid";
$daemon_tcpserver_loglevel = 4;
# fork dans l'arrière-plan lors de l'exécution en tant que démon ?
# par défaut : 1
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_background = 1;
# fichier de verrouillage d'acceptation du démon
# type : chaîne
# par défaut : "/var/lock/yaa.lock"
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# AVERTISSEMENT : si vous exécutez dans une prison chroot, cette option doit être
# définie par rapport au répertoire chroot
# $daemon_lockfile = "/tmp/yaa.lock";
# fichier pid du démon
# type : chaîne
# par défaut : "/var/run/yaa.lock"
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_pidfile = "/tmp/yaa.pid";
# nombre minimum de processus enfants yaa
# type : entier
# par défaut : 2
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_min_servers = 2;
# nombre maximum de processus enfants yaa
# type : entier
# par défaut : 3
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_max_servers = 3;
# nombre minimum de processus enfants yaa de secours
# type : entier
# par défaut : 1
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_min_spare_servers = 0;
# nombre maximum de processus enfants yaa de secours
# type : entier
# par défaut : 1
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
#$daemon_max_spare_servers = 1;
# protocole de communication du démon
# type : chaîne
# protocole que votre MTA utilise pour communiquer avec yaa
#
# REMARQUE : pour les valeurs possibles pour ce paramètre de configuration, EXÉCUTEZ
# yaa.pl --list-transport-protocols
#
# par défaut : "SMTP"
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_protocol = "LMTP";
# port d'écoute tcp ou socket de domaine unix sur lequel yaa doit écouter
# type : entier/chaîne
# par défaut : 40000
# pour spécifier un socket de domaine unix, définissez la valeur sur : '/path/to/socket|unix'
#
# voir aussi : perldoc Net::Server::Proto
#
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_listen_port = 40000;
# nom d'hôte auquel yaa doit se lier.
# type : chaîne
# par défaut : "localhost"
# ce paramètre s'applique uniquement lors de l'exploitation en mode démon
# $daemon_listen_host = "127.0.0.1";
# niveau de journalisation du serveur tcp du démon (Net::Server)
# type : entier
# par défaut : 0
# 'O' => désactiver la journalisation
# 0 => 'err'
# 1 => 'warning'
# 2 => 'notice'
# 3 => 'info'
# 4 => 'debug'
$daemon_tcpserver_loglevel = 4;
######################################################
# PARAMÈTRES DE L'OBJET YAA #
######################################################
# répertoire utilisé pour stocker la base de données des temps d'envoi de messages de réponse automatique.
# type : chaîne
# par défaut : "/tmp"
# !!!! AVERTISSEMENT !!!!
#
# - si vous exécutez yaa en chroot (voir la variable de configuration $chroot),
# alors vous devez définir cette variable à une valeur RELATIVE au répertoire chroot
#
# - le répertoire doit être accessible en écriture pour l'uid/gid que yaa utilise pour le traitement des messages
# voir aussi les variables $user et $group
#
# !!!! AVERTISSEMENT !!!!
# $db_dir = "/db";
# temps en secondes entre les réponses automatiques envoyées au
# même expéditeur de message par le destinataire de message qui a le répondeur automatique
# activé.
#
# !!!! AVERTISSEMENT !!!!
#
# Pour des raisons de test, définissez à -1 (désactiver la vérification du temps),
# MAIS NE DEFINISSEZ PAS CETTE VALEUR INFÉRIEURE À 3600 (1 heure) SUR
# UN SYSTÈME DE PRODUCTION !!!!
#
# !!!! AVERTISSEMENT !!!!
# type : entier
# par défaut : 7200
# $duration_interval = 24 * 60 * 60;
$duration_interval = "-1";
######################################################
# PARAMÈTRES DE RÉPONSE AUTOMATIQUE #
######################################################
# méthode utilisée pour envoyer des réponses automatiques et transférer des messages
# type : chaîne
# valeurs possibles : "smtp", "sendmail"
# - "smtp" utilise le serveur smtp pour envoyer des mails
# - "sendmail" invoque le binaire sendmail pour envoyer des mails
#
# !!!!AVERTISSEMENT!!!! : des choses étranges se produisent lors de l'utilisation de la méthode d'envoi sendmail
# et de l'exécution en mode démon !
#
# par défaut : "smtp"
# $mail_sending_method = "smtp";
# chemin du programme sendmail
# type chaîne
# par défaut : recherché automatiquement dans la variable d'environnement $PATH ;
# undef s'il n'est pas trouvé dans $PATH.
#$sendmail_path = undef;
# Paramètre du serveur SMTP
# type : chaîne
#
# voir aussi perldoc Net::SMTP
#
# par défaut : localhost
# $smtp_server = "localhost";
# Utiliser l'authentification SMTP ?
# type : booléen
# par défaut : 0
# $smtp_auth = 0;
# nom d'utilisateur d'authentification SMTP
# type : chaîne
# par défaut : undef
# $smtp_username = undef;
# mot de passe d'authentification SMTP
# type : chaîne
# par défaut : undef
# $smtp_password = undef;
######################################################
# PARAMÈTRES DE CARTE DE RECHERCHE #
######################################################
# Liste de TOUTES les cartes de recherche
# Vous devez définir les cartes de recherche ici et
# puis définir lookup_map_query_order, où vous faites référence à
# le nom de recherche
#
# REMARQUE :
# Toutes les cartes de recherche sont initialisées AVANT que Yaa! n'entre dans la prison chroot (le cas échéant)
# et AVANT de commencer à traiter les e-mails.
#
# REMARQUE : Pour obtenir la liste de tous les pilotes de recherche, EXÉCUTEZ
# yaa.pl --list-lookup-map-drivers
#
# type : hachage de hachages
# par défaut : hachage vide (aucune carte de recherche définie)
$lookup_maps = {
#
# !!!AVERTISSEMENT!!!!
#
# POUR LA LISTE COMPLÈTE DES ARGUMENTS DE CONFIGURATION DU PILOTE
# EXÉCUTEZ yaa.pl --show-lookup-map-doc
#
# Format de configuration de carte de recherche
#
# 'map_name' => {
# 'driver' => 'DRIVER_NAME',
# 'driver_param1' => 'value1'.
# 'driver_param2' => 'value2',
# 'driver_param3' => 'value3',
# },
# Exemple de carte de recherche SQL
#
# (base de données sql utilisée : mysql)
# (pour d'autres types, voir perldoc DBD::)
#
'my_sql_map' => {
'driver' => 'SQL',
'sql_dsn' => 'dbi:mysql:database=mail;host=localhost',
'sql_username' => "mail_admin",
'sql_password' => "mail_admin_password",
'sql_select' => "select active,message,subject,charset,forward from autoresponder where address = %m and active='1'",
},
# Exemple de carte de recherche PCRE
#
# 'my_pcre_map' => {
# 'driver' => 'PCRE',
# 'file' => "file.pcre",
# 'replacement_num' => 0
#},
# Exemple de carte de recherche STATIQUE
# 'my_static_map' => {
# 'driver' => 'STATIC',
# 'result_key1' => 'result_value1',
# 'result_key2' => 'result_value2',
# 'result' => 'sth'
#},
# Exemple de carte de recherche LDAP
# 'my_ldap_map' => {
# 'driver' => 'LDAP',
# 'ldap_host' => 'ldap.example.org',
#
# 'ldap_bind' => 1,
# 'ldap_bind_dn' => "cn=Manager,dc=example,dc=org",
# 'ldap_bind_pw' => "secret",
#
# 'ldap_search_base' => "ou=MyOU,dc=example,dc=org",
# 'ldap_search_filter' => "(&(objectClass=rfc822Recipient)(mail=%m)(accountActive=1)",
# 'ldap_search_attrs' => ['autoResponseActive', 'autoResponseSubject', 'autoresponseMessage', 'autoResponseCharset', 'autoresponseForward'],
#},
# Exemple de carte de recherche DB_File
# 'my_dbf_map' => {
# 'driver' => 'DB_File',
# 'file' => "/path/to/mydb",
#},
# Exemple de carte de recherche BerkeleyDB
#'my_dbd_map' => {
# 'driver' => 'BerkeleyDB',
# 'type' => 'Btree',
# 'file' => "/path/to/mydb"
#},
};
# ordre de requête de carte de recherche par attribut
# pour chaque réponse automatique, sauf 'rewrite_recipient' et 'rewrite_sender', doit
# être défini l'ordre de requête de recherche
#
# Chaque élément peut être spécifié comme :
# + chaîne (exemple : 'domain.tld')
#
# OU
#
# lookup_map_name:result_value (exemple : 'my_pcre_map:result')
#
# La carte de recherche est reconnue par le caractère ':' dans la chaîne.
#
# La carte de recherche 'lookup_map_name' DOIT ÊTRE spécifiée dans le paramètre de configuration $lookup_maps
# dans yaa.conf
#
# type : hachage de hachages
# par défaut : hachage vide (aucune liste d'ordre de recherche définie)
#
#
$lookup_map_query_order = {
active => [
'my_sql_map:active'
],
subject => [
'my_sql_map:subject'
],
message => [
'my_sql_map:message'
],
charset => [
# 'my_sql_map:charset'
],
forward => [
'my_sql_map:forward'
],
rewrite_sender => [
#vide
],
rewrite_recipient => [
#vide
],
'local_domains' => [
'my_sql_map:local_domains'
],
};
######################################################
# AUTRES PARAMÈTRES #
######################################################
# chroot vers un répertoire ?
# type : chaîne
# par défaut : undef, ne pas chroot
# Avertissement : yaa doit être démarré en tant que superutilisateur pour activer cette fonctionnalité.
# cela s'applique au mode démon et au mode de traitement de message unique
# $chroot = undef;
# changer uid/gid avant le traitement ?
# type : chaîne
# par défaut : undef, ne pas changer uid/gid
# Avertissement : yaa doit être démarré en tant que superutilisateur pour activer cette fonctionnalité.
# cela s'applique au mode démon et au mode de traitement de message unique
# $user = undef;
# $group = undef;
# Charger des modules perl supplémentaires avant de traiter tout message
# Les modules de cette liste seront chargés avant que Yaa! ne traite tout
# message en mode de processus unique ou devienne un démon, lors de l'exécution
# en mode démon.
#
# Ce paramètre de configuration est très pratique lorsque
# lors de l'exécution dans une prison chroot
#
# type : tableau
# par défaut : tableau vide (ne charge aucun module supplémentaire)
@extra_modules = (
# !!!!AVERTISSEMENT!!!!
# lorsque en tant que démon chrooté, décommentez la ligne suivante
# 'Net::Server::Mail::ESMTP::PIPELINING',
# si vous exécutez en chrooté, et utilisez la version mysql
# de la carte de recherche SQL, décommentez la ligne suivante
#'DBD::mysql',
# si vous exécutez en chrooté, et utilisez la version postgres
# de la carte de recherche SQL, décommentez la ligne suivante
#'DBD::Pg',
);
######################################################
# !!!!AVERTISSEMENT!!!! #
# COMMENTEZ LA LIGNE SUIVANTE POUR FAIRE FONCTIONNER YAA ! #
# !!!!AVERTISSEMENT!!!! #
######################################################
#die "Vous n'avez pas modifié le fichier de configuration, n'est-ce pas ? :))";
######################################################
# !!!!AVERTISSEMENT!!!! #
# NE RETIREZ PAS OU NE COMMENTEZ PAS LA LIGNE SUIVANTE #
1; #
###################################################### Vous devrez trouver
'my_sql_map' => {
'driver' => 'SQL',
'sql_dsn' => 'dbi:mysql:database=mail;host=localhost',
'sql_username' => "mail_admin",
'sql_password' => "mail_admin_password",
'sql_select' => "select active,message,subject,charset,forward from autoresponder where address = %m and active='1'", et modifier pour votre propre nom d’utilisateur et mot de passe.
Ensuite, nous devons ajouter quelques entrées de base de données supplémentaires.
INSERT INTO `forwardings` ( `source` , `destination` ) VALUES ('[email protected]', '[email protected], [email protected]');INSERT INTO `transport` ( `domain` , `transport` ) VALUES ('autoreply.domain.com', 'yaa');INSERT INTO `autoresponder` ( `active` , `message` , `subject` , `charset` , `forward` , `address` , `local_domains` , `tstart` , `tfinish` ) VALUES ('1', 'Message Body', 'Message Subject', '', '', '[email protected]', 'autoreply.domain.com', '0', '0');De plus, vous pouvez remplir les valeurs tstart/tfinish, celles-ci sont faites en timestamp Unix et vous permettent d’activer le répondeur automatique pour une période de temps particulière - idéal pour les personnes qui oublient toujours de les désactiver après leur retour au bureau par exemple !
INSERT INTO `autoresponder` ( `active` , `message` , `subject` , `charset` , `forward` , `address` , `local_domains` , `tstart` , `tfinish` ) VALUES ('1', 'Message Body', 'Message Subject', '', '', '[email protected]', 'autoreply.domain.com', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + 14400);Sous Thunderbird, j’ai remarqué un comportement très étrange concernant le sujet de la réponse, donc j’ai googlé et trouvé un petit correctif pour résoudre le problème.
Créez un fichier appelé email_subject.patch :
--- Autoresponse.pm 2004-08-19 20:35:28.000000000 +0200
+++ Autoresponse.pm 2005-07-14 13:16:03.000000000 +0200
@@ -182,7 +182,11 @@
push(@headers, "Precedence: bulk");
# Sujet
- push(@headers, "Subject: =?" . (($self->{charset}) ? $self->{charset} : $self->{default_charset}) . "?Q?" . encode_qp($subject) . "?=");
+ #
+ # Corrige les sujets étranges que les clients de messagerie ne comprennent pas
+ # (le deuxième argument sur encode_qp devrait être "")
+ push(@headers, "Subject: =?" . (($self->{charset}) ? $self->{charset} : $self->{default_charset}) . "?Q?" . encode_qp($subject,"") . "?=");
push(@headers, "MIME-Version: 1.0"); Ensuite, nous appliquons le correctif :
cd /usr/local/postfix-tools/yaa-0.3/lib/patch -p0 Ce guide ne concerne pas la version daemonisée de Yaa! qui serait probablement plus efficace sur des volumes de mail extrêmement élevés, mais il ne devrait s’agir que d’ajuster le fichier yaa.conf si la version daemon est requise.
Yaa a de superbes fonctionnalités telles que ne pas répondre à la même personne dans un certain délai, donc il peut être très intelligent, surtout que vous pouvez obtenir deux programmes de répondeur automatique se répondant mutuellement et créant une boucle. Cela ne se produit pas avec Yaa!
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.