Update: 2020-09-03

Download Sketch

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;
    }
  }
}

4 Kommentare - Kommentar eintragen
Konrad ✪ ✪ ✪ 15.10.2023
Hi,

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
Radkoch ✪ ✪ ✪ 01.07.2021
Beim kompilieren kommt folgender Fehler: 'base64' has not been declared (Zeile 97). Was muss ich tun, damit der Fehler verschwindet. Vielen Dank im Voraus für die Antwor.


Antwort:
Welcher Prozessor, welche CoreVersion?

Gruß Fips
laserdoktor ❘ 29.06.2020
hallo, danke für die Tips. Ich komme leider nur bis zum Verbinden mit dem smtp-Server, danach ???
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
laserdoktor ✪ ✪ ✪ 26.06.2020
Hallo; Danke für Deine tolle Arbeit. du hast mir oft mit Deinen Ideen weiter geholfen . Jetzt komme ich nicht weiter:
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
Kommentar eintragen

*