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

3 Kommentare
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

*