Linux und Ich

Blog über Ubuntu, Linux, Android und IT

System-Mails ohne einen eigenen richtigen Mail-Server mit ssmtp verschicken

System-Mails ohne einen Mail-Server mit ssmtp verschicken

| 42 Kommentare

Es gibt Fälle, in denen soll das eigene Linux-System Mails verschicken können. Ein Beispiel wäre etwa Cron, das im Fall von Problemen Status-Mails verschicken kann. Oder man hat einen Webserver installiert, über den mittels der mail-Funktion von PHP Mails verschickt werden sollen usw., doch extra dafür schwere Brocken wie Postfix, Sendmail und Co. einzurichten wäre zu aufwändig. Noch dazu ist es für “Privatleute” ohne richtigen Server, ohne ordentliche Zertifikate und ohne feste IPs sowieso nicht möglich direkt Mails zu verschicken, da die meisten Mail-Server den Empfang von solchen Servern sowieso ablehnen, sonst wäre ja SPAM-Versender Tür und Tor geöffnet. Für den Privatmann gilt es daher eigene Mails an einen SMTP-Relay-Server weiterzuleiten (also den SMTP-Mailserver eines “ordentlichen” Anbieters) und dafür reicht auch ein simples Tool wie ssmtp.

ssmtp ist kein ausgewachsender MTA (Mail-Transfer-Agent) wie Postfix, Exim oder eben Sendmail, sondern einfach nur ein kleines Tool das eine Mail vom System entgegennimmt und zu einem zuvor konfigurierten Mailserver weiterleitet. Wie eingangs gesagt, müsste man mit einem Heimserver einen MTA wie Postfix sowieso als “Satellite System” konfigurieren und Mails über einen Smarthost leiten, daher kann man sich den Aufwand mit der Einrichtung des Dienstes gleich sparen. ssmtp will erst einmal aus den Paketquellen installiert werden…

$ sudo apt-get install ssmtp

…danach gibt es mit den Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases zwei Konfigurationsdateien, die an die eigene Situation angepasst werden wollen. Ich fange mal mit der ssmtp.conf an, in der der zu nutzende Mailserver eingetragen wird.

$ sudo gedit /etc/ssmtp/ssmtp.conf

Als Beispiele führe ich die Konfiguration an, um Mails über Google bzw. GMX zu verschicken. Wie ihr seht steht das Passwort im Klartext in der Konfigurationsdatei. Ich würde daher für den eigenen Mailserver einen extra Account bei einem Freemailer einrichten, oder bei Google die 2-Step Verification aktivieren, so dass man ein Passwort extra für ssmtp erzeugen kann. Somit stünden dann die wichtigsten Zugangsdaten nicht mehr im Klartext auf der Platte.

Google Mail

root=EIN.BEISPIEL@gmail.com
mailhub=smtp.gmail.com:587
hostname=EIN.BEISPIEL@gmail.com
UseSTARTTLS=YES
AuthUser=EIN.BEISPIEL
AuthPass=GEHEIM
FromLineOverride=YES

GMX.net

root=EIN.BEISPIEL@gmx.de
mailhub=mail.gmx.net:465
rewriteDomain=gmx.net
hostname=gmx.net   
UseTLS=YES
AuthUser=EIN.BEISPIEL@gmx.DE
AuthPass=GEHEIM
FromLineOverride=NO

Passt die FETT geschriebenen Passagen bitte an eure Situation an, die restlichen Einstellungen solltet ihr direkt übernehmen können.

Sobald ihr die ssmtp.conf vollständig eingerichtet habt, könnt ihr festlegen welcher User welchen Mailserver benutzen darf. Dies wird über die revaliases-Datei festgelegt, öffnet auch diese daher wieder in einen Editor.

$ sudo gedit /etc/ssmtp/revaliases

Hier tragt ihr nun im folgenden Format ein welcher Nutzer welchen Server benutzen darf. In meinem Beispiel greife ich wieder Google Mail auf, die FETT gedruckten Passagen müssten wieder angepasst werden.

root:EIN.BEISPIEL@gmail.com:smtp.gmail.com:587
www-data:EIN.BEISPIEL@gmail.com:smtp.gmail.com:587
OTTO:EIN.BEISPIEL@gmail.com:smtp.gmail.com:587

In meinem Fall darf also “root”, der User des Webservers “www-data” und der Benutzer “otto” Mails direkt vom System aus verschicken. Die zweite Zeile könnt ihr natürlich weglassen, wenn bei euch gar kein Webserver installiert ist, oder dieser gar keinen Zugriff auf ssmtp braucht.

Das Ganze will natürlich nun auch getestet werden. Eine Möglichkeit ist es direkt über ssmtp eine Mail zu schicken. Der folgende Befehl schickt etwa eine leere Mail an echo@tu-berlin.de, das diese wiederum gleich wieder zurück zu euch schickt. So könnt ihr bequem testen, ob eure Einstellungen funktioniert haben. Zudem bewirkt der Schalter “-v”, dass bei der Aktion Rückgaben ins Terminal geschrieben werden.

$ ssmtp -v echo@tu-berlin.de

Alternativ könntet ihr natürlich auch via mutt oder mailx direkt vollständige Mails verschicken. ssmtp ersetzt sicherlich nicht einen ordentlich aufgesetzten Postfix-Dienst auf einem richtigen Server, doch wenn die eigenen Workstation zuhause einfach nur in der Lage sein soll ein paar Status-Mails in Netz zu senden, dann ist ssmtp ein ganz praktisches Werkzeug.

(Bildnachweis: Dierk Schaefer, CC-BY, Flickr)

Autor: Christoph

Hallo, ich bin Christoph -- Linux-User, Blogger und pragmatischer Fan freier Software. Wie Ihr ohne Zweifel bemerkt haben solltet schreibe ich hier über Linux im Allgemeinen, Ubuntu im Speziellen, sowie Android und andere Internet-Themen. Wenn du Freude an meinen Artikel gefunden haben solltest, dann kannst du mir über Facebook, Google+ oder Twitter oder natürlich dem Blog folgen.

42 Kommentare

  1. Funktioniert super, danke!
    bisher habe ich sendemail verwendet aber ssmtp bietet scheinbar mehr Möglichkeiten.

  2. Vielen Dank für die Anleitung! Habe gerade einen Server am Start, wo ich das ganz gut gebrauchen kann.

    Praktisch, dass ich das Versenden so direkt über meine Google Mail Adresse durchführen kann.

  3. (Wie immer) super Anleitung. Aber GUIs sollte man doch eigentlich mit ‘gksu’ rootrechtlich starten – ‘sudo’ war da doch irgendwie böse (obwohl ich ehrlich gesagt mich noch nie damit beschäftigt habe warum).

  4. Ich sehe das, vor allem am eigenen Desktop Rechner, den man alleine nutzt als unproblematisch ;)

  5. Ich setze bei mir für diesen Zweck immer auf Nullmailer – ssmtp werde ich mir aber definitiv auch mal anschauen. Danke für die tolle Anleitung!

  6. Der Vollständigkeit halber möchte ich gerne noch esmtp erwähnen, damit sind dann meines Wissens nach alle Mail-Weiterleiter genannt.

  7. Danke für die Anleitung, habe mir einen extra gmx Account geschaffen zum testen bekomme im Moment aber folgenden Fehler

    .. Creating SSL connection to host
    .. sSMTP[1376] : Invalid response SMTP Server (STARTTLS)
    .. sSMTP[1376] : Cannot open mail.gmx.net:465

    Habe die Konfig mehrfach überprüft, finde aber den Fehler nicht.
    Danke für die Hilfe

    • Ich habs gerade nochmal mit GMX unter Ubuntu Lucid 10.04 getestet. Ich hab einfach nur die Konfigurationen per Copy&Paste übernommen und meine Daten eingetragen. Wichtig ist die /etc/ssmtp/revaliases natürlich auf GMX zu trimmen, aber ich denke dass du das gemacht hast. Bei mir will es sofort laufen. Wie gehst du denn ins Netz? Kann es sein dass dein Zugangsanbieter SMTP zu anderen Mailservern als den eigenen blockt? Manche machen das um Spammer zu behindern.

  8. Also ich kriegs mit Natty und google mail nicht zum Laufen. Ich hab natürlich noch nach anderen Howtos gesucht und auch genug gefunden, aber no chance.
    Ich hab Deine Beispiele auf googlemail.com umgebogen, bin mir sicher über username/pass, typos etc pp.

    Wenn ich den Testbefehl abschicke passiert nichts. Ich bekomme keine Befehlszeile mehr, und weder Strg-C/Strg-D helfen irgendwas. Ich muss den Job per kill wegschiessen.

    Was mich irritiert: mein Thunderbird nutzt zum Versand Port 465 statt 587 und via SSL Login, nicht TLS…
    Hat jemand ein Beispiel oder einen Hinweis, auf was man bei googlemail.com achten muß?

    Danke trotzdem, ich bin sicher, wenn ich es mal ans Laufen gebracht habe, dann werd ichs auch mögen ;-)

  9. Sorry, hat sich erledigt. Waren diverse Kleinigkeiten. Man muß den Port nicht anpassen und ich hatte einen Fehler im Usernamen, den ich wirklich x-mal übersehen habe…. dann bekomm ich auch output…

    Erwähnenswert wäre dennoch Strg-D nach dem ssmtp -v … das weiß sicher nicht jeder.

    Vielen Dank für das Tut!

    Cheers,
    Mike

  10. Funktioniert prima ich hatte erst noch Probleme mit Resten von Sendmail als ich etwas wild rumprobierte.
    Aber das ist ja eigene Unfähigkeit.

  11. Geht das auch mit Hotmail????

  12. Pingback: Der Linux Counter mit neuem Betreiber und neuem Look | Linux und Ich

  13. Nach dem ausführen von ssmtp -v echo@tu-berlin.de passierte bei mir erstmal – nichts. Ich habe gewartet und den ssmtp erstmal abgeschossen und nach Problemen mit meiner Netzwerkkonfiguration gesucht.

    Vier Versuche später habe ich dann Strg-D gemacht und ssmtp hat dann die (leere) Mail verschickt. Ein ein paar mal “Enter” wäre auch gegangen. Vielleicht sollte das noch mit rein in die ansonsten tolle Anleitung. Sonst wartet man nämlich lange darauf, dass ssmtp was verschickt :D

  14. Hallo!

    Das hilft super. Gerade wenn man nicht in jedem OpenVZ-Container einen Mailserver fahren will – aber auch nicht seinen eigenen mit den Mails anderer “belasten” will.

    Funktioniert perfekt :)

  15. Danke für die guten Tipps! Ich würde aber gerne meine logs als Attachment anhängen, nicht nur als body text evtl. auch als .tar . Das geht wohl so mit ssmpt nicht. Hast Du da eine Lösung?

  16. Hallo und THX für das gute Tut hat mir in sofern schonmal geholfen das E-Mails jetzt auch meine Webseite verschicken kann.
    Habe das mit gmail.com gemacht funzt klasse.

    Jedoch haben sich mir 4 Problehme eingestellt/dargestellt.

    1. Es werden keine Systemmails lokal versendet und von root und user empfangen.
    2. Ist bei versendeten E-Mails von der Webseite als Absender www-data angegeben.
    3. E-Mails können nicht mehr Lokal versendet werden z.B. user1 möchte user2 eine Lokale E-Mail hinterlassen. (vermutlich selbe problem wie punkt 1)
    4. habe ich keine lokale benachrichtigung ob ssmtp E-Mails versendet, leider nur im E-Mailkonto was mir etwas zuviel smaltalk nach aussen ist.

    Gibt es da möglichkeiten das zu händeln ?
    Habe bisher leider nichts gefunden was mich schlauer macht.
    Für jeden Tip dankbar ;)

    Mfg Berlinerping
    P.S. benutze Debian 6 ohne GUI,Apache2, php5, mysql, DynDNS, CMS ist Joomla 2.5

  17. Ersetzt diese Lösung sendmail vollständig ? Oder laufen sendmail und ssmtp parallel ?

    Muss man ein bereits laufendes sendmail anhalten/deaktivieren ?

    Läuft ssmtp dann als cron job oder als Daemon ? Wie erfolgt der Aufruf von ssmtp ?

    Der Testversand ssmtp -v echo@tu-berlin.de funktioniert bei mir. Die Echo-Mails der TU Berlin landen im Postfach.

    Ich habe in maillog noch Einträge wie:

    Oct 31 17:58:01 x66 sendmail[17662]: q9VGw1qQ017662: from=, size=595, class=0, nrcpts=1, msgid=, proto=ESMTP, daemon=MTA, relay=localhost.localdomain [127.0.0.1]
    Oct 31 17:58:01 x66 sendmail[17661]: q9VGw10Y017661: to=xyz11, ctladdr=xyz11 (1000/1000), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30363, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (q9VGw1qQ017662 Message accepted for delivery)
    Oct 31 17:58:01 x66 sendmail[17663]: q9VGw1qQ017662: to=, ctladdr= (1000/1000), delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30788, dsn=2.0.0, stat=Sent
    Oct 31 17:59:01 x66 sendmail[17707]: q9VGx1cU017707: from=xyz11, size=363, class=0, nrcpts=1, msgid=, relay=xyz11@localhost
    Oct 31 17:59:01 x66 sendmail[17708]: q9VGx1eh017708: from=, size=595, class=0, nrcpts=1, msgid=, proto=ESMTP, daemon=MTA, relay=localhost.localdomain [127.0.0.1]
    Oct 31 17:59:01 x66 sendmail[17707]: q9VGx1cU017707: to=xyz11, ctladdr=xyz11 (1000/1000), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30363, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (q9VGx1eh017708 Message accepted for delivery)
    Oct 31 17:59:01 x66 sendmail[17709]: q9VGx1eh017708: to=, ctladdr= (1000/1000), delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30788, dsn=2.0.0, stat=Sent
    Oct 31 18:00:02 x66 sendmail[17756]: q9VH02nD017756: from=root, size=506, class=0, nrcpts=1, msgid=, relay=root@localhost
    Oct 31 18:00:02 x66 sendmail[17754]: q9VH02rL017754: from=xyz11, size=363, class=0, nrcpts=1, msgid=, relay=xyz11@localhost
    Oct 31 18:00:02 x66 sendmail[17757]: q9VH02FR017757: from=, size=737, class=0, nrcpts=1, msgid=, proto=ESMTP, daemon=MTA, relay=localhost.localdomain [127.0.0.1]

    Dazu laufen noch zwei Prozesse:

    root 1288 1 0 3314 2112 1 14:00 ? 00:00:00 sendmail: accepting connections
    smmsp 1316 1 0 3184 1564 0 14:00 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue

  18. Ist ja toll! So einfach kann das gehen. Nach endlosen Versuchen mit Postfix hatte ich das Thema “eMail über Formular versenden” schon abgehakt. Und nun: installiert – die beiden Dateien angepasst – fertig :-)

  19. Hallo Christoph!
    Mit diesem Blog konnte ich auf simpelste und schnellste Weise meine Owncloud zu 100% meinen Bedürfnissen anpassen. Es leben Cronjob-Nachrichten ;-)
    Vielen Dank – Carsten

  20. Schön, dass Du mal darüber geschrieben hast! Ich habe letztens die Diskussion wieder gehabt, weil Fedora ja keinen eigenen MTA mehr installiert. Ich finde die Entscheidung auch richtig. Lediglich auf meinem, als MX eingetragenen, Server läuft Postfix: Eigener Mailserver. Auf allen anderen Büchsen wie z.B. meinem Raspberry Pi hab ich auch sSMTP und nutze darüber den externen Mailserver.

    Ich glaube viele nutzen nicht sSMTP sondern Postfix oder Sendmail, weil es vorinstalliert ist und sie keine Lust haben die Dinger zu konfigurieren. Dann braucht man sich aber auch nicht wundern, wenn man immer im Spam-Filter landet. sSMTP ist mit Sicherheit die beste Lösung.

  21. Genau das was ich für meinen kleinen Homeserver gesucht habe.

    Vielen Dank für das tolle HowTo!

    Gruß Frank

  22. Hello,

    erstmals danke an Christoph für den guten sSMTP-Überblick.

    Irgendwie funzt’s bei mir nicht ganz!

    Ich will mit meinem raspberry keine Mails von außen empfangen (sitzt auch hinter eine Firewall und von außen ist nur der ssh:22 port geforwarded).

    Was ich brauche:
    1. crontab (von root, user1, user2, …)
    STDOUT soll per Mail an “MAILTO”-variable geschickt werden
    -> landet zurzeit im dead.letter-file

    2. Mails an lokale user (user1 an user2):
    wie muss ich den Empfänger angeben, damit die Mail intern und nicht gleich über den SMTP-relay gesendet wird?
    -> eine Mail an “user1″ wird nicht an die Adresse im /etc/ssmtp/revaliases (user1:myaddress@gmx.at:mail.gmx.net:465) – also myaddress@gmx.at – gesendet, sondern an user1@gmx.net

    Mailversand an externe User funktioniert manuell problemlos.
    Also zB ‘echo “Hello World”|mails -s “MySubject” irgendwer@irgendwo.com

    /etc/ssmtp/ssmtp.conf (analog Bsp oben)
    /etc/ssmtp/revaliases:
    root:myaddress@gmx.at:mail.gmx.net:465
    user1:myaddress@gmx.at:mail.gmx.net:465
    user2:myaddress@gmx.at:mail.gmx.net:465

    PS: Ein Tipp von meiner Seite um Attachments zu schicken (sudo get-apt install uuenview). Bsp:
    cat mail.txt|uuenview -a -bo MyAttachment.tgz |sendmail -t
    wobei das file mail.txt zB folgendes enthält:
    –cut–
    From: MyAddress@gmx.at
    To: irgendwer@irgendwo.com
    Subject: MySubject

    Hier kommt der Body-text
    blabla
    –cut–

  23. Ich nutze mutt 1.5.22 unter cygwin zum mailen und hole mails per pop ab.
    Da gmx auf verschlüsselte mails umstellt, siehe
    http://www.gmx.net/e-mail-made-in-germany/ssl/,
    wollte ich meine Konfigurationsdatei .muttrc anpassen und ersetzte

    set pop_host=”pop.gmx.net”

    durch

    set pop_host=”pop.gmx.net:995″

    Leider bekam ich beim Abrufen der Mail die Meldung

    Illegal instruction (core dumped)

    Der “core” ist offenbar die Datei mutt.exe.stackdump mit folgendem Inhalt:

    Exception: STATUS_ILLEGAL_INSTRUCTION at eip=0047D288
    eax=00000040 ebx=611841BF ecx=00000068 edx=00000006 esi=004A355B edi=FFFFFFFF
    ebp=000003FA esp=00228DA4 program=C:\Programme\cygwin\bin\mutt.exe, pid 1976, thread main
    cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
    Stack trace:
    Frame Function Args

    mutt -v | grep ssl zeigt,
    dass in den configure-options –with-ssl und –enable-pop steht:

    mutt -v | grep ssl
    Configure options: ‘-C’ ‘–with-mailpath=/var/spool/mail’ ‘–disable-dependency-tracking’ ‘–docdir=/usr/share
    /doc/mutt-1.5.22′ ‘–enable-fcntl’ ‘–enable-hcache’ ‘–enable-iconv’ ‘–enable-imap’ ‘–enable-locales-fix’ ‘
    –enable-pop’ ‘–with-ssl’ ‘–build=x86_64-pc-linux’ ‘–host=i686-pc-cygwin’ ‘–target=i686-pc-cygwin’ ‘–pref
    ix=/usr’ ‘–exec-prefix=/usr’ ‘–sysconfdir=/etc’ ‘–infodir=/usr/share/info’ ‘–mandir=/usr/share/man’ ‘–lib
    dir=/usr/lib’ ‘–includedir=/usr/include’ ‘–libexecdir=/usr/sbin’ ‘CFLAGS=-O2 -g’ ‘CXXFLAGS=-O2 -g’ ‘build_al
    ias=x86_64-pc-linux’ ‘host_alias=i686-pc-cygwin’ ‘target_alias=i686-pc-cygwin’ ‘CC=i686-pc-cygwin-gcc’

    Wenn ich den Standardport 110 eintrage, also

    set pop_host=”pop.gmx.net:110″

    erhalte ich die identische Meldung und das gleiche mutt.exe.stackdump,
    das sich nur in der pid unterscheidet.

    Die Datei .muttrc ist in Unix-Format gespeichert, das ist ja manchmal
    bei cygwin eine mögliche Fehlerquelle.
    Ich habe noch den Tipp verfolgt, die Variable pop_port extra zu setzen,
    aber mutt kennt sie nicht, und auch die Doku von mutt unter
    http://www.mutt.org/doc/manual/manual-6.html#ss6.3
    sagt, dass der Port optional nach der Adresse und Doppelpunkt geschrieben wird:

    pop_host

    Type: string
    Default: “”

    The name of your POP server for the fetch-mail function. You can also specify an alternative port, username and password, ie:

    [pop[s]://][username[:password]@]popserver[:port]

    Hat jemand eine Idee?
    (Mail schicken würde ich gern weiter mit ssmtp.exe, geht auch nicht, dazu mehr in separatem thread, wird sonst zuviel hier.)

    Vielen Dank im voraus und beste Grüße von

    Helmut

  24. Hall Leute.

    Ich habe mich an die Anleitung gehalten.
    Was ich nicht so ganz verstehe.

    Ich habe in der ssmtp.conf erste Zeile User_Name_AAAA=EIN.BEISPIEL@gmail.com und in der revalias User_Name_AAAA:EIN.BEISPIEL@gmail.com:smtp.gmail.com:587 eingetragen.

    User_Name_AAAA gibt es auf dem System nicht als User.

    Sowohl root als auch ich als normaler User können Mail versenden.
    Was laut Anleitung für “User” nicht gehen sollte.

    eine Idee??

    Gruß.

    B. Zeljak

Hinterlasse eine Antwort

Auf Linux und Ich darf anonym kommentiert werden. Die Felder für Name und E-Mail-Adresse dürfen beim Eintragen eures Kommentars leer bleiben. Ich freue mich aber über jeden Kommentar, zu dem der Autor mit seinem Namen steht.