eMail mit Arduino senden

lgrube96:
Ich verwende doch für alle die gleich eMail-Adresse !
Also einmal bei auth login, mail from und rcpt to...
Oder meinst du was anderes ?

Lasse Dich doch nicht ins Bockshorn jagen, da hat jemand nicht verstanden, dass Du natürlich nicht mit einer fremden oder nicht existenten Mailadresse (test@aol.com) testest, sondern Du hier in Deinem Sketch nur so tust ("Verschleierung von Mailadressen") als wenn Du mit der fremden Mailadresse testen würdest. Tatsächlich testest Du natürlich mit Deiner eigenen Mailadresse.

Dein ganz zu Anfang geposteter Code funktioniert in genau der Form auch bestens - mit einigen Mailservern, die nicht dieselben Antispam-Maßnahmen verwenden wie AOL.

Die Fehlermeldung zeigt Dir nur eins an: Du sollst die Kommandos nicht in die Pipeline schieben, ohne die Serverantwort abzuwarten, das wird von dem Mailserver nicht unterstützt. Du mußt einfach nur bei Deinem Ausgangssketch statt die Zeilen in die Leitung rauszurotzen:

client.println("...");
client.println("...");
client.println("...");
client.println("...");
client.println("...");

nach jedem gesendeten Kommando auf die Serverantwort (oder Timeout) warten. Schema:

client.println("...");
WaitForServerAntwortOrTimeout(); 
client.println("...");
WaitForServerAntwortOrTimeout(); 
client.println("...");
WaitForServerAntwortOrTimeout(); 
client.println("...");
WaitForServerAntwortOrTimeout(); 
client.println("...");

Nachdem ich Dir gesten Abend den Link zum Googeln der Fehlermeldung gepostet hatte, bist Du doch auch in diversen nachfolgenden Postings darauf aufmerksam gemacht worden, dass genau das der Knackpunkt an Deinem Code ist: Kommandos rausrotzen was das Zeug hält, aber sich nicht darum scheren, was der Server auf die einzelnen Kommandos antwortet.

Das Timeout für die von Dir noch zu schreibende Funktion "WaitForServerAntwortOrTimeout(); ", wie lange auf Serverantwort gewartet wird, würde ich mal mit 4 Sekunden setzen, denn soweit mir bekannt ist, verzögern Mailserver, die Anti-Pipelining als Antispam-Feature nutzen, die Antworten nur um ca. 0 bis 3 Sekunden (nach Zufallsprinzip, damit sich Spammer nicht auf ein exaktes Timingverhalten einschießen können).

Lasse Dich doch nicht ins Bockshorn jagen, da hat jemand nicht verstanden, dass Du natürlich nicht mit einer fremden oder nicht existenten Mailadresse (test@aol.com) testest, sondern Du hier in Deinem Sketch nur so tust ("Verschleierung von Mailadressen") als wenn Du mit der fremden Mailadresse testen würdest. Tatsächlich testest Du natürlich mit Deiner eigenen Mailadresse.

Genau so ist es ! Ich habe eigentlich angenommen dass das klar ist !
Hätte ich wahrscheinlich etwas genauer erwähnen sollen, sry.

Dein ganz zu Anfang geposteter Code funktioniert in genau der Form auch bestens - mit einigen Mailservern, die nicht dieselben Antispam-Maßnahmen verwenden wie AOL.

Welche Mailserver würde es denn geben die nicht so Antispam Maßnahmen wie aol durchführt ?!


Ich habe dann mal das mit meinem Sketch probiert und es funktioniert ! :slight_smile:

Ich habe da halt einfach nach jedem client.print noch eine Verzögerung eingebaut.
Das Abwarten bis eine Antwort kommt, also OK, und dann erst zum nächsten Schritt überzugehen, ist in meinem Fall etwas übertrieben, da es jetzt so schlimm wäre wenn dann mal eine eMail nicht ankommt.

Hier mein "fertiger" Sketch, nichts ausgfeiltes aber es funktioniert:

#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0D, 0x44, 0x70 };
byte ip[] = { 
  192, 168, 2, 109 };
byte server[] = { 
  205, 188, 186, 137 }; // Mail server address  MODIFY THIS FOR THE TARGET DOMAIN's MAIL SERVER

EthernetClient client;
int x = 2000;

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 25)) {
    Serial.println("connected");
    delay(x);
    client.println("HELO lorenz");
    delay(x);
    client.println("auth login");
    delay(x);
    client.println("eMail Base64");
    delay(x);
    client.println("PW Base64");
    delay(x);
    client.println("MAIL FROM: test@aol.de");
    delay(x);
    client.println("RCPT TO: test@aol.de");
    delay(x);
    client.println("DATA");
    delay(x);
    client.println("From: test@aol.de");
    delay(x);
    client.println("To: test@aol.de");
    delay(x);
    client.println("SUBJECT: Test");
    delay(x);
    client.println();
    client.println("Erster test mit arduino.");
    delay(x);
    client.println(".");
    delay(x);
    client.println("QUIT");
  } 
  else {
    Serial.println("connection failed");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}

Ob das mit der Verzögerung jetzt die beste Idee, bezweifle ich mal. Aber wie gesagt, es reicht mir eigentlich so.

Grüße Lorenz

lgrube96:
Welche Mailserver würde es denn geben die nicht so Antispam Maßnahmen wie aol durchführt ?!

Bei mir funktioniert z.B. auth.smtp.kundenserver.de von 1und1 mit Deinem ursprünglichen Script.

lgrube96:
Ich habe dann mal das mit meinem Sketch probiert und es funktioniert ! :slight_smile:

Na bravo!

Ich hätte da nochmal eine Frage am Rande, passt jetzt zwar nicht ganz zur Topic, aber mal sehen ob es sich lohnt eine neue Topic aufzumachen.

Also da eine eMail Nachricht auf meinem ipod touch ja nicht sofort angezeigt wird, da nur alle max. 15 Min automatisch aktualisiert wird, suche ich jetzt noch zusätzlich eine Möglichkeit "direkt" eine Nachricht an den ipod zu senden.
Also mit hilfe einer app, die ermöglicht, dass ich eine Nachricht von dem Arduino an den ipod senden kann.
Bei google habe ich jetzt nicht wirklich was gefunden bzw. wusste ich nicht genau wie ich kurz und knapp meine Frage formulieren sollte.

Hoffe irgendwer hat da eine Idee oder ähnliches.
Es wurde auch eine Methode mit Jailbreak gehen. (hoffe mal ihr kennt das in irgendeiner weise, zum mindest die, die einen Ipod touch oder Geräte von Apple besitzen :D)

Grüße
Lorenz

Schau Dir mal http://www.prowlapp.com/ an. Die App kostet einmalig 2,69 und der Dienst selbst bietet eine API, um Push-Nachrichten auf ein iOS-Gerät zu senden.
Evtl. gibt es auch noch was kostenloses.
Darauf basiert wohl auch folgendes: http://avvisoapp.com/

Vielleicht hilft die Info ja schon weiter.

Mario.

Vielen Dank Mario !
Funktioniert einwandfrei ! :slight_smile:

Echt eine bessere Variante als eMail...hätte ich mal eher fragen sollen :confused:

Vielen Dank nochmal an alle ! Das Forum ist einfach super !

Grüße
Lorenz

Im Prinzip unterstützen nahezu alle gängigen Mailserver, die IMAP-Unterstützung anbieten, mit PUSH.
Hierbei wird eine Verbindung zwischen Client (App) und Server quasi aufrecht erhalten, über die der Server den Client informiert, wenn bestimmte Ereignisse eintreten, in der Regel bei neuen Mails.
Also wird lediglich ein PUSH-fähiger E-Mail-Client benötigt.
Steht in den Apps normalerweise in der Beschreibung, wenn sie es können.

Liebe Grüße

Dirk

Hallo

Versteh das nicht habe mir den sketch kopiert und mit meinen Daten ergänzt.

byte server[] = { 194, 221, 183, 20 }; gmx server

ist doch die Adresse wo er sich hin verbinden soll oder ?
bei mir verbindet es sich nicht bekomme immer die Meldung im serial monitor:

connecting.....
connection failed

disconnecting.

was mach ich falsch ????

pepeAUT:
Versteh das nicht habe mir den sketch kopiert und mit meinen Daten ergänzt.

byte server[] = { 194, 221, 183, 20 }; gmx server

ist doch die Adresse wo er sich hin verbinden soll oder ?

Nö, wie kommst Du denn darauf, dass das der GMX-Sendmailserver sein soll?

Einfach mal so geraten?
Irgendwo aus historischen Dokumenten rausgezogen?

Wie ich oben schon schrieb: Es ist am sichersten, auf den SERVERNAMEN statt auf die IP-Adresse zu verbinden. Denn die IP-Adresse kann sich jederzeit ändern, wenn ein Anbieter etwas an der Konfiguration ändert. Der Name des Mailservers wird allerdings von den Providern meist sehr lange konstant gehalten.

Mal kurz gegoogelt, welches der GMX-Postausgangsserver ist und ich finde:
https://hilfe.gmx.net/mailprogramme/pop3.html
Da steht was von "mail.gmx.net"

Dann frage ich ab, mit welcher IP-Adresse dieser Name momentan verknüpft ist und finde:
mail.gmx.net [212.227.17.168]

Ich würde lieber mal eine aktuelle IP-Nummer probieren.
Wenn Du es unbedingt mit IP-Nummer machen möchtest.
Die IP-Nummer für den Namen des Mailservers kann aber nächstes Jahr, nächsten Monat oder vielleicht auch schon morgen eine andere sein.

Im Text steht zwar Port 465 für den Postausgang, aber ich habe mal getestet, dass der Server auch Port-25 Verbindungen zu akzeptieren scheint. Musst Du mal schauen, wie weit Du mit dem Skript kommst. Eventuell sind kleinere Änderungen notwendig. In jedem Fall: Poste die Fehlermeldungen, sobald Du connected bist und Fehlermeldungen kommen!

danke für deine hilfe

habe einen ping auf gmx gemacht von da kommt die ip .

#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x44, 0x70 };
byte ip[] = { 192, 168, 1, 109 };
byte server[] = {" mail.gmx.net" }; // Mail server address  MODIFY THIS FOR THE TARGET DOMAIN's MAIL SERVER

EthernetClient client;
int x = 2000;

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 25)) {
    Serial.println("connected");
    delay(x);
    client.println("HELO lorenz");
    delay(x);

so ist es sicher falsch denn da geht auch nix

pepeAUT:
habe einen ping auf gmx gemacht von da kommt die ip .

Ein "ping auf gmx" liefert nur die Fehlermeldung:

C:>ping gmx
Ping-Anforderung konnte Host "gmx" nicht finden. Überprüfen Sie den Namen, und versuchen Sie es erneut.

Irgendwie wärst Du besser bedient gewesen, anstelle eines "ping auf gmx" ein "ping auf mail.gmx.net" zu machen, also den für die Einlieferung von E-Mails zuständigen Mailserver bei GMX.

Ansonsten sage ich immer noch: Verbinde Dich NICHT auf die IP-Nummer, sondern auf den NAMEN des Mailservers:

#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x44, 0x70 };
byte ip[] = { 192, 168, 1, 109 };
char server[] = "mail.gmx.net";    // name address of server

EthernetClient client;
int x = 2000;

void setup()
{
  Serial.begin(9600);
  Serial.println("Connecting to Local Area Network...");
  Ethernet.begin(mac, ip);
  Serial.print("Local IP: ");
  Serial.println(Ethernet.localIP());
  
  Serial.println("Server connection starts in 5 seconds...");
  delay(5000);

  Serial.println("Connecting to mail server...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 25)) {
    Serial.println("connected");
    client.println("HELO lorenz");
    client.println("quit"); // Session beenden ohne eine Mail zu senden
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    Serial.println("Connection closed - starting infinite waiting loop");
    // do nothing forevermore:
    while(true);
  }
}

Die allermeisten mail server wollen nicht als Spam-Schleudern missbraucht werden, und versuchen daher, es sendenden Programmen etwas schwerer zu machen.

Abhilfe: ein eigener mail server. Evtl. ist der Hamster was für dich.