Mails aus der Kommandozeile

E-Mails sind bei vielen täglich das erste was morgens bei der Arbeit überprüft wird. Warum also sollte man sich nicht Status E-Mails zusenden lassen. Dies kann einem evtl. helfen schneller auf bestimmte Probleme zu reagieren. In diesem kurzen Anleitung erkläre ich wie Mails aus der Kommandozeile versendet werden können.

Wer aus einem Skript oder direkt von das Kommandozeile eine E-Mail versenden möchte und keinen eigenen Mailserver betriebt, kann dies mit Hilfe von ssmtp und mailutils realisieren. Dies benutze ich z.B. um mir von meinem Computer den Status und die Logdatei des letzten Backups zu kommen zu lassen. Voraussetzung ist ein E-Mailkonto bei einem Anbieter (Google, GMX o.ä.) oder einen eigenen SMTP-Relay-Server (Smarthost). Da wir so einen offiziellen Mailserver nutzen, sollten unsere Mails auch nicht beim Empfänger im SPAM-Ordner landen. Dies wäre unter Umständen der Fall wenn wir einen Mailserver mit dynamischer IP betreiben oder diesen falsch konfiguriert haben.

Mails aus der Kommandozeile einrichten

Schritt 1 Installation

Den extrem einfachen gehaltenen Mail-Transfer-Agent (MTA) ssmtp und das Mailframework mailutils installieren mit:

sudo apt-get install mailutils ssmtp

Schritt 2 Konfiguration

Jetzt müssen die Einstellungen vorgenommen werden, mit welchem Smarthost gesendet werden soll und welcher Benutzer senden darf.
Für den Smarthost muss folgende Datei angepasst werden:

sudo nano /etc/ssmtp/ssmtp.conf

Als Beispiel, zeige ich hier die Konfigurationen für GMX.de und GoogleMail. Ihr müsst diese nur noch mit euren Daten anpassen.

Beispiel GoogleMail

root=BEISPIEL@googlemail.com
mailhub=smtp.gmail.com:587
hostname=BEISPIEL@googlemail.com
UseTLS=YES
UseSTARTTLS=YES
AuthUser=BEISPIEL
AuthPass=MEINPA$$W0RT
AuthMethod=plain
FromLineOverride=YES

Beispiel GMX.de

root=BEISPIEL@gmx.de
mailhub=mail.gmx.net:587
hostname=gmx.net
UseTLS=YES
UseSTARTTLS=YES
AuthUser=BEISPIEL@gmx.de
AuthPass=MEINPA$$W0RT
AuthMethod=plain
FromLineOverride=YES

Wie Ihr seht, unterscheiden diese sich nicht sonderlich. Darum ist es auch sehr leicht dies für einen eigenen oder andern Mailserver anzupassen. Weiter Infos zu dieser Konfigurationsdatei kann auf der man page gefunden werden.

Nun muss die 2. Konfigurationsdatei angepasst werden. Hier legt Ihr fest welcher Benutzer senden darf.

sudo nano /etc/ssmtp/revaliases

Beispiel wäre:

root:BEISPIEL@googlemail.com:smtp.gmail.com:587
BENUTZER1:BEISPIEL@googlemail.com:smtp.gmail.com:587
BENUTZER2:BEISPIEL@gmx.net:mail.gmx.net:587

Bzw. müssen die Daten dann für einen andern Smarthost angepasst werden.

Schritt 3 Testen

Jetzt könnt ihr endlich die erste Testmail von der Kommandozeile senden.
Gebt dazu folgenden Text ein:

echo "Hallo dies ist ein Test" | mail empfaenger@beispiel.de -s "MeinBetreff"

Um einen Anhang mitzusenden muss der Parameter -A mitangeben werden:

echo "Hallo dies ist ein Test mit Anhang" | mail empfaenger@beispiel.de -s "MeinBetreff" -A "/tmp/beispiel.txt"

Wer Probleme hat, bzw. glaubt keine E-Mails zu senden, kann sich mit folgendem Befehl:

echo "Subject:TEST" | ssmtp -v empfaenger@beispiel.de

den Verbindungsablauf ins Terminal holen. So gibt es bei Problemen nützliche hinweise auf z.B. falsche Port und Adressen Einstellungen.

Optional Schritt 4 Die Konfiguration schützen

Da die Datei /etc/ssmtp/ssmtp.conf euer Passwort im Klartext enthält, sollte diese besonders geschützt werden! Dazu empfiehlt es sich eine eigene Gruppe für den MTA ssmtp anzulegen, dass nur dieser und ROOT die Datei lesen darf.
Folgende Schritte sind hierzu notwendig:

su
groupadd ssmtp
chown :ssmtp /etc/ssmtp/ssmtp.conf
chown :ssmtp /usr/sbin/ssmtp
chmod 640 /etc/ssmtp/ssmtp.conf 
chmod g+s /usr/sbin/ssmtp 
exit

Ein Dank geht hierfür an den Arch Linux Wiki Artikel. Ohne diese Absicherung wäre mit diese Methode auch zu unsicher gewesen.
Die Rechte können abschließend mit ls -l überprüft werden und sollten jetzt wie folgt gesetzt sein:

ls -l /etc/ssmtp/ssmtp.conf 
-rw-r----- 1 root ssmtp 761 Mai 20 17:31 /etc/ssmtp/ssmtp.conf

 

Jetzt solltet Ihr auch in der Lage sein, einen Status aus z.B. einem Backupskript per Mail zu versenden.
Dies könnte folgendermaßen aussehen:

#!/bin/bash
RECP="empfaenger@beispiel.de"      # E-Mail Empänger des Statusbericht
SOURCE=$HOME                       # Backup Quelle
BACKUPDIR=/mnt/usb1/backup         # Backup Ziel
DATE=$(date +%d.%m.%Y" "%H:%M)     # Datums & Uhrzeit
#
tar -cpf ${BACKUPDIR} ${SOURCE}    # Backup starten
#
if [ $? -ne 0 ]; then              # Überprüfen ob der letzter Befehl erfolgreich war
mail $RECP -s "Backup war fehlerhaft!" <<EOM
Das Backup wurde mit Fehler(n) beendet.
Start: ${DATE}
Ende: `date +%d.%m.%Y" "%H:%M`
Bitte das letzte Backup überprüfen und ggf. wiederholen.
EOM
else
mail $RECP -s "Backup war erfolgreich" <<EOM
Das Backup wurde erfolgreich in ${BACKUPDIR} erstellt.
Start: ${DATE}
Ende: `date +%d.%m.%Y" "%H:%M`
EOM
fi
#EOF

Natürlich ist dies nur ein sehr einfaches Beispiel und dient nicht zum Sicher irgendwelcher Daten. Möglichkeiten so Mails zu versenden gibt es viele, mit etwas Kreativität können auch sinnvollere Skripte zu Stande kommen.

Wer seine Mail verschlüssel über die Kommandozeile versenden möchte sollte sich folgenden Artikel anschauen: GPG verschlüsselte Mails aus der Kommandozeile

ENDE :)

5 Replies to “Mails aus der Kommandozeile”

  1. Georg

    Spricht denn etwas dagegen, in Scripten gleich auf einen Client wie mutt zu setzen?
    Also z.B. so:
    mutt -s '$wurst' abc@gmail.com -a irgendeinlog.txt
    Vielleicht spricht aber auch das Thema Sicherheit gegen die Nutzung solcher Clients auf Servern, da kenne ich mich nicht gut genug aus.

    Smartphone- oder Tablet-Nutzer (ich kann da nur von Android und Meego reden) können dann auch ihren gewohnten Mailclient für die Kommandozeile über SSH unterwegs nutzen.

    1. Andre Post author

      Hi Georg,
      aus meiner Sicht spricht technisch nichts gegen Mutt oder andere Kommandozeilen Mailprogramme. Aber da ich es einfach für die Leser und mich halten möchte, setze ich auch auf einen einfach gehaltene Software.
      Als alternative zu ssmtp könnte noch msmtp genannt werden.

  2. tux.

    Warning: sprintf(): Too few arguments in /var/www/virtual/andre.hemk.es/htdocs/wp-content/themes/catch-base/inc/catchbase-core.php on line 761

    Hihi.

    Zum Artikel: Ich finde es etwas schade, dass „Linuxanleitungen“ sich meist auf 1 bestimmte Konfiguration (bestimmter Paketmanager, bestimmte Shell, …) beziehen. Dabei sind sie oft so portabel. Auch unter FreeBSD mit der tcsh zum Beispiel funktioniert es (pkg install ssmtp) weitgehend unverändert.

    1. Andre Post author

      Hi Tux,
      ist mir persönlich auch schon öfters aufgefallen (auch bei mir). Aber mit fällt es schwer die Befehle auf andere Systeme zu portieren, da ich nur Erfahrung mit diesem „einen“ System habe.
      Gerade FreeBSD wird warscheinlich bei vielen erfahreren Anwendern eingesetzt. Ich kann aber leider nur aus meiner eingeschränkten Sicht schreiben um auch eine gewisse Qualität im Artikel bieten zu können.
      Mein Artikel darf aber gerne portiert werden ;)

      1. Tux.

        Port:

        1. pkg install ssmtp
        2. vi /usr/local/etc/ssmtp/ssmtp.conf

        Rest wie beschrieben. (Ungetestet.)