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 E-Mail Versenden aus der Linux Shell 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.