E-Mail Konfiguration · 12 min read · Jan 04, 2026
Autoresponder zur Begleitung von virtuellen Benutzern und Domains mit Postfix, Courier und MySQL
Autoresponder zur Begleitung von virtuellen Benutzern und Domains mit Postfix, Courier und MySQL
Dieser Leitfaden konzentriert sich darauf, Yaa! (Yet Another Autoresponder!) mit Debian Sarge und dem Tutorial zu virtuellen Benutzern auf Postfix zum Laufen zu bringen (siehe https://www.howtoforge.com/virtual_postfix_mysql_quota_courier).
Das erste, was man über den Leitfaden verstehen muss, ist, dass er den Virtual Delivery Agent (VDA) verwendet und daher wird keiner der Autoresponder, die man durch Übergabe an eine Pipe über eine .forward-Datei verwenden könnte, funktionieren, da der VDA .forward-Erweiterungen nicht unterstützt. Diese Einschränkung kann durch Procmail/Maildrop-Zustellung überwunden werden, aber das ist unordentlich und langsamer, insbesondere für stark genutzte Mail-Systeme. Die einfache Antwort ist Yaa!
Lass uns Yaa herunterladen und die Party starten:
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.bz2Als nächstes müssen wir die erforderlichen Perl-Module installieren, damit Yaa funktioniert. Yaa funktioniert sowohl im Daemon-Modus, jedoch werde ich mich in diesem Leitfaden nur mit dem nicht-daemonisierten Modus des Programms beschäftigen.
apt-get install libmldbm-perl libio-lockedfile-perl libnet-perl libcarp-clan-perl libdbi-perl libdbd-mysql-perl libnet-server-perl libio-stringy-perlLass uns die Datenbankstruktur einrichten, damit Yaa funktioniert:
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;Als nächstes wollen wir Postfix so konfigurieren, dass Yaa! über einen Transport aufgerufen wird, also müssen wir /etc/postfix/master.cf bearbeiten, um Folgendes hinzuzufügen:
# yaa autoresponder
yaa unix - n n - - pipe
user=vmail
argv=/usr/local/postfix-tools/yaa-0.3/bin/yaa.plLass uns Postfix neu starten, um die Änderungen zu aktivieren:
/etc/init.d/postfix restartSchließlich müssen wir Yaa! konfigurieren. Um die Dinge einfacher zu machen, habe ich meine yaa.conf bereitgestellt.
######################################################
# !!!!WARNING!!!! #
# DO NOT REMOVE OR COMMENT OUT THE FOLLOWING LINE #
use strict; #
######################################################
# HINWEIS:
# Wenn Sie Probleme beim Ausführen von yaa.pl haben und nicht
# sicher sind, was schief läuft, setzen Sie die Umgebungsvariable
#
# YAA_DEBUG
#
# und führen Sie yaa.pl erneut mit denselben Argumenten/Konfigurationsdateien aus.
#
# Yaa-Debug-Ausgaben werden an stderr geschrieben, wenn sie im Einzel-
# Nachrichtenverarbeitungsmodus oder im Daemon-Modus mit $daemon_background = 0 ausgeführt werden.
#
# Wenn Sie im Daemon-Modus mit $daemon_background = 1 arbeiten, werden Debug-Nachrichten
# an das Logger-Subsystem gesendet, wenn es aktiviert ist.
#
# Beispiel für csh:
# setenv YAA_DEBUG 1
#
# Beispiel für sh/ksh/bash:
# export YAA_DEBUG=1
# ALLGEMEINE HINWEISE
#
# Auszug aus der Konfigurationsdatei des hervorragenden Open-Source-Projekts
# namens amavisd-new
# von Mark Martinec .
#
# Diese Datei ist ein normaler Perl-Code, der von Perl selbst interpretiert wird.
# - Stellen Sie sicher, dass diese Datei (oder das Verzeichnis, in dem sie sich befindet) NICHT SCHREIBBAR
# von gewöhnlichen Sterblichen ist, da sie sonst ein erhebliches Sicherheitsrisiko darstellt!
# - Für Werte, die als boolesch interpretiert werden, wird empfohlen,
# 1 für wahr und 0 oder undef oder '' für falsch zu verwenden.
# - Perl-Syntax gilt. Besonders zu beachten: Zeichenfolgen in "" können Variablen enthalten
# (die mit $ oder @ beginnen); um die Zeichen @ und $ in doppelten
# Anführungszeichen einzuschließen, setzen Sie sie mit einem Backslash davor; in einfachen Anführungszeichen
# verlieren $ und @ ihre besondere Bedeutung, sodass es normalerweise einfacher ist,
# einfache Anführungszeichen zu verwenden. Trotzdem muss in beiden Fällen der Backslash verdoppelt werden.
######################################################
# LOGGING-SUBSYSTEMEINSTELLUNGEN #
######################################################
# Protokollierung aktivieren?
# Typ: boolesch
# Standard: 1
# $logging = 1;
# Protokollierung in syslog aktivieren?
# Typ: boolesch
# Standard: 1
$log_syslog = 1;
# syslog-Protokollierungseinrichtung
# Typ: Zeichenfolge
# Standard: "mail"
# Diese Einstellung gilt nur, wenn die Protokollierung in syslog aktiviert ist
# $log_syslog_facility = "mail";
# syslog-Protokollierungspriorität
# Typ: Zeichenfolge
# Standard: "info"
# Diese Einstellung gilt nur, wenn die Protokollierung in syslog aktiviert ist
# $log_syslog_priority = "info";
# Protokollierung in Klartextdatei?
# Typ: boolesch
# Standard: 0
#$log_file = 1;
# Protokolldateiname
# Typ: Zeichenfolge
# Standard: undef
# Diese Einstellung gilt nur, wenn die Protokollierung in einer Datei aktiviert ist
#$log_file_filename = "/var/log/yaa.log";
# Protokollierung in stderr?
# Typ: boolesch
# Standard: 0
# !!!! WARNUNG !!!!
# Wenn das Debugging von yaa aktiviert ist (Umgebungsvariable YAA_DEBUG ist gesetzt),
# wird die STDERR-Ausgabe dem Logger-Subsystem zugeordnet und nichts wird tatsächlich
# auf echtem stderr angezeigt, also stellen Sie sicher, dass Sie syslog oder dateibasierte Protokollierung einrichten.
# !!!! WARNUNG !!!!
# $log_stderr = 0;
# Protokollzeitformat, wenn in Datei protokolliert wird
# Typ: Zeichenfolge
# Standard: "[%a, %b %e %T %Y]: "
# siehe strftime(3) für weitere Details
# $log_time_format = undef;
######################################################
# DAEMON-MODUS-EINSTELLUNGEN #
######################################################
# Als Daemon ausführen?
# Typ: boolesch
# Standard: 0, nicht als Daemon ausführen
# Diese Einstellung aktiviert den Daemon-Modus.
# $daemon = 1;
$daemon = 0;
$daemon_lockfile = "/tmp/yaa.lock";
$daemon_pidfile = "/tmp/yaa.pid";
$daemon_tcpserver_loglevel = 4;
# Im Hintergrund laufen, wenn als Daemon ausgeführt?
# Standard: 1
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_background = 1;
# Daemon-Accept-Lock-Datei
# Typ: Zeichenfolge
# Standard: "/var/lock/yaa.lock"
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# WARNUNG: Wenn Sie in einem Chroot-Gefängnis arbeiten, sollte diese Option
# relativ zum Chroot-Verzeichnis festgelegt werden
# $daemon_lockfile = "/tmp/yaa.lock";
# Daemon-PID-Datei
# Typ: Zeichenfolge
# Standard: "/var/run/yaa.lock"
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_pidfile = "/tmp/yaa.pid";
# Mindestanzahl der Yaa-Kindprozesse
# Typ: Ganzzahl
# Standard: 2
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_min_servers = 2;
# Höchstanzahl der Yaa-Kindprozesse
# Typ: Ganzzahl
# Standard: 3
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_max_servers = 3;
# Mindestanzahl der Yaa-Reserve-Kindprozesse
# Typ: Ganzzahl
# Standard: 1
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_min_spare_servers = 0;
# Höchstanzahl der Yaa-Reserve-Kindprozesse
# Typ: Ganzzahl
# Standard: 1
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
#$daemon_max_spare_servers = 1;
# Daemon-Kommunikationsprotokoll
# Typ: Zeichenfolge
# Protokoll, das Ihr MTA für die Kommunikation mit Yaa verwendet
#
# HINWEIS: Für mögliche Werte für diesen Konfigurationsparameter, FÜHREN SIE
# yaa.pl --list-transport-protocols
#
# Standard: "SMTP"
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_protocol = "LMTP";
# TCP-Listenport oder Unix-Domain-Socket, auf dem Yaa hören soll
# Typ: Ganzzahl/Zeichenfolge
# Standard: 40000
# Um einen Unix-Domain-Socket anzugeben, setzen Sie den Wert auf: '/path/to/socket|unix'
#
# siehe auch: perldoc Net::Server::Proto
#
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_listen_port = 40000;
# Hostname, an den Yaa gebunden werden soll.
# Typ: Zeichenfolge
# Standard: "localhost"
# Diese Einstellung gilt nur, wenn im Daemon-Modus gearbeitet wird
# $daemon_listen_host = "127.0.0.1";
# Daemon-TCP-Server (Net::Server) Protokollierungsstufe
# Typ: Ganzzahl
# Standard: 0
# 'O' => Protokollierung deaktivieren
# 0 => 'err'
# 1 => 'warning'
# 2 => 'notice'
# 3 => 'info'
# 4 => 'debug'
$daemon_tcpserver_loglevel = 4;
######################################################
# YAA-OBJEKT-EINSTELLUNGEN #
######################################################
# Verzeichnis, das zur Speicherung der Datenbank für die gesendeten Autoresponse-Nachrichten verwendet wird.
# Typ: Zeichenfolge
# Standard: "/tmp"
# !!!! WARNUNG !!!!
#
# - Wenn Sie Yaa in einem Chroot-Umfeld ausführen (siehe Konfigurationsvariable $chroot),
# müssen Sie diese Variable auf einen Wert RELATIV zum Chroot-Verzeichnis setzen
#
# - Das Verzeichnis muss für die uid/gid, die Yaa für die Nachrichtenverarbeitung verwendet, beschreibbar sein
# siehe auch die Variablen $user und $group
#
# !!!! WARNUNG !!!!
# $db_dir = "/db";
# Zeit in Sekunden zwischen zwei Autoresponsen, die an den
# gleichen Nachrichtenabsender von einem Nachrichtenempfänger gesendet werden, der den Autoresponder
# aktiviert hat.
#
# !!!! WARNUNG !!!!
#
# Für Testzwecke auf -1 setzen (Zeitprüfung deaktivieren),
# ABER SETZEN SIE DIESEN WERT NICHT UNTER 3600 (1 Stunde) AUF
# PRODUKTIONSSYSTEMEN !!!!
#
# !!!! WARNUNG !!!!
# Typ: Ganzzahl
# Standard: 7200
# $duration_interval = 24 * 60 * 60;
$duration_interval = "-1";
######################################################
# AUTORESPONSE-EINSTELLUNGEN #
######################################################
# Methode, die zum Senden von Autoresponsen und zum Weiterleiten von Nachrichten verwendet wird
# Typ: Zeichenfolge
# Mögliche Werte: "smtp", "sendmail"
# - "smtp" verwendet den SMTP-Server zum Senden von E-Mails
# - "sendmail" ruft das Sendmail-Binärprogramm auf, um E-Mails zu senden
#
# !!!!WARNUNG!!!!: Seltsame Dinge passieren, wenn die Sendmail-Sende-
# Methode verwendet wird und im Daemon-Modus läuft!
#
# Standard: "smtp"
# $mail_sending_method = "smtp";
# Sendmail-Programmpfad
# Typ: Zeichenfolge
# Standard: automatisch im $PATH-Umgebungsvariable gesucht;
# undef, wenn nicht im $PATH gefunden.
#$sendmail_path = undef;
# SMTP-Server-Einstellung
# Typ: Zeichenfolge
#
# siehe auch perldoc Net::SMTP
#
# Standard: localhost
# $smtp_server = "localhost";
# SMTP-Authentifizierung verwenden?
# Typ: boolesch
# Standard: 0
# $smtp_auth = 0;
# SMTP-Authentifizierungsbenutzername
# Typ: Zeichenfolge
# Standard: undef
# $smtp_username = undef;
# SMTP-Authentifizierungskennwort
# Typ: Zeichenfolge
# Standard: undef
# $smtp_password = undef;
######################################################
# LOOKUP-MAP-EINSTELLUNGEN #
######################################################
# Liste aller Lookup-Maps
# Sie müssen Lookup-Maps hier definieren und
# dann lookup_map_query_order festlegen, wo Sie auf
# den Lookup-Namen verweisen
#
# HINWEIS:
# Alle Lookup-Maps werden INITIALISIERT, BEVOR Yaa! in ein Chroot-Gefängnis eintritt (falls vorhanden)
# und BEVOR mit der Verarbeitung von E-Mails begonnen wird.
#
# HINWEIS: Um eine Liste aller Lookup-Treiber zu erhalten, FÜHREN SIE
# yaa.pl --list-lookup-map-drivers
#
# Typ: Hash von Hashes
# Standard: leerer Hash (keine definierten Lookup-Maps)
$lookup_maps = {
#
# !!!WARNUNG!!!!
#
# FÜR VOLLSTÄNDIGE LISTE DER TREIBER-KONFIGURATIONSARGUMENTE
# FÜHREN SIE yaa.pl --show-lookup-map-doc
#
# Lookup-Map-Konfigurationsformat
#
# 'map_name' => {
# 'driver' => 'DRIVER_NAME',
# 'driver_param1' => 'value1'.
# 'driver_param2' => 'value2',
# 'driver_param3' => 'value3',
# },
#
# SQL-Lookup-Map-Beispiel
#
# (verwendete SQL-Datenbank: mysql)
# (für andere Typen siehe 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'",
},
# PCRE-Lookup-Map-Beispiel
#
# 'my_pcre_map' => {
# 'driver' => 'PCRE',
# 'file' => "file.pcre",
# 'replacement_num' => 0
#},
# STATISCHE Lookup-Map-Beispiel
# 'my_static_map' => {
# 'driver' => 'STATIC',
# 'result_key1' => 'result_value1',
# 'result_key2' => 'result_value2',
# 'result' => 'sth'
#},
# LDAP-Lookup-Map-Beispiel
# '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'],
#},
# DB_File-Lookup-Map-Beispiel
# 'my_dbf_map' => {
# 'driver' => 'DB_File',
# 'file' => "/path/to/mydb",
#},
# BerkeleyDB-Lookup-Map-Beispiel
#'my_dbd_map' => {
# 'driver' => 'BerkeleyDB',
# 'type' => 'Btree',
# 'file' => "/path/to/mydb"
#},
};
# Lookup-Map-Abfrageordnung nach Attribut
# Für jede Autoresponse müssen außer 'rewrite_recipient' und 'rewrite_sender'
# definierte Lookup-Abfrageordnungen festgelegt werden
#
# Jedes Element kann angegeben werden als:
# + Zeichenfolge (Beispiel: 'domain.tld')
#
# ODER
#
# lookup_map_name:result_value (Beispiel: 'my_pcre_map:result')
#
# Lookup-Map wird durch ':' Zeichen in der Zeichenfolge erkannt.
#
# Lookup-Map 'lookup_map_name' MUSS in der $lookup_maps-Konfiguration
# im yaa.conf-Parameter angegeben werden
#
# Typ: Hash von Hashes
# Standard: leerer Hash (keine Lookup-Ordnungsliste definiert)
#
#
$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 => [
#leer
],
rewrite_recipient => [
#leer
],
'local_domains' => [
'my_sql_map:local_domains'
],
};
######################################################
# ANDERE EINSTELLUNGEN #
######################################################
# Chroot in ein Verzeichnis?
# Typ: Zeichenfolge
# Standard: undef, nicht chrooten
# Warnung: Yaa muss als Superuser gestartet werden, um diese Funktion zu aktivieren.
# Dies gilt für den Daemon- und den Einzelnachrichtenverarbeitungsmodus
# $chroot = undef;
# UID/GID vor der Verarbeitung ändern?
# Typ: Zeichenfolge
# Standard: undef, UID/GID nicht ändern
# Warnung: Yaa muss als Superuser gestartet werden, um diese Funktion zu aktivieren.
# Dies gilt für den Daemon- und den Einzelnachrichtenverarbeitungsmodus
# $user = undef;
# $group = undef;
# Zusätzliche Perl-Module vor der Verarbeitung einer Nachricht laden
# Module in dieser Liste werden geladen, bevor Yaa! eine
# Nachricht im Einzelprozessmodus verarbeitet oder Daemon wird, wenn sie
# im Daemon-Modus läuft.
#
# Dieser Konfigurationsparameter ist sehr praktisch, wenn
# er in einem Chroot-Gefängnis ausgeführt wird
#
# Typ: Array
# Standard: leeres Array (keine zusätzlichen Module laden)
@extra_modules = (
# !!!!WARNUNG!!!!
# Wenn als chrooted daemon, kommentieren Sie die folgende Zeile aus
# 'Net::Server::Mail::ESMTP::PIPELINING',
# Wenn Sie chrooted arbeiten und die mysql-Version
# der SQL-Lookup-Map verwenden, kommentieren Sie die folgende Zeile aus
#'DBD::mysql',
# Wenn Sie chrooted arbeiten und die postgres-Version
# der SQL-Lookup-Map verwenden, kommentieren Sie die folgende Zeile aus
#'DBD::Pg',
);
######################################################
# !!!!WARNUNG!!!! #
# KOMMENTIEREN SIE DIE FOLGENDE ZEILE AUS, UM YAA ZU AKTIVIEREN! #
# !!!!WARNUNG!!!! #
######################################################
#die "Sie haben die Konfigurationsdatei nicht bearbeitet, oder?:))";
######################################################
# !!!!WARNUNG!!!! #
# DO NOT REMOVE OR COMMENT OUT THE FOLLOWING LINE #
1; #
###################################################### Sie müssen finden
'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'", und für Ihren eigenen Benutzernamen und Ihr Passwort bearbeiten.
Als nächstes müssen wir ein paar zusätzliche Datenbankeinträge hinzufügen.
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', 'Nachrichtentext', 'Nachricht Betreff', '', '', '[email protected]', 'autoreply.domain.com', '0', '0');Zusätzlich können Sie die Werte für tstart/tfinish ausfüllen, diese werden im Unix-Zeitstempel durchgeführt und ermöglichen es Ihnen, den Autoresponder für einen bestimmten Zeitraum zu aktivieren - großartig für Menschen, die immer vergessen, sie auszuschalten, nachdem sie beispielsweise ins Büro zurückgekehrt sind!
INSERT INTO `autoresponder` ( `active` , `message` , `subject` , `charset` , `forward` , `address` , `local_domains` , `tstart` , `tfinish` ) VALUES ('1', 'Nachrichtentext', 'Nachricht Betreff', '', '', '[email protected]', 'autoreply.domain.com', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + 14400);Unter Thunderbird habe ich einige sehr seltsame Verhaltensweisen bezüglich des Betreffs der Antwort festgestellt, also habe ich gegoogelt und einen kleinen Patch gefunden, um das Problem zu beheben.
Erstellen Sie eine Datei namens 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");
# Betreff
- push(@headers, "Subject: =?" . (($self->{charset}) ? $self->{charset} : $self->{default_charset}) . "?Q?" . encode_qp($subject) . "?=");
+ #
+ # Behebt die seltsamen Betreffzeilen, die E-Mail-Clients nicht verstehen
+ # (das zweite Argument bei encode_qp sollte sein "")
+ push(@headers, "Subject: =?" . (($self->{charset}) ? $self->{charset} : $self->{default_charset}) . "?Q?" . encode_qp($subject,"") . "?=");
push(@headers, "MIME-Version: 1.0"); Als nächstes wenden wir den Patch an:
cd /usr/local/postfix-tools/yaa-0.3/lib/patch -p0 Dieser Leitfaden befasst sich nicht mit der daemonisierten Version von Yaa!, die wahrscheinlich effizienter bei extrem hohen E-Mail-Volumina wäre, aber es sollte nur eine Frage des Tweaks der yaa.conf-Datei sein, wenn die Daemon-Version erforderlich ist.
Yaa hat einige großartige Funktionen, wie z.B. das Verhindern, dass die gleiche Person innerhalb eines bestimmten Zeitraums antwortet, sodass es sehr intelligent sein kann, insbesondere da Sie zwei Autoresponder-Programme haben können, die sich gegenseitig antworten und eine Schleife erzeugen. Dies passiert mit Yaa nicht!
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.