Pages: 1 [2] 3   Go Down
Author Topic: eMail mit Arduino senden  (Read 5174 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SMTP ist eine 2-Wege Kommunikation. Einfach nur alle Kommandos in den TCP-Stream zu kippen reicht nicht. Wie ch-hunn schon sagte, musst Du die Antwort des Servers abwarten. Wenn Du sicher gehen willst, dann lies doch nach jedem Kommando die Antwort des Servers aus der Verbindung, dort sollte immer was von "OK" auftauchen, dann weisst Du, das Dein Kommando erfolgreich verarbeitet wurde. Dann kannst Du das nächste Kommando abschicken.
Mario.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Wie eben schon geschrieben benötigst du entweder SMTP-Auth, was du versucht hast, oder POP/IMAP-Auth.

Und wie auch eben schon geschrieben, der Grund für die Ablehnung ist ganz klar
Code:
503 5.5.0 <DATA>: Data command rejected: Improper use of SMTP command pipelining

Wie gesagt, ich verwende SMTP-Auth, ich würde sagen ich mache da soweit alles richtig.
Weil ich komme ja soweit das er mich schon "erkannt" hat.
Deswegen würde ich sagen, dass das daran nicht unbedingt liegen würde.

Ich vermute, dass Du zu schnell bist. Normalerweise sollte man nach jedem SMTP Kommando die Antwort des SMTP Servers abwarten, bevor man weitere Kommandis sendet.
Der Server muss ja auch die Benutzernamen/Kennwörter überprüfen. Dazu werden die Anmeldedaten an einen weiteren Server gesendet. Das benötigt seine Zeit.

Das mache ich zwar nicht in meinem Sketch, aber wenn ich eine Verbindung mit der Konsole versuche dann warte ich ja auch immer ab bis dann das "OK-Zeichen" kommt.

Ich habe hier mal den Verlauf aus der Konsole (email natürlich geändert):
helo lorenz
250 mtaout-ma06.r1000.mx.aol.com
auth login
334 VXNlcm5hbWU6
************************ email in base64
334 UGFzc3dvcmQ6
************************ pw in base64
235 2.7.0 Authentication successful
mail from: test@aol.de
250 2.1.0 Ok
rcpt to: test@aol.de
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: Erster test

das ist eine nachricht

.
521 5.2.1   521 AOL will not accept delivery of this message


Verbindung zu Host verloren.


So und immer wenn ich dann den Punkt eingebe, welcher das Ende festlegt, geht es nicht mehr weiter und diese Nachricht kommt halt.

Das hat jetzt zwar eigentlich absolut nichts mehr mit Arduino zu tun, aber versuchen kann man es ja mal in dem Forum, und soweit es aussieht, gibt es hier
auch Leute die sich damit auskenne smiley-wink

Vielen Dank für die Antworten !

Grüße
Lorenz
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das liegt daran, das Du eine andere EMail-Adresse als Absender (mail from: test@aol.de) angibst, als die Adresse mit der Du dich authentifizierst. Das lassen die meisten Mailserver nicht zu (und das aus gutem Grund).
Verwende als Absender und als Empfänger mal Deine korrekte AOL-Adresse, dann sollte es auf der Konsole schon gehen.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Endlich es funktioniert ! Aber bisher erstmal nur mit der Konsole..sollte dann aber auch später mit Arduino funktionieren, mal sehen was sich ergibt.

Wundert mich nur, dass das auf einmal wieder klappt, obwohl ich an meiner Vorgehensweise nichts geändert habe.
Wahrscheinlich ist jetzt genau ein Tag rum, und die haben mich da wieder rausgelöscht smiley-grin
D.h. ich kann nur eine bestimmte Anzahl von emails über telnet versenden ?!

Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 170
Posts: 3205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
client.println("...");
client.println("...");
client.println("...");
client.println("...");
client.println("...");
nach jedem gesendeten Kommando auf die Serverantwort (oder Timeout) warten. Schema:
Code:
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).
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

Quote
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 ! smiley

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:
Code:
#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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 170
Posts: 3205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

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

Na bravo!
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin)

Grüße
Lorenz
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank Mario !
Funktioniert einwandfrei ! smiley

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

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

Grüße
Lorenz
Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

using arduino leonardo
--
tomorrow today will only be yesterday, so live your life today!

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ????
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 170
Posts: 3205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

danke für deine hilfe

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

Code:
#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
Logged

Pages: 1 [2] 3   Go Up
Jump to: