Postfix Konfiguration · 8 min read · Jan 08, 2026

Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Fedora 12 x86_64) - Seite 5

13 Installieren Sie Razor, Pyzor und DCC und konfigurieren Sie SpamAssassin

Razor, Pyzor und DCC sind Spamfilter, die ein kollaboratives Filternetzwerk verwenden. Um Razor und Pyzor zu installieren, führen Sie aus

yum install perl-Razor-Agent pyzor

Dann initialisieren Sie beide Dienste:

chmod -R a+rX /usr/share/doc/pyzor-0.5.0 /usr/bin/pyzor /usr/bin/pyzord  
chmod -R a+rX /usr/lib/python2.6/site-packages/pyzor  
su -m amavis -c 'pyzor --homedir /var/spool/amavisd discover'  
su -m amavis -c 'razor-admin -home=/var/spool/amavisd -create'  
su -m amavis -c 'razor-admin -home=/var/spool/amavisd -register'

Dann installieren wir DCC wie folgt:

cd /tmp  
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z  
tar xzvf dcc-dccproc.tar.Z  
cd dcc-dccproc-1.3.116  
./configure --with-uid=amavis  
make  
make install  
chown -R amavis:amavis /var/dcc  
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Jetzt müssen wir SpamAssassin mitteilen, dass es diese drei Programme verwenden soll. Bearbeiten Sie /etc/mail/spamassassin/local.cf, sodass es so aussieht:

vi /etc/mail/spamassassin/local.cf

| # Diese Werte können durch Bearbeiten von ~/.spamassassin/user_prefs.cf überschrieben werden # (siehe spamassassin(1) für Details) # Diese sollten sichere Annahmen sein und einfaches visuelles Filtern ermöglichen # ohne das Risiko, E-Mails zu verlieren. #required_hits 5 #report_safe 0 #rewrite_header Subject [SPAM] # dcc use_dcc 1 dcc_path /usr/local/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /var/spool/amavisd/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Dann müssen wir das DCC-Plugin in SpamAssassin aktivieren. Öffnen Sie /etc/mail/spamassassin/v310.pre und entfernen Sie das Kommentarzeichen vor der Zeile loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/mail/spamassassin/v310.pre

| [...] # DCC - DCC-Nachrichtenprüfungen durchführen. # # DCC ist hier deaktiviert, da es nicht Open Source ist. Siehe die DCC # Lizenz für weitere Details. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Sie können Ihre SpamAssassin-Konfiguration überprüfen, indem Sie ausführen:

spamassassin --lint

Es sollten keine Fehler angezeigt werden.

Führen Sie danach aus

/etc/init.d/amavisd restart

Jetzt aktualisieren wir unsere SpamAssassin-Regelsätze wie folgt:

sa-update --no-gpg

Wir erstellen einen Cron-Job, damit die Regelsätze regelmäßig aktualisiert werden. Führen Sie aus

crontab -e

um den Cron-Job-Editor zu öffnen. Erstellen Sie den folgenden Cron-Job:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Dies aktualisiert die Regelsätze jeden zweiten Tag um 4:23 Uhr.

14 Benachrichtigungen bei Quota-Überschreitungen

Wenn Sie Benachrichtigungen über alle E-Mail-Konten erhalten möchten, die über dem Limit liegen, erstellen Sie die Datei /usr/local/sbin/quota_notify:

cd /usr/local/sbin/  
vi quota_notify

| #!/usr/bin/perl -w # Autor <[email protected]> # # Dieses Skript geht davon aus, dass virtual_mailbox_base in der main.cf-Datei von Postfix definiert ist. Dieses Verzeichnis wird angenommen, um # Verzeichnisse zu enthalten, die selbst die Maildirs Ihrer virtuellen Benutzer enthalten. # Zum Beispiel: # # -----------/ # | # | # home/vmail/domains/ # | | # | | # example.com/ foo.com/ # | # | # ----------------- # | | | # | | | # user1/ user2/ user3/ # | # | # maildirsize # use strict; my $POSTFIX_CF = "/etc/postfix/main.cf"; my $MAILPROG = "/usr/sbin/sendmail -t"; my $WARNPERCENT = 80; my @POSTMASTERS = ('[email protected]'); my $CONAME = 'Mein Unternehmen'; my $COADDR = '[email protected]'; my $SUADDR = '[email protected]'; my $MAIL_REPORT = 1; my $MAIL_WARNING = 1; #get virtual mailbox base from postfix config open(PCF, "< $POSTFIX_CF") or die $!; my $mboxBase; while () { next unless /virtual_mailbox_base\s*=\s*(.*)\s*/; $mboxBase = $1; } close(PCF); #assume one level of subdirectories for domain names my @domains; opendir(DIR, $mboxBase) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.?$/; #skip '.' and '..' next unless (-d "$mboxBase/$name"); push(@domains, $name); } closedir(DIR); #iterate through domains for username/maildirsize files my @users; chdir($mboxBase); foreach my $domain (@domains) { opendir(DIR, $domain) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.?$/; #skip '.' and '..' next unless (-d "$domain/$name"); push(@users, {"$name\@$domain" => "$mboxBase/$domain/$name"}); } } closedir(DIR); #get user quotas and percent used my (%lusers, $report); foreach my $href (@users) { foreach my $user (keys %$href) { my $quotafile = "$href->{$user}/maildirsize"; next unless (-f $quotafile); open(QF, "< $quotafile") or die $!; my ($firstln, $quota, $used); while () { my $line = $_; if (! $firstln) { $firstln = 1; die "Fehler: beschädigte quotafile $quotafile" unless ($line =~ /^(\\d+)S/); $quota = $1; last if (! $quota); next; } die "Fehler: beschädigte quotafile $quotafile" unless ($line =~ /\s*(-?\d+)/); $used += $1; } close(QF); next if (! $used); my $percent = int($used / $quota * 100); $lusers{$user} = $percent unless not $percent; } } #send a report to the postmasters if ($MAIL_REPORT) { open(MAIL, "| $MAILPROG"); select(MAIL); map {print "To: $_\n"} @POSTMASTERS; print "From: $COADDR\n"; print "Subject: Täglicher Quota-Bericht.\n"; print "TÄGLICHER QUOTA-BERICHT:\n\n"; print "----------------------------------------------\n"; print "| % NUTZUNG | KONTONAME |\n"; print "----------------------------------------------\n"; foreach my $luser ( sort { $lusers{$b} <=> $lusers{$a} } keys %lusers ) { printf("| %3d | %32s |\n", $lusers{$luser}, $luser); print "---------------------------------------------\n"; } print "\n--\n"; print "$CONAME\n"; close(MAIL); } #email a warning to people over quota if ($MAIL_WARNING) { foreach my $luser (keys (%lusers)) { next unless $lusers{$luser} >= $WARNPERCENT; # skip those under quota open(MAIL, "| $MAILPROG"); select(MAIL); print "To: $luser\n"; map {print "BCC: $_\n"} @POSTMASTERS; print "From: $SUADDR\n"; print "Subject: WARNUNG: Ihr Postfach ist $lusers{$luser}% voll.\n"; print "Reply-to: $SUADDR\n"; print "Ihr Postfach: $luser ist $lusers{$luser}% voll.\n\n"; print "Sobald Ihr E-Mail-Postfach Ihr monatliches Speicherlimit überschreitet\n"; print "wird Ihre monatliche Abrechnung automatisch angepasst.\n"; print "Bitte ziehen Sie in Betracht, E-Mails zu löschen und Ihren Papierkorb zu leeren, um Platz zu schaffen.\n\n"; print "Kontaktieren Sie <$SUADDR> für weitere Unterstützung.\n\n"; print "Danke.\n\n"; print "--\n"; print "$CONAME\n"; close(MAIL); } } |

Stellen Sie sicher, dass Sie die Variablen oben anpassen (insbesondere die [email protected] E-Mail-Adresse).

Wir müssen die Datei ausführbar machen:

chmod 755 quota_notify

Führen Sie aus

crontab -e

um einen Cron-Job für dieses Skript zu erstellen:

| 0 0 * * * /usr/local/sbin/quota_notify &> /dev/null |

15 Testen Sie Postfix

Um zu sehen, ob Postfix bereit für SMTP-AUTH und TLS ist, führen Sie aus

telnet localhost 25

Nachdem Sie die Verbindung zu Ihrem Postfix-Mailserver hergestellt haben, geben Sie ein

ehlo localhost

Wenn Sie die Zeilen sehen

*250-STARTTLS *

und

*250-AUTH PLAIN* LOGIN* *

ist alles in Ordnung.

[root@server1 sbin]# telnet localhost 25  
Trying ::1...  
Connected to localhost.  
Escape character is '^]'.  
220 server1.example.com ESMTP Postfix  
ehlo localhost  
250-server1.example.com  
250-PIPELINING  
250-SIZE 10240000  
250-VRFY  
250-ETRN  
250-STARTTLS  
250-AUTH PLAIN LOGIN  
250-AUTH=PLAIN LOGIN  
250-ENHANCEDSTATUSCODES  
250-8BITMIME  
250 DSN  
quit  
221 2.0.0 Bye  
Connection closed by foreign host.  
[root@server1 sbin]#

Geben Sie ein

quit

um zur Shell des Systems zurückzukehren.

16 Füllen Sie die Datenbank und testen Sie

Um die Datenbank zu füllen, können Sie die MySQL-Shell verwenden:

mysql -u root -p
USE mail;

Mindestens müssen Sie Einträge in den Tabellen domains und users erstellen:

INSERT INTO `domains` (`domain`) VALUES ('example.com');  
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('[email protected]', ENCRYPT('secret'), 10485760);

(Bitte achten Sie darauf, dass Sie die ENCRYPT-Syntax im zweiten INSERT-Befehl verwenden, um das Passwort zu verschlüsseln!)

Wenn Sie Einträge in den anderen beiden Tabellen vornehmen möchten, würde das so aussehen:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('[email protected]', '[email protected]');  
INSERT INTO `transport` (`domain`, `transport`) VALUES ('example.com', 'smtp:mail.example.com');

Um die MySQL-Shell zu verlassen, geben Sie ein

quit;

Für die meisten Menschen ist es einfacher, wenn sie eine grafische Benutzeroberfläche für MySQL haben; daher können Sie auch phpMyAdmin verwenden (in diesem Beispiel unter http://192.168.0.100/phpMyAdmin/ oder http://server1.example.com/phpMyAdmin/), um die mail-Datenbank zu verwalten. Wiederum, wenn Sie einen Benutzer erstellen, stellen Sie sicher, dass Sie die ENCRYPT-Funktion verwenden, um das Passwort zu verschlüsseln:

Ich denke nicht, dass ich die Tabellen domains und users weiter erklären muss.

Die Tabelle forwardings kann Einträge wie die folgenden haben:

sourcedestination
[email protected][email protected]Leitet E-Mails für [email protected] an [email protected] weiter
@example.com[email protected]Erstellt ein Catch-All-Konto für [email protected]. Alle E-Mails an example.com kommen bei [email protected] an, außer denen, die in der Benutzertabelle existieren (d.h. wenn [email protected] in der Benutzertabelle existiert, kommen E-Mails an [email protected] weiterhin bei [email protected] an).
@example.com@anotherdomain.tldDies leitet alle E-Mails an example.com an denselben Benutzer bei anotherdomain.tld weiter. Z.B. E-Mails an [email protected] werden an [email protected] weitergeleitet.
[email protected][email protected], [email protected]Leitet E-Mails für [email protected] an zwei oder mehr E-Mail-Adressen weiter. Alle aufgeführten E-Mail-Adressen unter destination erhalten eine Kopie der E-Mail.

Die Tabelle transport kann Einträge wie diese haben:

domaintransport
example.com:Liefert E-Mails für example.com lokal. Das ist so, als ob dieser Eintrag in dieser Tabelle überhaupt nicht existieren würde.
example.comsmtp:mail.anotherdomain.tldLiefert alle E-Mails für example.com über smtp an den Server mail.anotherdomain.com.
example.comsmtp:mail.anotherdomain.tld:2025Liefert alle E-Mails für example.com über smtp an den Server mail.anotherdomain.com, jedoch auf Port 2025, nicht 25, was der Standardport für smtp ist.

| example.com | smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld] | Die eckigen Klammern verhindern, dass Postfix DNS-Abfragen für die Adresse in eckigen Klammern durchführt. Macht Sinn für IP-Adressen. | | .example.com | smtp:mail.anotherdomain.tld | E-Mails für jede Subdomain von example.com werden an mail.anotherdomain.tld geliefert. | | * | smtp:mail.anotherdomain.tld | Alle E-Mails werden an mail.anotherdomain.tld geliefert. | | [email protected] | smtp:mail.anotherdomain.tld | E-Mails für [email protected] werden an mail.anotherdomain.tld geliefert. |

Siehe

man transport

für weitere Details.

Bitte beachten Sie, dass die Reihenfolge der Einträge in der Tabelle transport wichtig ist! Die Einträge werden von oben nach unten befolgt.

Wichtig: Postfix verwendet einen Cache-Mechanismus für die Transports, daher kann es eine Weile dauern, bis Änderungen in der Transporttabelle wirksam werden. Wenn Sie möchten, dass sie sofort wirksam werden, führen Sie aus

postfix reload

nachdem Sie Ihre Änderungen in der Transporttabelle vorgenommen haben.

17 Senden Sie eine Willkommens-E-Mail zur Erstellung von Maildir

Wenn Sie ein neues E-Mail-Konto erstellen und versuchen, E-Mails von diesem abzurufen (mit POP3/IMAP), erhalten Sie wahrscheinlich Fehlermeldungen, dass das Maildir nicht existiert. Das Maildir wird automatisch erstellt, wenn die erste E-Mail für das neue Konto eintrifft. Daher ist es eine gute Idee, eine Willkommens-E-Mail an ein neues Konto zu senden.

Zuerst installieren wir das mailx-Paket:

yum install mailx

Um eine Willkommens-E-Mail an [email protected] zu senden, tun wir dies:

mailx [email protected]

Sie werden nach dem Betreff gefragt. Geben Sie den Betreff ein (z.B. Willkommen), drücken Sie dann ENTER, und geben Sie in der nächsten Zeile Ihre Nachricht ein. Wenn die Nachricht fertig ist, drücken Sie erneut ENTER, sodass Sie in einer neuen Zeile sind, und drücken Sie dann CTRL+D:

[root@server1 ~]# mailx [email protected]
Subject: Willkommen <– ENTER
Willkommen! Viel Spaß mit Ihrem neuen E-Mail-Konto. <– ENTER
<– CTRL+D
EOT
[root@server1 ~]#

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.