Esp8266 & Esp32 Html Mail Example
Esp_Html_Mail.ino
// ****************************************************************
// Sketch E-mail senden (Antwort wird nicht blockierend ausgewertet)
// created: Jens Fleischer, 2018-04-29
// last mod: Jens Fleischer, 2020-05-31
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, ESP32
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3 / 2.7.1
// Software: Esp32 Arduino Core 1.0.0 - 1.0.4
// Software: https://smtp2go.com/
/******************************************************************
Copyright (c) 2018 Jens Fleischer. All rights reserved.
This file is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
*******************************************************************/
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <Base64.h>
#include <ArduinoOTA.h>
const char* ssid = "Netzwerkname"; // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk"; // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen
uint32_t broadcastingTime;
bool response = true, error = false;
#ifdef ESP8266
const char* SENDER = {"ESP8266"};
#else
const char* SENDER = {"ESP32"};
#endif
const char* USER = "Username von smtpgo"; // https://www.smtp2go.com
const char* MAIL_PASSWORD = "Passwort von smtpgo"; // https://www.smtp2go.com
const char* FIRST_RECIPIENT = "Emfänger Mail Adresse"; // Mailadresse des Empfängers eintragen
const char* SECOND_RECIPIENT = ""; // Mailadresse des zweiten Empfängers eintragen falls erforderlich
const char* SUBJECT = "Wichtige Mitteilung! Von zu Hause!"; // Betreffzeile
const char* MAIL_SERVER = "mail.smtp2go.com";
const uint16_t PORT = 2525; // ports 25, 2525, 8025, 587, 80
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial.print("\n");
byte i = 0;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.printf(" %i sek\n", i);
if (++i > 19) {
Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
ESP.restart();
}
}
Serial.println("\nVerbunden mit: " + WiFi.SSID());
Serial.println("Esp IP: " + WiFi.localIP().toString());
#ifdef ESP8266
WiFi.hostname("Mail Client");
#else
WiFi.setHostname("Mail Client");
#endif
sendmails();
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
if (!response) {
readResponse();
}
}
void sendmails() { // SMTP2GO Free hat ein Limit von 25 E-Mails pro Stunde / 1.000 E-Mails pro Monat
if (!client.connect(MAIL_SERVER, PORT)) {
Serial.printf("Verbindung mit Server: %s über Port: %d fehlgeschlagen\n", MAIL_SERVER, PORT);
}
else {
#ifdef ESP8266
String espHostname = WiFi.hostname();
#else
String espHostname = WiFi.getHostname();
#endif
response = false;
broadcastingTime = millis();
Serial.printf("Verbunden mit Server: %s über Port: %d\n", MAIL_SERVER, PORT);
client.printf("EHLO\nAUTH LOGIN\n%s\n%s\nMAIL From: <RbL@rbl.io>\nRCPT To: <%s>\nRCPT TO: <%s>\nDATA\nTo: <%s>\n",
base64::encode(USER).c_str(), base64::encode(MAIL_PASSWORD).c_str(), FIRST_RECIPIENT, SECOND_RECIPIENT, FIRST_RECIPIENT);
if (SECOND_RECIPIENT != "") client.printf("Cc: <%s>\n", SECOND_RECIPIENT);
client.printf("From: %s <RbL@rbl.io>\nSubject:%s %s\nContent-Type: text/html;charset=utf-8\n", SENDER, SENDER, SUBJECT);
// Inhalt der Html E-Mail
client.printf(R"(<html><body><table style="margin: auto; text-align: center;"><tr><td style="padding: 10px;"><h2>Hallo!</h2><h3>Der %s %s meldet.</h3></td>
</tr><tr><td style="padding: 10px; background: wheat;"><div>WiFi Emfangsstärke:<b> %d dBm</b></div><i>Der Esp freut sich dir mitteilen zu können, das alles in Ordnung ist!</i>
</td></tr></table></body></html>)", SENDER, espHostname.c_str(), WiFi.RSSI());
client.printf("\n.\nQUIT");
}
}
void readResponse() {
if (millis() - broadcastingTime > 2000) {
Serial.println("Mail Client Timeout !");
response = true;
if (!error) {
error = true;
sendmails(); // die Mail wird bei Zeitüberschreitung ein zweites mal gesendet
}
response = true;
return;
}
if (client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line); // Zur Anzeige der Antwort von smtpgo einkommentieren
if (line.startsWith("250 OK id=")) { // wenn Zeile der Antwort mit "250 OK id=" beginnt war das Senden erfolgreich
//Serial.printf("Antwort vom Mailserver in: %4ld ms\n", millis() - broadcastingTime); // zeigt die Zeit bis zur Antwort --> passe den Timeout entsprechend an
Serial.println("******* Mail gesendet *******");
client.stop();
error = false;
response = true;
}
}
}
kleiner Hinweis. Ich habe das Programm schon seit längerer Zeit beim Gaszähler (wird im Sommer immer ausgeschaltet aus hoffentlich verständlichen Gründen) in Verwendung und es hat immer geklappt.
Diesen Monat wollte ich das System wieder starten und es gab beim email System von SMTP2Go Schwierigkeiten. Anscheinend klappt es mit der Sender email: RbL@rbl.io in der Programmzeile 96 und 99 nicht mehr (in dem SMTP2GO System muss seit Neuestem eine verifizerte Senderemail hinterlegt werden). Als ich dies korrigiert hatte, hat es wieder geklappt.
Nochmals an dieser Stelle: Deine Codes sind megamäßig! Ein riesiges Dankeschön nochmals.
Grüße aus dem Süden der Republik.
Konrad
Antwort:
Danke für den Hinweis.
Gruß Fips
Antwort:
Welcher Prozessor, welche CoreVersion?
Gruß Fips
habe alle Ports versucht, auch Time Out verlängert.
Es gibt weder Fehlermeldung noch Rückmeldung im Ser.Monitor.
Was mache ich falsch. Ich möchte an meine live-mail-Adresse senden (xxx.xxx@live.de). Sind da noch irgendwelche Einstellungen nötig?
Danke im Voraus
Gruß laserdoktor
Antwort:
Was gibt denn " //Serial.println(line);" aus, wenn du es einkommentierst?
Mail an Gmail Ausgabe Seriell:
07:57:40.161 -> Verbunden mit: FRITZ!Box
07:57:40.161 -> Esp IP: 192.168.178.43
07:57:40.207 -> Verbunden mit Server: mail.smtp2go.com über Port: 2525
07:57:40.207 -> 220 mail.smtp2go.com ESMTP Exim 4.92-S2G Tue, 30 Jun 2020 05:57:38 +0000
07:57:40.207 -> 250-mail.smtp2go.com Hello [79.241.171.2]
07:57:40.207 -> 250-SIZE 52428800
07:57:40.207 -> 250-8BITMIME
07:57:40.207 -> 250-DSN
07:57:40.261 -> 250-PIPELINING
07:57:40.261 -> 250-AUTH CRAM-MD5 PLAIN LOGIN
07:57:40.261 -> 250-CHUNKING
07:57:40.261 -> 250-STARTTLS
07:57:40.261 -> 250-PRDR
07:57:40.261 -> 250 HELP
07:57:40.261 -> 334 ************
07:57:40.261 -> 334 ************
07:57:40.261 -> 235 Authentication succeeded
07:57:40.261 -> 250 OK
07:57:40.261 -> 250 Accepted
07:57:40.261 -> 501 : missing or malformed local part
07:57:40.261 -> 354 Enter message, ending with "." on a line by itself
07:57:40.261 -> 250 OK id=1jq9H0-4Xa95E-RI
07:57:40.261 -> ******* Mail gesendet *******
Funktioniert bei mir.
Gruß Fips
ich bekomme vom Ser.Monitor diese Ausgabe und nichts weiter:
Verbunden mit: FritzBox
17:25:16.691 -> Esp IP: 192.xxx.xxx.xxx
17:25:16.744 -> Verbunden mit Server: mail.smtp2go.com über Port: 2525
17:25:18.751 -> Mail Client Timeout !
17:25:18.798 -> Verbunden mit Server: mail.smtp2go.com über Port: 2525
habe einen neuen Zugang zu smtp2go, Zugangsdaten richtig eingesetzt....
braucht man noch base64 zu codieren?
Ich bitte um einen hilfreichen Hinweis.
LG laserdoktor
Antwort:
Die Zugangsdaten werden bei diesem Sketch als Klartext eingegeben, die Base64 Codierung erledigt das Script.
Du kannst noch die anderen Ports probieren.
Gruß Fips