FHEM Tutorial-Reihe - Part 40: Alles über Mails

Mit ** gekennzeichne Links auf dieser Seite sind Affiliatelinks.

So, neuer Teil - wieder sehr aufwändig für mich mich zu produzieren, aber wieder sehr einfach umzusetzen. In diesem Video geht es rund um Mails. Also FHEM mit Mails steuern, Stati von Postfächern anzeigen (wieviele ungelesene Mails sind vorhanden) und zuletzt auch Mails aus FHEM heraus versenden.

Was wird benötigt?

  • Eine FHEM-Installation
  • Einen oder mehrere Mail-Accounts (gmail / web.de / gmx.de oder andere IMAP-Accounts)

Video

FHEM-Kurs

Befehle per Mail an FHEM senden

Im ersten Teil lernen wir, wie man FHEM per Mail steuern kann. Dazu legt man sich ein neues Mailpostfach an (welches man sonst nicht verwendet). An diese Mailadresse kann man dann Nachrichten senden. FHEM erstellt dann automatisch Readings mit dem Absender und dem Betreff der letzten Nachricht. Wahlweise wird die Mail dann auch sofort aus dem Postfach gelöscht.

sudo apt-get install libemail-simple-perl libnet-imap-simple-perl libnet-imap-simple-ssl-perl libmail-imapclient-perl libmime-tools-perl

Alles was man dazu braucht ist das folgende define. Also Hostname, Benutzername und Passwort.

define mail mailcheck server.de benutzername 12345passwort12345

Mailpostfächer überwachen auf neue Mails

Hat man bestehende Accounts, kann man diese ganz einfach per FHEM überwachen lassen. Dazu habe ich die folgende Funktion aus dem FHEM-Forum übernommen und angepasst. Der Code aus dem Forum war nicht sehr sauber und hatte noch viele Fehler - also am besten nicht immer unbedacht Quelltext von anderen übernehmen.

sub CheckMails($$$$$) {
    my ($host, $user, $passwd, $devspec, $ssl) = @_;

    fhem("setreading $devspec connection_host $host");
    fhem("setreading $devspec connection_user $user");
    fhem("setreading $devspec connection_ssl $ssl");

    use Net::IMAP::Simple::SSL;
    use Net::IMAP::Simple;
    use Email::Simple;

    my $imap;

    if ($ssl eq "ssl") {
        $imap = Net::IMAP::Simple::SSL->new($host);

        if (!$imap) {
            fhem("setreading $devspec imap_status Unable to connect to IMAP: $Net::IMAP::Simple::errstr");
            return 11;
        }
    } else {
        $imap = Net::IMAP::Simple->new($host);

        if (!$imap) {
            fhem("setreading $devspec imap_status Unable to connect to IMAP: $Net::IMAP::Simple::errstr");
            return 12;
        }
    }

    if ($imap->login($user, $passwd)) {
        my ($unreadMessages, $recent, $numMessages) = $imap->status('INBOX');

        fhem("setreading $devspec imap_status connected");
        fhem("setreading $devspec messages_unread $unreadMessages");
        fhem("setreading $devspec messages_total $numMessages");

        $imap->close();
        $imap->logout();

        return 0;
    } else {
        fhem("setreading $devspec imap_status " . $imap->errstr);
        return 13;
    }
}

Nun legt man einfach einen Dummy an. Dieser wird genutzt um Readings des Mailkontos zu speichern.

define meineMails dummy

Jedes mal, wenn nun die Funktion aufgerufen wird, werden die Readings auf dem Gerät aktualisiert. Meiner Meinung nach echt praktisch, da man so beliebig viele Accounts überwachen kann, ohne den Code jedes mal neuschreiben zu müssen.

{CheckMails("server.de", "benutzername", "12345passwort12345", "meineMails", 1)}

Mit einem at kann man die Funktion dann einfach alle 5 Minuten aufrufen, sodass dann auch entsprechend die Informationen aktualisiert werden.

define refreshMails at +*00:05:00 {CheckMails("server.de", "benutzername", "12345passwort12345", "meineMails", 1);}

Mails versenden

Senden ist etwas komplizierter, da erst einmal der SMTP-Server konfiguriert werden muss.

sudo apt-get update
sudo apt-get install ssmtp mailutils
sudo vi /etc/ssmtp/ssmtp.conf

Den Inhalt der Datei komplett löschen und mit diesem ersetzen (natürlich vorher anpassen).

root=fhem@server.de
mailhub=server.de:587
hostname=server.de
FromLineOverride=YES
AuthUser=benutzername
AuthPass=12345passwort12345
UseSTARTTLS=YES

Diese Datei beschreibt, wer welche Benutzer und Server nutzen darf.

sudo vi /etc/ssmtp/revaliases
root:fhem@server.de:server.de:587
pi:fhem@server.de:server.de:587
fhem:fhem@server.de:server.de:587

Zum testen kann dann einmal der folgende Befehl abgesetzt werden. Bitte die Mailadresse am Ende gegen Eure eigene austauschen, ansonsten bekomme ich viel Spam.

echo "Hallo vom Raspberry" | mail -s "Betreff" info@haus-automatisierung.com

Da der Absender nun noch etwas kryptisch ist, passen wir dies in der passwd an wie im Video gezeigt.

sudo vi /etc/passwd

Im FHEM fehlt nun nur noch die folgende Funktion um Mails zu versenden.

sub SendMail($$$) {
    my ($subject, $message, $recipient) = @_;

    system("echo \"$message\" | mail -s \"$subject\" $recipient");
}

Hier auf die einfachen Anführungszeichen achten. Alternativ kann das @ auch mit einem Backslash escaped werden. Der Code kann nun ganz einfach überall verwendet werden. Egal ob im DOIF oder notify, oder in eigenen Funktionen.

{SendMail('FHEM', 'Nachricht', 'info@haus-automatisierung.com')}
{SendMail("FHEM", "Nachricht", "info\@haus-automatisierung.com")}

Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Rabattaktionen für Kurse
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbaren Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich ungern auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Unterwegs als Softwareentwickler, Trainer und Blogger im Bereich Smart Home.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.