Logo Juerg Wenger

Mailen aus der Bash

Wenn doch alles so einfach wäre. Ein Mail aus der Bash (resp. aus einem Programm) senden gestaltete sich schwieriger als gedacht. Aber die Lösung dazu ist zum Glück dann auch "relativ" einfach.

Das Problem

Mein Netzwerküberwachungsprogramm Nagios zu Hause soll mir Emails senden, wenn ein Alarm ansteht. Dieses Email wird dann in ein SMS ugewandelt und mir auf dem Handy signalisiert. Nun, das Senden von E-Mail von einem Linux-Rechner ist an-und-für-sich kein Problem, der Zielmailserver resp. die implementierte SPAM-Verhinderungspolitik stellt dabei die eigentliche Hürde dar (wie man einen Mailserver auf Basis von Postfix einrichtet findet ihr hier).
So geht es doch darum, dass lediglich Benutzer mit ihrer eigenen E-Mailadresse E-Mails unter diesem Namen versenden dürfen. Und um dies sicherzustellen, wird ein Authentisierungsverfahren eingesetzt. Man spricht dabei auch von der SASL-Authentisierung. Nun kann aber ein simpler Mail-Client auf einem Linux-Rechner dies meist nicht und das Email kann nicht gesendet werden. Es muss also ein Mail-Client her, der SASL-Authentisierung unterstützt !

Die Lösungsansätze

  •  
  • Mit dem Standard-Mailclient Mails versenden
     Der standardmässig vorhandene Mailclient nutzt den Linux MDA (Mail-Delivery-Agent). Dieser muss natürlich für das versenden von E-Mails "nach draussen" eingestellt resp. es muss erlaubt sein. Ich verwenden Debian-Linux. Und Debian benutzt als Mailserver standardmässig den exim4. Und dieser ist lediglich für das Zustellen von lokalen Mails auf dem eigenen Server resp. der eigenen Domain eingestellt. Umkonfigurieren lässt sich exim4 komfortabel mit dem Befehl: dpkg-reconfigure exim4-config --> den Parameter auf internet-site stellen
    Nun können zwar E-Mails "nach draussen" gesendet werden, aber sie scheitern wie erwähnt an der SASL-Authentisierung.
  •  
  • Mit alternativen Clients Mails versenden
     Andere Mail-Clients wie bsp. nail oder mailx unterstützen zwar SASL, allerdings müssen diese Clients eine .mailrc - Datei im Home-Verzeichnis des Users haben um korrekt zu funktionieren. Da ich aber wie eingangs erwähnt, per Skript Mails versenden will ist diese Lösung (für mich) nicht ganz zweckmässig.

Die definitive Lösung

Das FreeWare-Programm sendEmail (der grosse E ist wichtig) war schlussendlich die Lösung des Problems. Dieses Tool ist in der Lage aus der Bash oder aus einem Script heraus Mails mit SASL-Authentisierung zu versenden. Und dies ganz ohne irgendwelche Zusatzmodule laden zu müssen. Das kleine Tool findet ihr hier.

Installation:

Die Installation ist kein Problem, mittels der Paketverwaltungssoftware werden neben "sendEmail" noch folgende Pakete installiert:

libio-socket-ssl-perl, libnet-ssleay-perl, perl

Unter Debian wird dies via "apt" wie folgt installiert: (andere Linux Distributionen ähnlich)

apt-get install sendEmail libio-socket-ssl-perl libnet-ssleay-perl perl

Benutzung:

sendEmail -v -f username@provider.land -s smtpserver:port -xu username -xp passwort -t empfaenger@provider.land -o tls=no -u "Betreff: Test" -m "Nachrichtentext"

Die Optionen im Einzelnen:

-v verbose: Debug-Modus (hilfreich zur Fehlersuche da alle Meldungen angezeigt werden)
-f from: die Absenderadresse (Beispiel: fritzli@gmx.net)
-s server:port: Der SMTP-Server (Postausgangsserver) mit Angabe des Portes (SMTP = Port 25)
-xu username: Der Benutzername (meistens die komplette E-Mailadresse)
-xp password (SMTP): das E-Mailpasswort (wird verwendet zwecks Authentisierung)
-t to: Empfängeradresse
-cc carbon copy: Kopie(n) der E-Mail an diese Adresse senden
-bcc blind carbon copy: Versteckte Kopie(n) der E-Mail an diese Adresse senden
-o option Die eigentliche SASL-Authentisierung. Ja yes oder no wird die Art der Passwortübertragung definiert. (Je nachdem ob der Server TLS [Transport Layer Security] unterstützt. no=Passwort wird in Klartext übertragen, yes=Passwort wird verschlüsselt übertragen)
-u subject: Betreffzeile/td>
-m message: Nachrichtentext des E-Mails
-a attachement: Pfad zum Dateianhang der mitgesendet werden soll