Emailversand keine Verbindung zum Mailserver

So liebe Leute mein kleines Projekt schreitet voran,
jedoch bekomme ich keine Verbindung zum Mailserver, ich hoffe ihr könnt mir weiterhelfen.
Nochmal ganz kurz zur Funktionsweise: Wird das Relais betätigt wird eine Email versendet, und zwar nur einmal mal.
Die Daten sollten richtig sein, da die Befehle übers cmd funktionieren.
Kann ich statt der Mailserver ip einfach den Mailserver reinschreiben? Die IP ändert sich ja leider ständig.

als Ausgabe bekommen ich bei mehrmaligem Betätigen:
Led an
connection failed
Led aus
Led an
connection failed
Led aus
Led an
connection failed
Led aus

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

// Ethernet-Einstellungen
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {  beliebige einmalige ip}; // Ip Arduino
byte gateway[] = { IP Router }; 
byte subnet[] = { 255, 255, 255, 0 };
byte server[] = { 212, 227, 17, 190}; // IP Mailserver

EthernetClient client;


const int RelaisPin = 2;     
const int LedPin =  13;  
int y = 1;

int RelaisStatus = 0;  



void setup()
{
 pinMode(LedPin, OUTPUT);     
  pinMode(RelaisPin, INPUT);
  
  Serial.println("connecting...");
 Ethernet.begin(mac, ip);
 Serial.begin(9600);
}

void loop()
{


if (digitalRead(RelaisPin) == LOW && y==1)
{
y=0;
digitalWrite(LedPin, LOW);
Serial.println("Led aus");
}


	if(digitalRead(RelaisPin) == HIGH && y==0)
	{
	digitalWrite(LedPin, HIGH);  
	Serial.println("Led an");
        
	
	
	if (client.connect(server, 587)) 
		{   
     
         Serial.println("sending"); 
         client.println("ehlo arduino");
		 client.println("auth login");
			client.println("Emailadressein Base64");
			client.println("Passwort in Base64");
         client.println("mail from: blabla@gmx.net");
         client.println("rcpt to: blablalba@web.de");
         client.println("da");
         client.println("TO: blablalbaweb.de");
         client.println("SUBJECT: TEST Email");
         client.println();
         client.println("TEST.");
         // Kennzeichnung Ende der Email
         client.println(".");
         // Abmelden
         client.println("QUIT");
         y=1;
     
		} 
 else 
 {
     Serial.println("connection failed");
     y=1;
 }
	}
	delay(1000);	
}

Wenn du mit dem Server redest, musst du auch dessen Sprache nutzen. ;) So solltest du aus "ehlo" ein "HELO" machen, soweit ich mich recht entsinne. Auch ist es nicht gerade sinnvoll, die Anweisungen ohne Zeitverzögerung zu schicken, die Gegenstelle braucht auch Zeit zum antworten. Und diese Antworten solltest du im Code abfragen, dass du eine Rückmeldung bekommst, was gerade falsch läuft.

normalerweise guck ich mir so wild eingerücktes Zeug nicht an ;) , aber bis Serial.print("sending") kommt der adruino ja gar nicht, weil schon client.connect(server, 587) false liefert.

Danach hat sth77 natürlich auch recht.

Ich dachte ich brauche ehlo wegen der Authentifizierung, da ja ESMTP gefragt ist, also SMTP mit zusätzlicher Authentifizierung, [u]wenn[/u] ich das richtig verstanden habe.

Ok, also nach jedem gesendeten Befehl ein: delay(500); c = client.read(); Serial.print(c); liese sich das so lösen?

allerdings kommt ja die Meldung : connection failed was doch heisst dass er bereits an: if (client.connect(server, 587)) scheitert, und somit die Schleife gar nicht erst betritt

edit: wie ja michael_x auch gerade gepostet hat....

Ok ich versuchs mal etwas übersichtlicher zu gestalten :)

nrg112: Ich dachte ich brauche ehlo wegen der Authentifizierung, da ja ESMTP gefragt ist, also SMTP mit zusätzlicher Authentifizierung, [u]wenn[/u] ich das richtig verstanden habe.

Das hatte ich nicht bedacht, dass bei SMTP auth ein "EHLO" kommt, hätte ich ja hier nachlesen können: http://de.wikipedia.org/wiki/SMTP-Auth Sorry fürs Verwirrung stiften, war mein Fehler.

nrg112: Ok, also nach jedem gesendeten Befehl ein: delay(500); c = client.read(); Serial.print(c); liese sich das so lösen?

Nicht ganz, in dem Fall liest du ja nur ein Byte aus. Der bessere Ansatz wäre so lange zu horchen, wie Zeichen vom Server kommen und diese dann nacheinander einzulesen und per Serial auszugeben.

nrg112: allerdings kommt ja die Meldung : connection failed was doch heisst dass er bereits an: if (client.connect(server, 587)) scheitert, und somit die Schleife gar nicht erst betritt

Auch das hatte ich nicht gleich bedacht, ich halte es da eher wie michael_x:

michael_x: normalerweise guck ich mir so wild eingerücktes Zeug nicht an ;)

Zumindest nicht so gründlich... ;)

Erstmal danke für eure Mühe!
Hm, da bin ich ehrlich gesagt ziemlich überfordert mit dem einlesen.
Allerdings scheint ja das Problem erstmal an der Internetverbindung zu liegen, nehme ich mal an, da er die Schleife ja gar nicht betritt. Lässt sich denn irgendwie überprüfen ob überhaupt eine Verbindung zum Internet besteht?

Hoffe der Code ist jetzt übersichtlicher

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

// Ethernet-Einstellungen
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  192, 168, 0, 99 }; // IP Arduino-Board
byte gateway[] = { 
  192, 168, 0, 1 }; // IP Router
byte subnet[] = { 
  255, 255, 255, 0 };
byte server[] = { 
  212, 227, 17, 168}; // IP Mailserver



EthernetClient client;

const int RelaisPin = 2;     
const int LedPin =  13;  
int y = 1;



void setup()
{
  pinMode(LedPin, OUTPUT);     //Led Pin als Ausgang gesetzt
  pinMode(RelaisPin, INPUT);	// Relais Pin als Eingang gesetzt

  Serial.println("connecting...");
  Ethernet.begin(mac, ip, gateway, subnet);
  delay(1000);
  Serial.begin(9600);
}

void loop()
{


  if (digitalRead(RelaisPin) == LOW && y==1) //Wenn der Relais Pin LOW und y=1
  {
    y=0;
    digitalWrite(LedPin, LOW);
    Serial.println("Led aus");
  }


  if(digitalRead(RelaisPin) == HIGH && y==0) //Wenn der Relais Pin HIGH ist und y=0
  {
    digitalWrite(LedPin, HIGH);  
    Serial.println("Led an");	


    if (client.connect(server, 587)) // Wenn Verbindung zum oben gennanten Server besteht
    {   

      Serial.println("sending"); 
      client.println("ehlo arduino");
      client.println("auth login");
      client.println("******"); //Emailadresse in Base64
      client.println("******");		 //Passwort in Base64
      client.println("mail from: ******");
      client.println("rcpt to: ******");
      client.println("data");
      client.println("TO: ******");
      client.println("SUBJECT: TEST Email");
      client.println();
      client.println("TEST.");
      // Kennzeichnung Ende der Email
      client.println(".");
      // Abmelden
      client.println("QUIT");
      y=1;

    } 
    else // Besteht keine Verbindung gebe connection failed aus
    {
      Serial.println("connection failed");
      y=1;
    }		 

  }
}

Hoffe der Code ist jetzt übersichtlicher

Ja, zugegeben, aber immer noch eher individuell ;)

In der Arduino IDE gibt es bei Tools das Auto-Format ( STRG-T ) das Ergebnis ist ganz gut und produziert eine allgemein übliche Formatierung ...

Zum eigentlichen Problem der Verbindung an sich, kann ich leider nicht viel beitragen: Servername oder IP Adresse solle egal sein, die Port-Nummer ( war SMTP nicht 25 ? ) muss natürlich auch stimmen.

http://playground.arduino.cc/Code/Email#.UwaQaIUp_kU hast du sicher schon gesehen ...

Gut Danke habs nochmal editiert.

Habs gerade mal getestet, es funktioniert beides. Also mail.gmx.net mit port 587 und smtp.gmx.de mit port 25. Nur leider hald nicht auf dem Arduino =(

Hab gerade mal versucht ihn anzupingen, und das funktioniert auch nicht, also besteht anscheinend gar keine Verbindung zu Internet

C:\Users\x>ping 192.168.0.99

Ping wird ausgeführt für 192.168.0.99 mit 32 Bytes Daten: Zeitüberschreitung der Anforderung. Zeitüberschreitung der Anforderung. Zeitüberschreitung der Anforderung. Zeitüberschreitung der Anforderung.

Ping-Statistik für 192.168.0.99: Pakete: Gesendet = 4, Empfangen = 0, Verloren = 4 (100% Verlust),

Schau Dir mal die Seite http://arduino.cc/en/Reference/EthernetBegin#.Uwd0L178-X0 an.

Speziell

Ethernet.begin(mac); Ethernet.begin(mac, ip); Ethernet.begin(mac, ip, dns); Ethernet.begin(mac, ip, dns, gateway); Ethernet.begin(mac, ip, dns, gateway, subnet);

Wenn Du 4 Parameter angibst, wie bei Dir im Sketch (Ethernet.begin(mac, ip, gateway, subnet);) dann setzt Du nicht das Gateway und das Subnet, sondern DNS (auf die Gateway IP) und das Gateway auf das Subnet. Du musst den DNS mit angeben. In der Regel ist das der Router selbst, oder Du verwendest einfach den google-DNS (8.8.8.8).

Mario.

Stimmt da hast du Recht! Über ipconfig/all bekomme ich die DNS in dieser Form: fa85::1%12 Aber in welcher Form gebe ich sie dann im Sketch an? Es heisst auch hier Array of 4 Bytes. Bzw, ist das Überhaupt nötig? Was MUSS ich denn alles angeben? Nur Mac und IP, was man ja auch oft liest hab ich gerade getestet, aber dann kommt immernoch connection failed.

Das sieht wie eine IPv6 Adresse aus. Bei mir stehen die aber im IPv4 Format bei ipconfig /all selbst wenn andere Adressen im IPv6 Format sind.

Gerade getestet:

Ihre IPv4-Adresse lautet: .......... Ihre IPv6-Adresse lautet: nicht vorhanden Test IPv4 mit DNS: OK Test IPv4 ohne DNS: OK Test IPv6 mit DNS: fehlgeschlagen Test IPv6 ohne DNS: fehlgeschlagen Test Dual Stack: OK Test, ob DNS des ISP IPv6 unterstützt: OK

Hab den Beispielsketch DHCPAdressPrinter mal ausprobiert, auch hier erhalte ich keinerlei Ausgabe. Vielleicht ist das EthernetShield doch defekt, Sketches lassen sich ja auch nur ohne aufgestecktes EthernetShield uploaden.

nrg112:
Hab den Beispielsketch DHCPAdressPrinter mal ausprobiert, auch hier erhalte ich keinerlei Ausgabe.
Vielleicht ist das EthernetShield doch defekt, Sketches lassen sich ja auch nur ohne aufgestecktes EthernetShield uploaden.

Sag mal im Ernst: Wie gut kennst Du Dich eigentlich mit dem aus, was Du da machen möchstest?

Z.B. mit Arduino-Programmierung?
Z.B. mit dem Mail-Protokoll?

Wenn ich mir alleine Dein Setup ansehe:

void setup()
{
 pinMode(LedPin, OUTPUT);     
  pinMode(RelaisPin, INPUT);
  
  Serial.println("connecting...");
 Ethernet.begin(mac, ip);
 Serial.begin(9600);
}

und dort sehe, dass Du zuerst mit “Serial.println” was auf Serial ausgeben möchtest und erst danach mit “Serial.begin” die serielle Schnittstelle initialisierst, kann ich nur mit dem Kopf schütteln.

byte ip[] = {  beliebige einmalige ip}; // Ip Arduino
byte gateway[] = { IP Router };

Das müssen ja hochgeheime Informationen über Deine hausinterne Netzwerkkonfiguration sein, dass Du sie im Quelltext nicht offen posten kannst, sondern verschleiern mußt. Übrigens: Bei der Angabe der IP-Adresse gibt es durchaus Fehlermöglichkeiten, aber das nur mal nebenbei.

Anyway: Wenn Du testen möchtest, ob Dein Ethernet-Shield eine Netzwerkverbindung zu Deinem Server aufbauen kann, ist Dein Code viel zu kompliziert. Also ich habe mal ein Netzwerkshield aufgesteckt und ein kleines Testprogramm gemacht. Automatischer Bezug einer eindeutigen IP-Adresse per DHCP (Voraussetzung: In Deinem supergeheimen Netzwerk ist DHCP aktiviert) und Verbindungsaufbau zu Deinem Server, mit Auslesen der Serverantworten:

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

// Ethernet-Einstellungen
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 212, 227, 17, 190}; // IP Mailserver

EthernetClient client;

void setup()
{
  Serial.begin(9600);
  Serial.print("connecting...");
  if (Ethernet.begin(mac))
    Serial.println("OK");
  else
  {  
    Serial.println("ERROR");
    while(1); // Endlosschleife bis zum Reset
  }
}

void loop()
{
  if (client.connect(server, 587)) 
  {
    delay(1000);
    while (client.available()) Serial.write(client.read());
    client.println("help");
    delay(1000);
    while (client.available()) Serial.write(client.read());
    client.println("quit");
    delay(1000);
    while (client.available()) Serial.write(client.read());
  } 
 else 
 {
     Serial.println("connection failed");
 }
 while(1); // Endlosschleife bis zum Reset
}

Teste mal mit diesem Programm!
Was wird damit bei Dir auf Serial ausgegeben?

Natürlich kenne ich mich nicht gut aus, ist ja auch mein erstes Projekt… Andernfalls würde ich euch ja auch nicht mit Fragen löchern.

Dein Programm bringt folgende Ausgabe:

220 gmx.com (mrgmx003) Nemesis ESMTP Service ready
214-This server supports the following commands:
214-EHLO HELO MAIL RCPT DATA RSET NOOP QUIT HELP
214 STARTTLS AUTH
221 gmx.com Service closing transmission channel

Woraus ich schließe, dass die Internetverbindung also doch klappt.

Vielen Dank jurs! Dann werd ich mal weiterversuchen das Problem zu lösen.

Edit:
Nochmal Vielen vielen Dank an jurs, das Programm funktioniert jetzt mit folgendem Code:

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

// Ethernet-Einstellungen
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 212, 227, 17, 190}; // IP Mailserver


EthernetClient client;

const int RelaisPin = 2;     
const int LedPin =  13;  
int y = 1;



void setup()
{
  pinMode(LedPin, OUTPUT);     //Led Pin als Ausgang gesetzt
  pinMode(RelaisPin, INPUT);	// Relais Pin als Eingang gesetzt
  
  Serial.begin(9600);
  Serial.print("connecting...");
  delay(2000);
  
  if (Ethernet.begin(mac))
    Serial.println("OK");
  else
  {  
    Serial.println("ERROR");
    while(1); 					// Endlosschleife bis zum Reset              
  }
  
}

void loop()
{


  if (digitalRead(RelaisPin) == LOW && y==1) //Wenn der Relais Pin LOW und y=1
  {
    y=0;
    digitalWrite(LedPin, LOW);
    Serial.println("Led aus");
  }


  if(digitalRead(RelaisPin) == HIGH && y==0) //Wenn der Relais Pin HIGH ist und y=0
  {
    digitalWrite(LedPin, HIGH);  
    Serial.println("Led an");	


    if (client.connect(server, 587)) // Wenn Verbindung zum oben genannten Server besteht
    {   
	
      Serial.println("sending"); 
      client.println("ehlo arduino");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("auth login");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("xxxxx"); //Emailadresse in Base64
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("xxxxx");		 //Passwort in Base64
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("mail from: xxxxx");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("rcpt to: xxxxx");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("data");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("TO: xxxxx");
      client.println("SUBJECT: TEST Email");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println();
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      client.println("TEST.");
	  delay(1000);
      // Kennzeichnung Ende der Email
      client.println(".");
	  delay(1000);
	  while (client.available()) Serial.write(client.read());
      // Abmelden
      client.println("QUIT");
      while (client.available()) Serial.write(client.read());
      y=1;

    } 
    else // Besteht keine Verbindung gebe connection failed aus und setze y wieder auf 1
    {
      Serial.println("connection failed");
      y=1;
    }		 

  }
}

Allerdings: Das ganze funktioniert nur einmal, bei erneutem Betätigen des Relais erhalte ich wieder “connection failed”, nach ab- und wieder anstecken des Arduino funktioniert es wieder genau einmal.
Hab schon überlegt ob es an gmx liegt, und sich mit der Ip nur eine Mail in einem gewissen Zeitfenster senden lässt, zwecks Spam etc., aber im cmd funktionierts ja auch mehrmals hintereinander.

nrg112: Natürlich kenne ich mich nicht gut aus, ist ja auch mein erstes Projekt....

"Das Internet ist für uns alle Neuland" (Angela M.)

Ich sage mal so: Um im Internet was anderes zu machen als von der NSA abgehört und ausspioniert zu werden, wäre eine geringfügig höhere Qualifikation in Sachen Internet-Standards wünschenswert, als sie bei unserer Bundeskanzlerin vorhanden ist.

nrg112: Dein Programm bringt folgende Ausgabe:

220 gmx.com (mrgmx003) Nemesis ESMTP Service ready 214-This server supports the following commands: 214-EHLO HELO MAIL RCPT DATA RSET NOOP QUIT HELP 214 STARTTLS AUTH 221 gmx.com Service closing transmission channel

Woraus ich schließe, dass die Internetverbindung also doch klappt.

Aha. Soviel also zum Thema "keine Verbindung zum Mailserver".

nrg112: Dann werd ich mal weiterversuchen das Problem zu lösen.

Bevor Du Dich da in irgendwas verrennst, noch einige Hinweise:

  1. E-Mails auf Port 587 einliefern: Auf Port 587 kannst Du nur mit TLS (Transport Layer Security ) verschlüsselte E-Mails einliefern. Die daran beteiligten Kommunikationspartner prüfen ihre Identität anhand von Sicherheitszertifikaten und verschlüsseln die ausgetauschten Daten symmetrisch. Für dieses Verfahren hat ein Arduino-Board nach meinem Kenntnisstand viel zu wenig RAM und Rechenleistung, so dass Du mit einem Arduino überhaupt keine SSL/TLS verschlüsselten E-Mails einliefern kannst.

  2. E-Mails auf Port 25 einliefern: Unverschlüsselte E-Mails einliefern, so wie Du es mit Deinem Quellcode offenbar möchtest, kannst Du nur per SMTP auf Port 25. Aufgrund der NSA-Abhör- und -ausspähungsaffäre haben sich alle großen Provider in Deutschland dazu entschlossen, ab dem 2. Quartal die unverschlüsselte und ungesicherte E-Mail Einlieferung auf Port 25 abzuschalten und nur noch verschlüsselte Mails mit SSL/TLS gesichertem Übertragungsprotokoll zu akzeptieren.

Unter anderem Telekom, Web.de. 1&1 und GMX sind dabei: http://www.spiegel.de/netzwelt/web/telekom-web-de-und-gmx-machen-e-mail-sicherer-a-915678.html Gesichert werden dabei die von Kunden eingelieferten Mails, aber auch die Sendungen von E-Mails zwischen diesen Providern untereinander.

Genaues Datum der Abschaltung für unverschlüsselte E-Mails steht noch nicht fest, aber wenn Du mit Deinem Arduino noch unverschlüsselte E-Mails bei GMX einliefern möchtest, würde ich mich beeilen. Das ist demnächst Geschichte.

Dann mußt Du Dir entweder etwas überlegen (selbst einen Mailserver betreiben, über einen eigenen Server einliefern, leistungsfähigere Hardwareplattform), oder die Mail bei einem Provider loswerden, der dann noch ungesicherte/unverschlüsselte E-Mails zur Einlieferung auf seinen Mailservern akzeptiert.

Ok, vielen Dank für die Infos, aber warum kann ich dann eine Email senden? Mit dem smtp server auf port 25 ist es übrigens genauso, eine Email lässt sich senden.

nrg112: Ok, vielen Dank für die Infos, aber warum kann ich dann eine Email senden? Mit dem smtp server auf port 25 ist es übrigens genauso, eine Email lässt sich senden.

Die großen Provider in Deutschland befinden sich in der Phase der technischen Umstellung. NOCH kannst Du wohl fast überall E-Mails wie anno dunnemals unverschlüsselt im Klartext einliefern. Alle Kunden, die noch nicht TLS verschlüsselte E-Mails einliefern, wurden beispielsweise von 1&1 im Dezember und im Januar jeweils einmal angeschrieben.

Einen konkreten Umstellungstermin, ab wann unverschlüsselt eingelieferte Mails nicht mehr funktionieren werden, gibt es noch nicht. Siehe auch: https://hilfe-center.1und1.de/sicherheit-c84638/sicher-mit-e-mails-umgehen-c84640/e-mail-und-ssl-c84642/haeufige-fragen-zur-sicheren-e-mail-bertragung-ssl-a794132.html (Dort Punkt "Gibt es bereits einen genauen Termin zur Umstellung?")

Solange es die nächsten Wochen/Monate noch funktioniert, reicht mir das ja für erste, vielleicht brauche ich bis dahin die Emailbenachrichtigung gar nicht mehr und wenn doch lässt sich bis dahin bestimmt eine Lösung finden. Bis ich mir darüber Gedanken mache muss ich erstmal eine Lösung finden mehrere Emails zu senden und nicht immer nur eine und anschließend den Arduino vom Strom trennen und wieder verbinden.

Ein kleines Delay nach "QUIT" (?) Dann erst Antwort auswerten, dann client.stop(); (?)

Bis irgendwann später mit "Led an" wieder ein client.connect() getriggert wird ...