Mails an LMTP einliefern via MSMTP und MUTT von der Command Line

Abstract

Hin und wieder gibt es Sonderfälle, bei denen man von der Command Line Mails verschicken will, die z.B. nicht nach Außen weitergeleitet werden sollen. Man kann dies lösen, indem man die Mails direkt an den Dovevot-LMTP-Server einliefert und nicht über SMTP.

Hin und wieder gibt es Sonderfälle, bei denen man von der Command Line Mails verschicken will, die z.B. nicht nach Außen weitergeleitet werden sollen. Man kann dies lösen, indem man die Mails direkt an den Dovevot-LMTP-Server einliefert und nicht über den vorgelagerten SMTP-Server.

Die Programme mailx oder nail, die man für gewöhnlich zum Mailen von der Kommandozeile verwendet, bieten keine Option, um via LMTP einzuliefern. Um dies zu lösen, kann man die Kombination von MSMTP und MUTT nutzen.

Zunächst muss der Dovecot LMTP konfiguriert werden. Entscheidend ist der Eintrag inet_listener, der aus Gründen der Sicherheit normalerweise nur an localhost address = 127.0.0.1 gebunden wird.

Auf Ubuntu- oder Debian-Systemen kann man dann per apt-get install mutt msmtp die benötigte Software installieren.

Als Postmaster in solchen Sonderfällen arbeitet man wohl häufiger als root, deshalb wären dementsprechend folgende rc-files im /root Verzeichnis anzulegen. Die dazu passende .msmtprc könnte z.B. so aussehen:

defaults
host localhost
protocol lmtp
account default
host localhost
port 24
from hostmaster@mail.server.de

Statt des allgegenwärtigen sendmail-Aufrufs wird in der .muttrc dann auf msmtp verwiesen:

set sendmail="/usr/bin/msmtp"

Jetzt kann ich E-Mail von der Command Line via LMTP absetzen:

mutt -e "set from=hostmaster@server.de" -s "Testmutt1" test@server.de < /etc/hosts -a /etc/hosts

Die Parameter im Einzelnen:

-e       "set from=Absender"
-s       "Betreff"
         Empfänger
<        irgendeine Textdatei mit dem Inhalt der Mail
-a       Anhangsdatei

Diese Syntax lässt sich auch aus Shell-Scripten heraus benutzen.

Anwendungsgebiete

In meinem Fall stelle ich auf die oben genannte Weise Exporte von Horde Kalendern und Adressbüchern aus einem Skript als Mailanhang einmal täglich per cron allen Mailboxen zu.

Diese Mails werden per globaler Sieve-Regel in einen versteckten, automatisch erstellten IMAP-Ordner sortiert, der bei einem POP3-Abruf nicht berücksichtigt wird. Außerdem gelten für diesen speziellen Ordner Ausnahmen bei der Mailquota. Zuletzt werden diese Mails nach 10 Tagen automatisch per Cron wieder gelöscht:

# doveadm expunge -A mailbox Spezial-Ordner savedbefore 10d

Die Motivation hinter dieser etwas komplizierten Prozedur liegt in der Fähigkeit von Horde, als ActiveSync-, CalDAV-, CardDAV- und SyncML-Server für z.B. Smartphones zu fungieren. Bedauerlicherweise sind die Sync-Vorgänge nicht immer perfekt, und Adressbücher oder Kalender können (warum auch immer) korrupt werden.

Der User hat dann auf jeden Fall selbst die Möglichkeit, den Spezial-IMAP-Ordner mit den Backups sichtbar zu schalten und aus den Backup-Mails seine Kalender oder Adressbücher wieder zurückzuspielen.

Nur Mailboxen können Kalender und Adressbücher besitzen, aber wenn man Mail-Setups mit Postfixadmin z.B. an die Postmaster der Maildomains delegiert hat, können Mails an Mailbox/Mailadressen auch nach Außen umgeleitet werden, deshalb ist die Zustellung per SMTP problematisch. Mit dem Einliefern über LMTP können aber z.B. auch noch Spamfilter auf SMTP-Ebene umgangen werden, die man sonst eventuell kompliziert konfigurieren muss.

Note

Denkbar ist dieses Vorgehen auch für die Zustellung von Mails mit täglichen Mail-Logdaten oder sogenannten Postmaster-Mails.

Update

Auch swaks kann per LMTP einliefern

$ swaks --from postmaster@example.com --to tester@beispiel.de --socket /var/spool/postfix/private/dovecot-lmtp --protocol LMTP --header "Subject: TEST ignore" --body ./sendtestmail.txt
Robert Schetterer, 10. July 2013

   mutt    msmtp    Dovecot    LMTP    shell    swaks