Oftmals macht es Sinn, wenn man von einem Linux-System direkt eine E-Mail senden kann. Anwendungsbeispiele wären z.B. der Versand einer Mail, wenn ein Cronjob fehlschlägt oder auch eine Benachrichtigung, wenn durch fail2ban eine IP auf Grund zu vieler fehlgeschlagener Anmeldeversuche gebannt wurde.
Nun könnte man einfach einen Mail Transfer Agent, wie z.B. Sendmail oder Postfix auf dem System aufsetzen. Allerdings ist es recht umständlich einen „echten“ Mail-Server zu betreiben, v.a. wenn man nur einfache Mails zur Benachrichtigung versenden will.
Hierzu gibt es dann einfache Programme, die nicht mit einem echten Mailserver zu vergleichen sind, sondern die einfach Mails an einen bereits bestehenden STMP-Server senden können – dazu braucht man einfach nur einen SMTP-Client).
Vor einiger Zeit habe ich in diesem Blog schon mal den SMTP-Client sSMTP vorgestellt. Heute will ich eine Alternative dazu vorstellen: msmtp
Auch wenn der Artikel auf Ubuntu 18.04 basiert, sollte es kein Problem sein, das gezeigte Vorgehen auf anderen Systemen/Distributionen umzusetzen.
Update-Historie (letztes Update 31.08.2019)- 31.08.2019:
- Anpassungen für /etc/mail.rc ist notwendig, damit Mails versendet werden können.
- Hinweise hinzugefügt, wenn Mails auch von anderen Benutzern (ohne Root-Rechte) versendet werden sollen.
- 16.05.2019:
- Reihenfolge der auszuführenden Schritte verändert: Der Alias muss noch vor dem Versenden der Test-Mail gesetzt werden.
Inhalt
sSMTP läuft doch problemlos – was spricht dagegen?
Ich habe mit sSMTP immer gute Erfahrungen gemacht. Jedoch wird dieses Programm nicht mehr weiterentwickelt (Quelle: Arch Wiki). Dadurch kann ich sSMTP nicht mehr ohne Einschränkungen empfehlen. Wenn beispielsweise Bugs oder Sicherheitslücken gefunden werden, ist es fraglich, ob diese noch ausgebaut werden.
Generell sollte man aus diesen Gründen Abstand von Software nehmen, die nicht mehr aktiv weiterentwickelt wird. Trotzdem soll das nun nicht heißen, dass man sSMTP ab sofort nicht mehr verwenden sollte: Wer sSMTP bereits eingerichtet hat und damit keine Probleme hat, muss sich nun nicht sofort nach einer Alternative umsehen – trotzdem sollte man über kurz oder lang über ein „Update“ zu msmtp nachdenken.
Wer aber gerade auf der Suche nach einem leichtgewichtigen SMTP-Client ist, der sollte lieber gleich zu msmtp greifen.
Installation und Konfiguration vom msmtp
Zunächst bringen wir das System wie immer auf den neusten Stand:
apt-get update && apt-get upgrade -V
Anschließend wird msmtp installiert:
apt-get install msmtp msmtp-mta mailutils
Das Paket mailutils wird zwar nicht unbedingt benötigt, jedoch ist dies beim späteren Verwenden von Mails sehr hilfreich,.
Für die Konfiguration des Programms gibt es zwei unterschiedliche Konfigurations-Dateien:
- Eine systemweite Konfiguration
- Eine benutzerspezifische Konfiguration.
Wo diese unterschiedlichen Konfigurations-Dateien gespeichert sind, ermittelt man einfach mit folgendem Befehl:
msmtp --version
Für das weitere Vorgehen nutzen wir hier die systemweite Konfiguration, da E-Mails nur vom System selbst verschickt werden sollen (z.B. bei fehlgeschlagenen Cronjobs).

Beide Dateien sind nach einer neuen Installation nicht vorhanden (so dass man diese einfach nur auf die eigenen Bedürfnisse abändern könnte), allerdings gibt es auf der Website von msmtp eine Beispiel-Konfiguration.
Für die systemweite Konfiguration wird nun folgende Datei bearbeitet:
nano /etc/msmtprc
Hinweis: Mit dieser Konfiguration ist es nur als Root-User möglich, E-Mails zu versenden. Wenn weiteren Benutzern diese Möglichkeit gegeben werden soll, müssen diese Benutzer eine User-spezifische Konfigurations-Datei anlegen:
nano ~/.msmtprc
Inhaltlich sind die Dateien (systemweite und benutzerspezifische Konfiguration) gleich aufgebaut. Der Inhalt kann beispielsweise so aussehen (hier am Beispiel eines fiktiven Mail-Accounts meinedomain.de):
# Set default values for all following accounts. defaults # Use the mail submission port 587 instead of the SMTP port 25. port 587 # Always use TLS. tls on # Set a list of trusted CAs for TLS. The default is to use system settings, but # you can select your own file. tls_trust_file /etc/ssl/certs/ca-certificates.crt # If you select your own file, you should also use the tls_crl_file command to # check for revoked certificates, but unfortunately getting revocation lists and # keeping them up to date is not straightforward. #tls_crl_file ~/.tls-crls # Mail account # TODO: Use your own mail address account bob@meindedomain.de # Host name of the SMTP server # TODO: Use the host of your own mail account host smtp.meindedomain.de # As an alternative to tls_trust_file/tls_crl_file, you can use tls_fingerprint # to pin a single certificate. You have to update the fingerprint when the # server certificate changes, but an attacker cannot trick you into accepting # a fraudulent certificate. Get the fingerprint with # $ msmtp --serverinfo --tls --tls-certcheck=off --host=smtp.freemail.example #tls_fingerprint 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33 # Envelope-from address # TODO: Use your own mail address from bob@meindedomain.de # Authentication. The password is given using one of five methods, see below. auth on # TODO: Use your own user name fpr the mail account user bob@meindedomain.de # Password method 1: Add the password to the system keyring, and let msmtp get # it automatically. To set the keyring password using Gnome's libsecret: # $ secret-tool store --label=msmtp \ # host smtp.freemail.example \ # service smtp \ # user joe.smith # Password method 2: Store the password in an encrypted file, and tell msmtp # which command to use to decrypt it. This is usually used with GnuPG, as in # this example. Usually gpg-agent will ask once for the decryption password. #passwordeval gpg2 --no-tty -q -d ~/.msmtp-password.gpg # Password method 3: Store the password directly in this file. Usually it is not # a good idea to store passwords in plain text files. If you do it anyway, at # least make sure that this file can only be read by yourself. # TODO: Use the password of your own mail account password pAssW0Rd123 # Password method 4: Store the password in ~/.netrc. This method is probably not # relevant anymore. # Password method 5: Do not specify a password. Msmtp will then prompt you for # it. This means you need to be able to type into a terminal when msmtp runs. # Set a default account # TODO: Use your own mail address account default: bob@meindedomain.de # Map local users to mail addresses (for crontab) aliases /etc/aliases
Alle Einstellungen, die man individuell anpassen muss, sind hier mit „# TODO“ gekennzeichnet. Bitte auch die Kommentare in der Datei beachten.
Noch ein Hinweis auf die Authentifizierungs-Methode: In diesem Beispiel nutzen wird die einfachste Form der Authentifizierung, indem das Passwort des Mail-Accounts direkt in der Konfiguration gespeichert wird. msmtp unterstützt hier allerdings auch weitere Authentifizierungs-Methoden. Mehr Informationen dazu findet man in der Dokumentation zu msmtp.
Als nächstes sorgen wir dafür, dass nicht jeder Zugriff auf die Datei hat (besonders wichtig, wenn das Passwort direkt in der Konfiguration gespeichert ist):
chmod 600 /etc/msmtprc
Auch bei einer benutzerspezifischen Konfiguration müssen die Rechte angepasst werden:
chmod 600 ~/.msmtprc
Zum Schluss wird noch ein Alias angelegt, so dass die Empfänger-Adresse des Root-Accounts (oder des Accounts, mit dem später E-Mail versendet werden sollen) bekannt ist. Dies wird in der Datei angegeben, die auch schon ganz am Ende der Konfiguration von msmtp aufgeführt wurde:
nano /etc/aliases
Hier wird nun die Empfänger-Adresse des Root-Accounts angegeben. An diese Adresse werden nun E-Mails verschickt, wenn z.B. ein Cronjob fehlschlagen sollte. Daneben wird noch eine allgemeine „Fallback-Empfänger-Adresse“ angegeben, falls System-Meldungen nicht im Kontext des Root-Accounts auftreten:
root: admin@meinedomain.de default: admin@meinedomain.de
Bevor nun eine erste Test-Mail versendet werden kann, muss noch das Mail-Programm definiert werden:
nano /etc/mail.rc
Der Inhalt sieht dabei folgendermaßen aus:
set sendmail="/usr/bin/msmtp -t"
Nach der erfolgten Konfiguration vom msmtp können E-Mails nun ganz einfach über die Kommandozeile verschickt werden:
echo "Inhalt der E-Mail" | mail -s "Betreff" test@mail.de
Am besten gleich mal ausprobieren, indem ihr euch selbst eine Test-E-Mail schickt.
Fazit
Mit msmtp ist es einfach möglich, von einem Linux-System E-Mails zu versenden, ohne einen „schwergewichtigen“ Mail-Server aufsetzen zu müssen. Es wird einfach ein vorhandener Mail-Account (z.B. eines Freemailers) benutzt und die Konfiguration gestaltet sich auch sehr einfach.
Neben dem Mail-Versand von der Kommandozeile erhält man nun auch ganz komfortabel Benachrichtigungen per E-Mail, wenn beispielsweise ein Cronjob ausgeführt wurde, oder auch eine IP-Adresse von Fail2ban gebannt wurde.
Weiterführende Artikel
- Nextcloud auf Ubuntu Server 18.04 LTS mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban
- Ubuntu Server 18.04 LTS als Hyper-V Gastsystem installieren und optimal einrichten
- Linux: Einfach E-Mails senden mit sSMTP
Hi,
wie kann man eine Zweite Absender email anlegen?
Also ich habe 2 bash Scripte und im zweiten Skript möchte ich eine andere Absenderemailasdresse haben.
Hi,
ich denke, dies musst du mit verschiedenen Dateien ~/.msmtprc machen. Pro User eine andere, das Skript muss dann aber auch unter dem entsprechenden User ausgeführt werden.
Gruß,
Jan
Hallo und lieben Dank für den Artikel.
Ich möchte msmtp in Verbindung mit Friendica nutzen und bin nach dieser Anleitung vorgegangen.
Wenn ich von der Console aus manuell eine Mail verschicke funktioniert es.
Allerdings funktioniert es nicht in Verbindung mit Friendica. Ich vermute, dass es mit dem Apache „Nutzer“ www-data zusammenhängt?
Hast Du einen Tipp, wie ich an an diese Problem gehen könnte um es zu lösen?
Hi,
Frendica läuft dann unter dem User www-data? Hier müsstest du dann denke ich mal für diesen User auch die msmtp-Konfiguration vornehmen. Testen kannst du das Versenden der Mail über die Kommandozeile, indem du vorher mit
su - www-data
auf den Webserver-User wechselst.Gruß,
Jan
Hallo,
danke für die Anleitung.
Ich versuche das gerade auf meinem Ubuntu 20.04 Server für Nextcloud umzusetzen.
Leider bekomme ich nach dem Absetzen der Testmail folgende Fehlermeldung:
/usr/bin/msmtp: symbol lookup error: /usr/bin/msmtp: undefined symbol: type_b_loc, version GLIBC_2.3
mail: Sending data to /usr/bin/msmtp -t failed: Cannot execute
mail: cannot send message: Cannot execute
Hab ich irgendwo einen Schreibfehler drinnen? Finde leider nichts.
Hast du eine Idee?
Gruß Helix
Hallo Helix,
das sieht mir eher aus wie ein Programmfehler (also kein Konfigurationsfehler). Hier würde ich mal den Entwickler kontaktieren.
Gruß,
Jan
Hallo,
danke für die Anleitung. Ich musste allerdings noch den Parameter „tls_starttls off“ setzen, damit es mit meinem Provider funktioniert.
Ich habe allerdings noch nicht herausgefunden, wie man in der Standardkonfiguration einen „Absenderalias“ setzt.
Beim Aufruf von sendmail kann man den ja mitgeben.
sendmail -f „Blafasel “
Vielleicht hat dazu ja jemand einen Tip.
VG
Henning
Hi Henning,
ist
-f
bei Sendmail nicht die envelope from address? Hier gibt es eine Variablefrom
in der msmtp-Config, welche lt. Doku wohl das gleiche macht.Wirkt das bei dir nicht?
Gruß,
Jan
Hi Jan,
könntest du evtl noch zeigen, wie man den Inhalt der Email mit PGP (bzw GPG) absichert? Also die Email mit einem Public Key (signiert und) verschlüsselt?
Vorab vielen Dank
MfG
Marcel
Hi Jan,
ich hab’s schon.
Es muss gpg installiert und der Public Key des Empfängers importiert sein:
#!/bin/sh
header=$(cat <<-END
To: mail@mail.com
From: "Server"
Subject: SERVER INFO
MIME-Version: 1.0
Content-Type: text/plain
END
)
cipher=$(echo „PLAINTEXT“ | gpg –encrypt -r mail@mail.com –armor)
email=“$header$cipher“
echo „$email“ | /usr/bin/msmtp mail@mail.com
#–EOF—
Das war’s…
Vllt nimmst du es noch mit auf?
Viele Grüße
Marcel
Hi Marcel,
OK, du hast es ja schon selbst rausgefunden.
Danke für deine Erklärungen, ist vielleicht auch für andere ganz interessant.
Gruß,
Jan
Hallo Jan,
wo werden dann eigentlich die Log´s (Versand) von msmtp gespeichert?
Vielen Dank
Gruß Hans
Hi Hans,
das Logfile kannst du in der .msmtprc angeben.
Gruß,
Jan
Hallo Jan,
vielen Dank, dann passt scheinbar an meiner Konfig was nicht.
groups msmtp
sudo touch /var/log/msmtp
sudo chown msmtp:msmtp /var/log/msmtp
sudo chmod 660 /var/log/msmtp
logfile var/log/msmtp
Gruß Hans
Danke! Du beantwortest ja Jahre nach dem Tutorial noch Fragen. :) Ich habe die Anleitung befolgt (globale Konfiguration) und erhalte dennoch nur „Mail: Mailer kann nicht erstellt werden: In der URL fehlen benötigte Teile
mail: Nachricht kann nicht gesendet werden: In der URL fehlen benötigte Teile“. Den „-t“ Parameter habe ich schon mehrfach ohne Erfolg versucht zu ändern. „less secure apps“ ist bei gmail aktiviert. Eine msmtp.log existiert auch nicht. Ich stehe vielleicht auf dem Schlauch. Wenn du noch einen Tipp hast, wäre ich natürlich dankbar.
Hi Felix,
kannst du aus der Meldung erkennen, was genau er mit „URL“ meint?
Gruß,
Jan
Nein, leider nicht, dieser Zweizeiler ist alles, was er gibt. Ein „–verbose“ kennt mail auch nicht. sudo macht keinen Unterschied. Die Google Suche hierzu war auch erfolglos, auch auf englisch. Ich werde nochmal alles durchgehen, Schritt für Schritt. Habe den Pi jetzt seit mehreren Wochen und komme trotz vieler Misserfolge immer wieder zu diesem Ziel zurück. Wenn du einen Link o.ä. zu opensmtp empfehlen kannst, probiere ich das auch gerne mal aus. Im Gegensatz zu ssmtp scheint das ja noch aktiv gepflegt zu werden.
VG
Felix
Hi Felix,
um hier mal Google als Schuldigen auszuschließen: Probiert doch mal einen anderen Mail-Provider. Nicht, dass du dir da nun den Wolf suchst und letzten Endes liegt es an Gmail…
Gruß,
Jan
das stimmt, ich versuche mal gmx und web.
Danke!
Ich ergänze der Vollständigkeit halber: Google war nicht das Problem. GMX und Co. wollen sehr viele Informationen von mir, die ich nicht geben möchte. Ich habe letztlich auf medium.com eine Anleitung („setting up gmail on a raspberry pi“) für postfix gefunden, dessen Einrichtung super einfach war. Jetzt erhalte ich Mails bei Anmeldungen und Ereignissen, die ich selbst noch weiter definieren könnte. Danke dennoch für deine Hilfe!
Hi,
ok, dann funktioniert es ja nun bei dir. Danke für die Rückmeldung!
Gruß,
Jan
Hey ich habe da ein Fehler ich kann da aber nix falsches erkennen
mail: /usr/bin/msmtp -t: No such file or directory
Can’t send mail: sendmail process failed with error code 1
Hi,
existiert bei dir die Datei „/usr/bin/msmtp“? Was sagt „which msmtp“ bei dir?
Gruß,
Jan
Habe eben erst zufällig diese gute Seite gefunden, deshalb jetzt erst (im April 2022): Schau dir mal apparmor (in /etc) an. Dort wirst du fündig.
Hallo,
ich habe deine Anleitung befolgt und es funktioniert auch alles super.
Jetzt habe ich eine kleine Website, bei welcher über php die Mail versendet wird. Das funktioniert allerdings nur wenn ich mittels chown die Datei /etc/msmtprc für www-data frei gebe. Nun kann allerdings root keine Mails mehr verschicken. Kann ich direkt für www-data auch eine konfiguration anlegen, und wenn ja, wie?
Vielen Dank,
Johannes
Hi Johannes,
das sollte möglich sein, wenn du eine Datei .msmtp.rc im Home-Verzeichnis des Usersd www-data anlegst. Auch die „aliases“ nicht vergessen.
Wäre es aber nicht einfacher, die Mail-Funktion von PHP selbst zu nutzen und nicht dem „Umweg“ über msmtp?
Gruß,
Jan
Hi Jan,
wie komme ich in das Home-Verzeichnis von www-data? Es existiert weder unter /home, noch kann ich mittels „su – www-data“ zu diesem Benutzer wechseln…
Gruß,
Johannes
Hi,
ach ja, der User www-data hat ja im Normalfall gar kein Home-Verzeichnis, da es ja kein „echter“ User ist.
Schau mal hier vorbei, da sind ein paar Tipps zu genau deinem Problem aufgelistet.
Evtl. kannst du dir die Sache aber auch einfach er machen, wenn du einfach per setfacl den www-data-User auf die Datei (/etc/msmtprc) berechtigst.
Gruß,
Jan
Super, die Variante mit setfacl hat geholfen. chown auf www-data zu setzen funktioniert zwar auch, dann kann root aber keine Mails mehr senden.
Vielen Dank!
Hi, Ich dachte ja das macht die fertige Kontaktseite von flatpress, aber scheinbar doch nicht.
Hi Jan, relativ weird aber naja: ich habe mal auch noch für den ubuntu user die config erstellt (also im home ordner /.msmtprc) und wenn hab sonst alles brav nach anleitung gemacht. über echo „Test“ | sudo mail -s „Test“ empfänger@mail.de geht auch alles aber wenn ich stattdessen einfach mail -s „Test“ empfänger@mail.de nehme, gibt er mir das hier:
msmtp: /home/ubuntu/.msmtprc: line 1: unknown command Set
mail: Sending data to /usr/bin/msmtp -t failed: Process exited with a non-zero status
mail: cannot send message: Process exited with a non-zero status
Gibt es noch ein Teil den ich für den nicht Root User Konfigurieren muss oder was kann ich sonst noch falsch gemacht haben :)
Hi,
msmtp: /home/ubuntu/.msmtprc: line 1: unknown command Set
: das sieht mir so aus, als würde hier „set“ als Befehl in der entsprechenden Datei drin stehen (also nicht auskommentiert). Kann das vielleicht der Grund sein?Gruß,
Jan
Du bist ein EhrenJAN, Danke :D jetzt klappts…Kannst du evtl noch nen kleinen RUn down geben wie ich mit pgp diese Mails verschicke ? habe schon ein keypair generiert und nutze das auch schon, allerdings weiß ich nicht wie ich das einbinde bei msmtp
Bin da aus dem anderen Post nicht so ganz schlau geworden muss ich sagen :D Danke aber schon mal
LG
Hi Paul,
schau dir zum Thema mamtp + PGP mal diesen Link hier an.
Versucht habe ich das aber auch noch nicht. V.a. die Schlüsselverwaltung auf dem Server dürfte einigermaßen aufwändig sein.
Gruß,
Jan
Danke für dieses, wieder einmal so umfassende How-To, dass alle ‚gotchas‘ mit abdeckt.
Wenn mensch die config am Laufen hat ist die Installation von mpack (https://linux.die.net/man/1/mpack) mittels `apt install mpack`ein nettes Goodie.
Damit lassen sich dann mit `mpack -s „Subject“ /path/to/file recipient@address.tld`super simpel MIME-Attachments verschicken – praktisch z. B. um ein Scan2Mail einzurichten. :)
Danke!
Die BESTE und EINFACHSTE Anleitung die es im www zu finden gibt. :-)
TOP!
Hallo Jan,
leider kann ich keine Mails verschicken.
Wenn ich die Testzeile von dir abschicke (mit richtigem Empfänger) bekomme ich folgende Meldung:
„msmtp: Keine Empfänger gefunden“
…
Ich habe eine Konfiguration in /etc/msmtprc und auch die gleiche nochmal in /root/.msmtprc,
Eine /etc/aliases mit dem Empfänger für root ist ebenfalls vorhanden
Weder mit einem „richtigen“ Empfänger als auch mit „rot“ (der in der /etc/aliases auf den richtigen Empfänger gemapped ist) funktioniert es.
Was könnte das Problem sein?
Mit strace sehe ich nicht, dass eine msmtprc/.msmtprc geöffnet würde.
Kann man den debug Parameter für msmtp in /etc/mail.rc setzen?
Hi Paul,
die Meldung sagt ja leider erst einmal wenig aus.
Kannst du mal in der msmtp-Konfiguration ein Logfile angeben (z.B.
logfile ~/.msmtp.log
). Vielleicht steht hier eine sinnvollere Fehlermeldung drin.Gruß,
Jan
Vielen Dank für die schnelle Antwort.
in msmtprc steht bereits ein Logfile drin. Es wird aber kein Logfile angelegt.
ich habe den Eindruck, dass /etc/msmtprc und auch ~/.msmtprc gar gar nicht gelesen wird. Zumindest taucht dieser Name im strace-Protokoll gar nicht auf. Ich mache alles als root.
Hi,
schau mal, ob es die Log-Datei bereits gibt. Wenn nicht, dann einmal anlegen und dafür sorgen, dass die Gruppe ‚msmtp‘ Schreibrechte auf diese Datei hat. Mir ist es nämlich schon mal unter gekommen, dass nichts geloggt wurde, weil der Prozess die Datei einfach nicht beschreiben konnte.
Gruß,
Jan
Hallo und Danke für die Anleitung.
Das versenden von Mails funktioniert, aber beim Empfang bekomme ich immer die Meldung „keine Nachrichten für root“.
Kannst du mir erklären, was hier noch gemacht werden muss? Ich möchte die Inbox über den Betreff oder den Anhang überwachen, damit ich das angehängte CSV File ablegen kann.
Ist das möglich?
Hi,
wo werden die Mails denn empfangen und wo/wie wird diese Meldung dann angezeigt?
Bisher konnte ich eine solche Meldung noch nicht beobachten.
Gruß,
Jan