Durch seine kompakte Größe und den unschlagbaren Preis ist der ESP8266 NodeMCU optimal für die Hausautomatisierung geeignet. Neben der Kommunikation mit anderen Geräten, kann auch auf Ereignisse reagiert werden, so können z.B. mit dem ESP8266 Emails versendet werden. Dies ist sehr nützlich, wenn für bestimmte Aktionen (Regentonne voll, Garten wurde bewässert) eine Benachrichtigung/Email versendet werden soll.
Um dies umzusetzen, ist nicht viel nötig. In diesem Tutorial zeige ich, wie man mit den NodeMCU / ESP8266 Emails versenden kann. Dies kann in vielen weiteren Projekten genutzt werden.
Zubehör
Wie bereits erwähnt, ist dieses Tutorial sehr einfach nachzubauen. Man kann mit jeglichem ESP8266 Mails senden, optionalerweise nutzt man dazu noch weiteres Zubehör in Form von Sensoren, etc.
- ESP8266 (bspw. ESP-01 oder ESP-12)
- ggf. Sensoren, Taster, Zubehör
Ich würde mich über Kommentare freuen, in denen eure Anwendung beschrieben ist, bei der Mails versendet werden 🙂
Übrigens: Wer auf der Suche nach Mailversand mit dem Raspberry Pi anstelle des ESP8266 ist, der wird hier fündig.
Vorbereitung zum Senden von ESP8266 Emails
Zunächst einmal müssen wir die NodeMCU Software auf unseren ESP8266 Mikrocontroller flashen. Dies ist nicht besonders schwer und ist ausführlich in diesem Tutorial beschrieben. Wir laden uns ein Image mit entsprechenden Bibliotheken, die wir in unserem eigentlichen Projekt verwenden wollen und flashen dies mit dem ESP8266Flasher.
Anschließend können wir bspw. mit dem ESPlorer eine Verbindung (über USB/serielle Schnittstelle) herstellen.
Bevor wir fortfahren und das Skript übertragen, benötigen wir einen Email Provider. Hier kannst du bspw. Google Mail oder einen anderen Anbieter nehmen. Du musst jedoch ein Konto dort haben, von dem aus Mails versendet werden können (über SMTP). Du kannst auch deinen eigenen Mail Server nutzen, so wie ich es bspw. tue.
Um gleich mit dem ESP8266 Emails versenden zu können, wird der Accountname (Email) und das Passwort benötigt. Diese werden jedoch nicht als verständlichen Text versendet, sondern verschlüsselt. Hierfür wird die Base64 Kodierung genutzt, weshalb wir unsere Daten in dieses Format umwandeln müssen. Man kann hierfür Online Tools wie base64encode.org nutzen.
Als Beispiel nehmen wir die Zeichenkette test
, die Base64-kodiert dGVzdA==
ergibt. Wir werden die kodierten Zugangsdaten im nächsten Schritt benötigen.
NodeMCU Email Skript
Der NodeMCU kann selbst nicht direkt Mails senden (anders als ein Raspberry Pi über PHP). Dies muss also über einen Umweg passieren, nämlich einem SMTP Server. In der Vergangenheit gab es einige Ansätze, um den NodeMCU zu nutzen, um Emails zu verschicken, jedoch sind diese weitestgehend nicht mehr kompatibel. Daher gibt es nachfolgend eine, mit der aktuellen Firmware, funktionierende Lösung zum Versand von Mails mit dem ESP8266.
Wir erstellen zunächst ein neues Skript mit dem ESPlorer, das folgenden Inhalt hat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
MY_EMAIL = "myself@my-TLD.com" MY_EMAIL_B64 = "base64-encoded-email" EMAIL_PASSWORD_B64 = "base64-encoded-password" SMTP_SERVER = "my-ISPs-server" SMTP_PORT = 25 mail_to = "myself@my-TLD.com" SSID = "xxxxxxxxxxxxx" SSID_PASSWORD = "xxxxxxxxxxxxx" email_subject = "" email_body = "" count = 0 smtp_socket = nil function display(sck,response) print(response) end function do_next() if(count == 0)then count = count+1 local IP_ADDRESS = wifi.sta.getip() smtp_socket:send("HELO "..IP_ADDRESS.."\r\n") elseif(count==1) then count = count+1 smtp_socket:send("AUTH LOGIN\r\n") elseif(count == 2) then count = count + 1 smtp_socket:send(MY_EMAIL_B64.."\r\n") elseif(count == 3) then count = count + 1 smtp_socket:send(EMAIL_PASSWORD_B64.."\r\n") elseif(count==4) then count = count+1 smtp_socket:send("MAIL FROM:<" .. MY_EMAIL .. ">\r\n") elseif(count==5) then count = count+1 smtp_socket:send("RCPT TO:<" .. mail_to ..">\r\n") elseif(count==6) then count = count+1 smtp_socket:send("DATA\r\n") elseif(count==7) then count = count+1 local message = string.gsub( "From: \"".. MY_EMAIL .."\"<"..MY_EMAIL..">\r\n" .. "To: \"".. mail_to .. "\"<".. mail_to..">\r\n".. "Subject: ".. email_subject .. "\r\n\r\n" .. email_body,"\r\n.\r\n","") smtp_socket:send(message.."\r\n.\r\n") elseif(count==8) then count = count+1 tmr.stop(0) smtp_socket:send("QUIT\r\n") else smtp_socket:close() end end function connected(sck) tmr.alarm(0,3000,1,do_next) end function send_email(subject,body) count = 0 email_subject = subject email_body = body smtp_socket = net.createConnection(net.TCP,0) smtp_socket:on("connection",connected) smtp_socket:on("receive",display) smtp_socket:connect(SMTP_PORT,SMTP_SERVER) end wifi.setmode(wifi.STATION) wifi.sta.config {ssid=SSID, pwd=SSID_PASSWORD} tmr.alarm(1, 1000, 1, function() if wifi.sta.getip()== nil then print("IP unavaiable, Waiting...") else tmr.stop(1) print("Config done, IP is "..wifi.sta.getip()) send_email( "ESP8266", [[Hi, How are your IoT projects coming along? Best Wishes, ESP8266]]) end end) |
In den ersten Zeilen tragen wir unsere Daten ein:
- Zeile 1: Angezeigter Name des Email Absender
- Zeile 2: Base64-kodierte Email (
deine@mail.com
) - Zeile 3: Base64-kodiertes Passwort des Email Accounts
- Zeile 5: SMTP Server (bspw.
smpt.google.com
). Ggf. danach suchen (FAQ deines Mail Providers). - Zeile 8: Empfänger Mail Adresse – könnte auch dynamisch gesetzt werden
- Zeile 10 + 11: Wifi Name und Passwort (nicht kodiert – Plaintext)
Anschließend wird diese Datei auf dem NodeMCU gespeichert und ausgeführt. Die Mail sollte binnen weniger Sekunden gesendet werden – siehe ggf. auch in deinem Spam Ordner nach!
Natürlich kann die Funktion auch in weiteren Skripten eingebunden werden, woraufhin immer dann eine Mail gesendet wird, wenn ein bestimmtes Ereignis ausgelöst wurde.
Als letzten Schritt können wir noch eine init.lua, in der wir das eigentliche Skript aufrufen, erstellen, sodass dieses beim Booten des ESP8266 automatisch gestartet wird.
Ein Kommentar
Danke für das Teilen. Zum Codieren in Base64 gibt es eine weitere großartige Alternative: https://url-decode.com/tool/base64-encode. Das Beste an dieser Alternative ist, dass Sie auch die über 100 anderen Webdienstprogramme von derselben Site aus nutzen können. Dieses Tool hilft Ihnen auch bei Ihren zukünftigen Projekten.