E-Mails versenden aus CLI und Shell-Scripts
Das Versenden von E-Mails aus der Linux Shell über einen Server ist sehr nützlich, wenn beispielsweise programmgesteuert Benachrichtigungen aus Shell-Scripts oder Webanwendungen generiert werden.
Dieses Tutorial beleuchtet, wie mit dem Mail-Befehl unter Linux E-Mails von der Befehlszeile aus versendet werden. Zur Anwendung kommt Heirloom („mailx“), das verbreitete Open Source Projekt beinhaltet eine Sammlung traditioneller Unix-Dienstprogramme. Ziel ist es, durch praxiserprobte Beispiele mögliche Lösungswege wiederzugeben, es stellt jedoch keine komplette Sammlung umfangreicher Anwendungsmöglichkeiten dar.
mailx – mailutils bei Fedora und CentOS
Damit das Versenden möglich ist, muss das Paket mailx, oft auch mailutils auf dem host vorhanden sein, die Bereitstellung unter Fedora und CentOS geht wie folgt:
$ sudo yum install -y mail
heirloom-mailx bei Debian und Ubuntu
Für Debian und Linux Mint oder weitere Ubuntu forkes kann folgendes apt-get command ausgeführt werden:
$ sudo apt-get install heirloom-mailx
Der CLI Befehl mail ist nun in der Shell anwendbar:
$ mail -s "Hello World" email@example.com
Beim ersten Versuch eine E-Mail zu Versenden, erhält man wahrscheinlich gleich mal ein Fehler!
No configuration file found at /home/joe/.esmtprc or /etc/esmtprc
Gelöst wird der Fehler, indem man die Konfigurationsdatei esmtprc erstellt, mit vi oder nano oder dem Editor der Wahl:
$ vi ~/.esmtprc
Ein SMTP-Gateway hinzufügen, dieses es erlaubt von unserem Host E-Mail anzunehmen.
hostname = smtp.example.com:25
Mit dieser Konfiguration wird der Benutzer berechtigt, über smtp.example.com E-Mails zu Versenden. Sollen alle Benutzer berechtigt werden, muss die Datei /etc/esmtprc erstellt und bearbeitet werden.
Gibt es noch ein Fehler! muss ein Relayhost berechtigt werden:
SMTP server problem Connection refused
Es sollen E-Mails von unserem Host angenommen werden, zB. soll das Gateway smtp.example.com über TCP Port 25 E-Mails weiterleiten.
Beim SMTP-Gateway wird, wenn dieses Postfix ist, die Datei main.cf angepasst. Mit sudo die Postfix Hauptkonfiguration main.cf editieren.
$ sudo vi /etc/postfix/main.cf
Bei mynetworks wird die Host IP oder der Hostname hinzugefügt, dieser E-Mails versenden darf.
mynetworks =
127.0.0.0/8
[::1]/128
192.168.2.3
In diesem Beispiel ist 192.168.2.3 unser Host von diesem E-Mails versendet werden sollen.
Die änderung der Postfix Hauptkonfiguration aktivieren:
$ sudo postfix reload

Beispiele Mail versenden in der Befehlszeile
echo "message here" | mail -s "subject" email@example.com < dump.sql.gz
Die klassische Methode ist die Verwendung von sendmail.
$ sendmail -F "Linux host" -f "noreply@example.org" -t
email@example.org << EOF
Subject: try to test
seems it works.
EOF
Mit sendmail den Inhalt von stats.log an example@email.org senden.
$ (cat /mnt/stats.log) | sendmail -i -- example@email.org
Das Versenden eines zuvor erstellten SQL-Dump, dieser nach der Sicherung zugestellt werden soll.
subnet="$(ip -4 a | grep inet | grep -v 'virbr' | grep -v 'docker' | awk '{print $2}' | grep -v '127.0.0.1')"; ipcalc "${subnet}" | mail -s "${subnet}" hostmaster@example.com
Hier wird die IPv4 Konfiguration mit dem ip-Befehl ermittelt, es wird versucht die virtuellen Interfaceses durch grep und awk auszufiltern.
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | mail -s "ifconfig" hostmaster@example.com
ifconfig ist der traditionelle Befehl, dabei muss bei neueren Distributionen das Paket net-utils installiert sein.
hostnamectl | mail -s "my host" email@domain.com
Der Befehl hostnamectl liefert nützliche Informationen, vorhanden bei neueren Linux Versionen.
Der Aufruf man mail zeigt die umfangreichen Möglichkeiten von mailx.