orm@doc-tcpip.org

Erstellt: April 2001 - Letzte Modifikation: August 2003

[ Main | Local ]


Sendmail Einführung

Wie funktioniert das Mail-Geschäft?

Sendmail kann als Deamon Mail empfangen. Für das Versenden von Mail wird Sendmail einzeln gestartet.

Fluß einer Mail

Der User generiert eine Mail mit Hilfe eines MUA (Mail User Agent), also Netscape, mail, Pine, kmail etc.. Der Sender-MUA generiert Headers für die Mail MUA des Senders gibt die Mail an den MTA (Mail Transfer Agent), also sendmail, Postfix, Exim etc.. Jetzt müßen zwei Fälle unterschieden werden:

Lokale Mail

MTA ruft MDA (Mail Delivery Agent) auf; unter AIX ist das bellmail, andere OS setzen auch sendmail dazu ein. Der MTA Sendmail kann den Header noch modifizieren und die Mail in /var/spool/mqueue schreiben (Lockfile /var/spool/Lockfile). Der MDA legt die Mail in das Postfach des Empfängers, meist /var/spool/mail/userid. Der MUA des Empfängers liest die Mail dort aus, zeigt den Header und kann die Mail in Folders legen.

Remote Mail

Sendmail modifiziert eventuell den Header und bestimmt den Hostnamen.

Sendmail prüft den Hostnamen über DNS.

Sendmail schreibt die Mail nach /var/spool/mqueue.

Der lokale Sendmail öffnet eine Port 25 Verbindung zu einem entfernten MTA (z.B. sendmail im Deamon-Mode). Das Protokoll ist SMTP.

Der remote Sendmail checkt den User und empfängt die Mail. Hier geht es dann wie im lokalen Fall weiter.

Wo kann Mail liegen?

Empfangene Mail:
Liegt meist in /var/spool/mail/userid.

Versandte Mail:
Liegt in /var/spool/mqueue.

Hier finden sich pro Mail verschiedene Files.

Unzustellbare Mail:
Als dead.letter File im Home-Verzeichnis des Users. $HOME/dead.letter.

Geöffnete Mail:
$HOME/mbox.

Troubleshooting Sendmail

Statistiken

Mit Sendmail kann man direkt Statistiken erstellen. Diese sind umfangreich, und am besten schreibt man sich eine Reihe Skripte, um die Ausgabe auszuwerten und grafisch (z.B. Gnuplot) darzustellen.

Das Statistik-Kommando des Mailers ist mailstats. Man kann ein spezielles Sendmail-Configfile spezifizieren (Schalter -C), ein spezielles Statistik-File angeben (Schalter -f) sowie die Angabe des Mailers in der Ausgabe unterdrücken (Schalter -o). Ausserdem ist es möglich, die Ausgabe in einer maschinenlesbaren Form anzugeben und danach die Zähler auf Null zu setzen (Schalter -p ).

Die Lage des Statusfiles findet man in der sendmail.cf, der Eintrag ist StatusFile. Wenn man es setzt, muß man sendmail refreshen.

Die Abfrage funktioniert erst nach dem Empfang einer ersten Mail, sonst gibt es einen Fehler.

Die Ausgabe sieht so aus:

 
Wed Feb 13 15:00:00 CET 2002
Statistics from Thu Sep 27 05:48:00 2001
 M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis  Mailer
 3  7647921    9049490K     1717       2541K       67       0  local
 5 10359496   32123393K 10623543   33829538K   196384       0  esmtp
=============================================================
 T 18007417   41172883K 10625260   33832079K   196451       0
 C 18007417             10625260               196451

Die beiden Datums-Zeilen wirken zuerst etwas eigenartig. Die erste Zeile ist das aktuelle Datum der folgenden Werte, wird also auch hochgezählt. Die zweite Zeile gibt den Moment an, zu dem die Statistik des Sendmail-Daemons zuletzt resettet wurde. (Ich bin jetzt nicht sicher, ob das auch einen Reboot überlebt, glaube aber ja.)

Die Bedeutung der einzelnen Felder ist:

Die Werte werden pro Mailer angegeben. Nach der Doppellinie erfolgt die Angabe der Summe jeder Spalte, also über alle Mailer (Zeile T).

Die Zeile C listet alle Verbindungen auf.

Man kann die einzelnen Werte nicht einfach addieren, da eine Mail von Remote auch als Local auftaucht.

Durch Skriptgesteuertes Absetzen des Mailstat-Kommandos im Intervall und Auswertung per Skript kann man einmal die Verteilung der Mails über den Tag, die Quelle und die durchschnittliche Größe ermitteln.

Anzeigen aller unerreichten Adressen einer Mailingliste

Das geht mit dem sendmail-Kommando direkt:
/usr/lib/sendmail -bv list |grep -v deliverable

Anzeigen der Sendmail Version, der #defines der Kompilierung und der Identität des Localhosts

/usr/lib/sendmail -bt -d0.4 < /dev/null

Anzeigen der Mailqueue

sendmail -bp

Wenn die Mailqueue sehr voll ist, dann läuft dieses Kommando eventuell ins Leere. Dann ist besser das mailq-Kommando zu benutzen:
mailq -OMaxQueueRunsize=1

Verwerfen von Mails, die älter als 33 Tage sind

/usr/lib/sendmail -q -OTimeout.queuereturn=33d

Behandlen einer vollen Queue

Steht der Server, weil er mit der Mail-Queue nicht mehr zurechtkommt, führt man folgende Schritte durch:

Starten von Sendmail unter AIX

startsrc -s sendmail -a "-bd -q15"

Einstellen der maximalen Größe für Mails

MaxMessageSize=1000000 (das ist 1MB pro Message).

Inhalt des Controlfile qfxxxxxx

Mail von Hand Queuen

Man kann Mails bevorzugt abarbeiten:
sendmail -qIstring
Sendet alle Mails mit dieser Queue-ID.
Geht auch mit Sendern oder Empfängern:
sendmail -qRuser-ID
sendmail -qSuser-ID

Ein SPAM Notfall

Es kann unter Umständen nötig sein, Mail zu filtern. Dazu bietet Sendmail in den neueren Versionen viele Möglichkeiten. Man kann es im Notfall auch schnell und zu Fuß machen.

Dazu wird Sendmail so konfiguriert, daß alle Mail in eine Queue läuft. Diese filtert man mit einem eigenen Skript nach Schlüsselwörtern und wirft solche Mails einfach raus. Dann wird per cron die Queue abgearbeitet.

Zuerst wird die /etc/sendmail.cf editiert. Die Zeile DeliveryMode=background wird in DeliveryMode=queue geändert. Das zeigt dem Sendmail Dämon an, daß er die Mails nicht sofort zustellen, sondern in die Queue legen soll. Der Dämon muß jetzt gestoppt und gestartet werden:

stopsrc -s sendmail
startsrc -s sendmail -a "-bd -odq"
Alle Mail (Senden und Empfangen) geht jetzt nach /var/spool/mqueue - man muß also Platz vorsehen...

Jetzt muß ein einfaches Skript erstellt werden, daß regelmäßig über alle Dateien geht, und diese nach den Schlüsselwörtern durchsucht. In der Regel kann man das auf die Betreff-Zeile beschränken. Diese Files werden dann gelöscht.

Wie weiter oben erläutert, ist jede Mail (Nachricht) Nachricht durch mehrere Files vertreten. Die Files werden mit der Nummer der Mail benannt, sowie vorangestellten Buchstaben, die die Aufgabe des Files abgeben. Das File qfxxxxxx enthält den Header, das File dfxxxxxx enthält die eigentliche Nachricht. Alle Files, die zu einer Nachricht gehören (also diesselbe ID tragen) müßen gelöscht werden.


[ Main | Local ]

[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | RPi | SMTP | Tracing | GPS | LW ]

Copyright 2001-2021 by Orm Hager - Es gilt die GPL
Feedback bitte an: Orm Hager (orm@doc-tcpip.org )