Zuletzt geändert: 2019-01-11

Der Sketch zum E-Mail senden.

EspEmail.ino

// ****************************************************************
// Sketch E-mail senden (Antwort nicht blockierend)
// created: Jens Fleischer, 2018-04-29
// last mod: Jens Fleischer, 2019-01-11
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, ESP32
// 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>
uint32_t sendezeit;
bool response = true, error = false;
const char* mailServer = "mail.smtp2go.com";
const uint16_t port = 2525;     // ports 25, 2525, 8025, 587, 80
#ifdef ESP8266
const char* sender = "ESP8266";
#else
const char* sender = "ESP32";
#endif
const char* betreff = "Wichtige Mitteilung! Von zu Hause!";
const char* ssid = "Netzwerkname";            // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk"; // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen
const char* user = "deinUsername";            // https://www.smtp2go.com/
const char* mailpass = "deinPasswort";        // https://www.smtp2go.com/
const char* emfaenger = "deineMailAdresse";   // Adresse zu der gesendet werden soll

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); i++;
    Serial.printf(" %i sek\n", i);
    if (i > 9) {
      Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
      ESP.restart();
    }
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
#ifdef ESP8266
  Serial.println("Esp8266 IP: " + WiFi.localIP().toString());
  WiFi.hostname("Mail Client");
#else
  Serial.println("Esp32 IP: " + WiFi.localIP().toString());
  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(mailServer, port)) {
    Serial.printf("Verbindung  mit Server: %s über Port: %d fehlgeschlagen\n", mailServer, port);
  }
  else {
    response = false;
    sendezeit = millis();
    Serial.printf("Verbunden mit Server: %s über Port: %d\n", mailServer, port);
    client.printf("EHLO\nAUTH LOGIN\n%s\n%s\nMAIL From: <RbL@rbl.io>\nRCPT To: <%s>\nDATA\n", base64::encode(user).c_str(), base64::encode(mailpass).c_str(), emfaenger);
    client.printf("To: <%s>\nFrom: %s <RbL@rbl.io>\nSubject:%s %s\n", emfaenger, sender, sender, betreff);
#ifdef ESP8266
    client.printf("Hallo!\nDer %s %s meldet.\n", sender, WiFi.hostname().c_str());
#else
    client.printf("Hallo!\nDer %s %s meldet.\n", sender, WiFi.getHostname());
#endif
    client.printf("Emfangsstaerke: %d dBm\n", WiFi.RSSI());   // Inhalt der E-Mail
    client.printf("Der Esp freut sich dir mitteilen zu können, das alles in Ordnung ist!\n");   // Inhalt der E-Mail
    client.println(".\nQUIT");
  }
}

void readResponse() {
  if (millis() - sendezeit > 30000) {
    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()) {
    Serial.printf("Antwort vom Mailserver in: %4ld ms\n", millis() - mailsendezeit);
    for (uint8_t i = 0; i < 18; i++) {
      String line = client.readStringUntil('\n');
      if (line.startsWith("250 OK id=")) {    // wenn Zeile der Antwort mit "250 OK id=" beginnt war das Senden erfolgreich
        Serial.println("******* Mail gesendet *******");
        client.stop();
        error = false;
        response = true;
      }
    }
  }
}


1 Kommentar
Martin ✪ ✪ ✪ 22.04.2019
Hallo,

einfach super!
Es hat alles auf Anhieb geklappt.
Von Interesse ist nun für mich noch, wie ich den Script erweitern muss, um eine Datei (SPIFFS) im Anhang der eMail zu versenden.

Wäre sehr dankbar für eine Info.

Antwort:
Das ist sicher möglich. Momentan für mich aber, auch aus Zeitmangel, uninteressant. Es gibt Beispiele im Netz in verschiedenen Programmiersprachen für E-Mail mit Anhang, das müsste man für den Esp anpassen. Ich selbst nutze ausschließlich Push Nachrichten vom Esp auf das Smartphone.

Gruß Fips
Kommentar eintragen

*