Sendmail

Sendmail-Queues

Das Aufteilen eingehender bzw. zu versendender Mails ist für hochfrequentierte Mailserver nützlich. Sendmail verschickt Mails anhand ihrer Priorität, die aus folgenden Faktoren berechnet wird:

  • Größe der Email
  • Priorität (kann im Mailer eingestellt werden)
  • Anzahl der Empfänger
  • Wie lange ist die Mail schon in der Queue? Jeder Zustellungsversuch verringert die Priorität

Je höher dieser Prioritätswert ist, desto niedriger ist die Priorität mit der sendmail diese Mail behandelt.

Hat man nun ein hochfrequentiertes System und eine Mail konnte mehrmals nicht zugestellt werden, kann es durchaus sein, dass diese Mail lange Zeit in der Queue festhängt.

Abhilfe schafft hier die Konfiguration weiterer Mailqueues, die mit unterschiedlichen Wiederholungszeiten abgearbeitet werden. Hierzu wird in der sendmail.mc folgender Eintrag vorgenommen:

FEATURE(`queuegroup')
QUEUE_GROUP(`mqueue', `P=/var/spool/mqueue/mqueue, R=5, r=15, F=f, Interval=1h')
QUEUE_GROUP(`fast', `P=/var/spool/mqueue/fast, R=5, r=15, F=f, Interval=5m')
QUEUE_GROUP(`cno', `P=/var/spool/mqueue/cno, R=5, r=15, F=f, Interval=15m')

in access:

QGRP:default                    mqueue
QGRP:de                         fast
QGRP:wichtig.com                fast
QGRP:auchwichtig.org            fast
QGRP:com                        cno
QGRP:net                        cno
QGRP:org                        cno

danach mit „make“ (das sendmail-cf paket muss installiert sein) die Konfiguration neu bauen.

Die Standardgruppe ist mqueue, diese wird stündlich abgearbeitet. Hier wandern alle Mails rein, die auf keine der anderen Queues zutreffen. Alle Mails an .de-Adressen / wichtig.com und auchwichtig.org werden in die fast-Queue einsortiert und alle 5 Minuten abgearbeitet. Mails an .com/.net/.org-Adressen wandern in die cno-Queue und werden alle 15 Minuten abgearbeitet.

Zeitgesteuertes Versenden anhand der Absenderadresse

Diese Anleitung wurde für CentOS 5.5 geschrieben, unter anderen Distribution sollte das mit etwas Mitdenken genauso möglich sein.

Dieses Szenario beschreibt ein Mailrelay, welches eingehende Mails erstmal in eine Queue schiebt, die dann später zeitgesteuert z.B. per Cron abgearbeitet wird.

http://www.murty.net/qgrpx/

Es sind mehrere Queues mit verschiedenen Zeiten möglich. Das Einsortieren in die Queues kann anhand folgender Kriterien konfiguriert werden (das Standard-CF queuegroup kann nur mit Zieldomains umgehen, für die Sortierung anhand Absenderadresse muss die Erweiterung queuegroupx installiert werden):

QFTO:sender@senderdomain.com<@>recipient@recipientdomain.com  qg1
QFTO:<><@>recipient1@recipientdomain1.com                     qg2
QFRM:sender1@senderdomain1.com                                qg3
QFRM:senderdomain2.com                                        qg4
QFRM:<>                                                       qg5
QGRP:recipient2@recipientdomain2.com                          qg6
QGRP:recipientdomain3.com                                     qg

Installation und Konfiguration

Das bei sendmail mitgelieferte CF-Script queuegroup kann die Sortierung nur anhand der Zieldomain erledigen (QGRP:recipientdomain3.com qg). Werden die anderen Kriterien benötigt muss die Erweiterung queuegroupx von http://www.murty.net/qgrpx/ installiert werden. Dort steht auch, wie die Erweiterung installiert werden muss. Für CentOS reichts aus, die m4-Datei nach /usr/share/sendmail-cf/feature/queuegroupx.m4 zu legen.

Zuerst müssen die Verzeichnisse für die neuen Queues angelegt und berechtigt werden. Die Default-Queue wandert von /var/spool/mqueue/ nach /var/spool/mqueue/default. Die weiteren Verzeichnisse sind für unserer Queues:

cd /var/spool/mqueue
mkdir default
mkdir adminmails
mkdir apache
chown root.mail *
chmod go-rwx *

In die Datei /etc/mail/sendmail.mc werden folgende Zeilen (ca. ab Zeile 101, unter FEATURE access_db) eingefügt. Achtung, hier wird beim FEATURE zwischen queuegroup und queuegroupx unterschieden!

dnl #
dnl # just queue incoming mails, they are send via cron
define(`confDELIVERY_MODE', `q')dnl
dnl #
dnl # queuegroups for the different senders
FEATURE(queuegroupx)dnl
QUEUE_GROUP(`mqueue', `P=/var/spool/mqueue/default, R=5, r=15, F=f, Interval=1h')dnl
QUEUE_GROUP(`adminmails', `P=/var/spool/mqueue/adminmails, R=5, r=15, F=f, Interval=1h')dnl
QUEUE_GROUP(`apache', `P=/var/spool/mqueue/apache, R=5, r=15, F=f, Interval=1h')dnl
dnl #

der DeliveryMode wird auf q gesetzt, d.h. alle eingehenden Mails werden nur in eine Queue gesteckt und nicht weiter bearbeitet. Danach werden die verschiedenen Queues konfiguriert.

In der Datei /etc/mail/access müssen jetzt noch die Kriterien für die Sortierung konfiguriert werden (ich verwende hier queuegroupx für die Sortierung anhand des Absenders):

QFRM:root@localhost       adminmails
QFRM:apache@localhost     apache

Alle Mails, die keine Treffer bei den obigen Regeln haben, werden in die Standardqueue mqueue einsortiert.

Damit der Server auch als Relay verwendet werden kann, müssen noch die erlaubten Netze konfiguriert werden, aus denen Mails eingeliefert werden dürfen (oder ihr konfiguriert SMTP-Auth):

In /etc/mail/access z.B. folgendes eintragen, um den Servern in den Netzen 192.168.60.0/24 und 10.11.12.0/24 das relayen von Mail über diesen Server zu erlauben:

Connect:192.168.60			RELAY
Connect:10.11.12			RELAY

Außerdem muss sendmail noch so konfiguriert werden, dass es auch auf den externen IP-Adressen lauscht. Dazu in /etc/mail/sendmail.mc die folgende Datei auskommentieren.

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

jetzt muss nur noch ein Cronjob konfiguriert werden, der den Queuerun startet, damit die Mails auch verschickt werden:

*/30 * * * * sendmail -vqR -qGmqueue
0 0 * * * sendmail -vqR -qGadminmails
0 0 * * * sendmail -vqR -qGapache

Flush mailqueues - Auslieferung erzwingen

Bei sendmail geht das Leeren der Queue über folgenden Befehl:

sendmail -vqR

einzelne Mails zu flushen geht AFAIK nicht, aber für eine bestimmte Domain ist es kein Problem:

sendmail -vqRmagenbrot.net