DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

Linux: Einfach E-Mails versenden mit msmtp

Linux Mail Logo

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.

 

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).

msmtp: Speicherort der Konfigurations-Dateien

msmtp: Speicherort der Konfigurations-Dateien

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

Links

, , , , , , ,

Kommentare: 107

  • Sebastian sagt:

    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.

    • Jan sagt:

      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

  • Tuxi sagt:

    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?

    • Jan sagt:

      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

  • Helix sagt:

    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

  • Henning Ryll sagt:

    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

    • Jan sagt:

      Hi Henning,

      ist -f bei Sendmail nicht die envelope from address? Hier gibt es eine Variable from in der msmtp-Config, welche lt. Doku wohl das gleiche macht.
      Wirkt das bei dir nicht?

      Gruß,
      Jan

  • Marcel sagt:

    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

    • Marcel sagt:

      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

  • Hans sagt:

    Hallo Jan,

    wo werden dann eigentlich die Log´s (Versand) von msmtp gespeichert?

    Vielen Dank

    Gruß Hans

  • Felix sagt:

    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.

    • Jan sagt:

      Hi Felix,

      kannst du aus der Meldung erkennen, was genau er mit „URL“ meint?

      Gruß,
      Jan

      • Felix sagt:

        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

        • Jan sagt:

          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

          • Felix sagt:

            das stimmt, ich versuche mal gmx und web.
            Danke!

          • felix sagt:

            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!

          • Jan sagt:

            Hi,

            ok, dann funktioniert es ja nun bei dir. Danke für die Rückmeldung!

            Gruß,
            Jan

  • Benjamin Nierlich sagt:

    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

  • Johannes sagt:

    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

    • Jan sagt:

      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

      • Johannes sagt:

        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

        • Jan sagt:

          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

          • Johannes sagt:

            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!

  • Johannes sagt:

    Hi, Ich dachte ja das macht die fertige Kontaktseite von flatpress, aber scheinbar doch nicht.

1 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.