Programm zur Kommunikation zum versenden von E-Mails

Hallo Leute,

nachdem das Kommunizieren meiner CNC-Maschine jetzt per Mobiltelefon funktioniert wollte ich eine weitere Funktion programmieren.
Jetzt geht es darum das Signal der CNC-Maschine zu zählen und nach einer bestimmten Anzahl von Durchläufen soll automatisch eine E-Mail versendet werden.

Dazu habe ich folgenden Code geschrieben...

//Programm zum zählen von Signalen und anschließendem versenden von einer E-Mail

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

byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; // durch eigene mac ersetzen
byte ip[] = { x, xx, xx, xx }; //durch eigene IP ersetzen
byte server[] = { 217, 69, 254, 100 }; // Mail server IP, //von smtp@smart-mail.de, ev. durch eigenen Server ersetzen
int puls= 0;
EthernetClient client;
int x = 5000; // sichert die Kommunikation zum Server ab


void setup()
{
Serial.begin(9600);
attachInterrupt(0, pulsZahl, HIGH); 
 
Ethernet.begin(mac, ip);

Serial.begin(9600);
Serial.println("connecting...");
delay(x);
if (client.connect(server, 25)) {
Serial.println("connected, Server will respond, please wait");
delay(x);
client.println("EHLO Arduino"); //EHLO muß so geschrieben sein, Arduino = beliebiger Name
delay(x);

//LOG IN************************************************ ************************************************** ************

client.println("AUTH LOGIN"); //Benutzername und Passwort müssen im BASE64 Format vorliegen. Unter "http://base64-encoder-online.waraxe.us/" einfach zu finden.
delay(x);
client.println("xxxxxxxxxxxx"); // das ist der Benutzername, die " " müssen bleiben, xxxx bitte durch deinen BASE 64 code ersetzen
delay(x);
client.println("xxxxxxxxxxx"); // das ist das Passwort, die " " müssen bleiben, xxxx bitte durch deinen BASE 64 code ersetzen
delay(x);
//MAIL Versand******************************************* **************************************************
client.println("MAIL FROM: xxxxxxx@smart-mail.de"); //xxxx bitte durch deine E-Mail ersetzen
delay(x);
client.println("RCPT TO: xxxxxxx@smart-mail.de"); 
delay(x);
client.println("DATA");
delay(x);
client.println("From: xxxxxx@smart-mail.de");
delay(x);
client.println("To: xxxxxx@smart-mail.de");
delay(x);
client.println("SUBJECT: Test");
delay(x);
client.println();
delay(x);
client.println("Erster test mit arduino.");
delay(x);
client.println(".");
delay(x);
client.println("QUIT");
} 
else {
Serial.println("connection failed");
}
}

void loop()
{
delay (10000)
Serial.println (puls, DEC);
puls= 0;
}

void pulsZahl() 
{
  noInterrupts();
  puls++;
  interrupts();
}
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}

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

Ich habe hier das Problem das ich das zählen nicht mit dem Versand der Email in Verbindung bekomme.Außerdem will ich es über das GSM-Modul versenden nicht über die Ethernet-Schnittstelle.

Ideen?

Wenn ich das richtig verstehe, dann kann das GSM900-Modul (müsste auch mit deinem GSM900A gehen) direkt eine Email schicken. Es gibt ein Tutorial zum Versenden einer Email mit dem Modul. Der Ersteller nutzt allerdings ein Terminalprogramm statt eines Arduinos zur Kommunikation mit dem Modul: SIM900 GPRS EMAIL AT Commands

Im Prinzip müsstest du dein SMS-Programm mit den entsprechenden Commandos abändern können.

Mail direkt mit dem Arduino kannst du inzwischen vergessen. Der überwiegende Teil der Provider verlangt inzwischen zwingend SSL oder TLS (verschlüsselte Mails). Dazu ist ein Standard-Arduino (Nano, Uno, Mega) aus Speicher- und Performance-Gründen nicht in der Lage.

Mögliche Lösungen wären z.B., eine Webseite mit PHP-Script zum Mailen zwischen zu schalten oder einen Arduino-Konkurrenten wie ESP8266 oder Yun zu verwenden. Eigentlich sollte es auch mit nem Due möglich sein, kenne aber noch niemanden, der sich die Mühe gemacht hätte, das zu coden ...

Hallo nochmal,

also ich wollte jetzt den Code vom SMS versenden anpassen aber bin mir nicht sicher was ich hier dann genau ändern muss?

Ich würde jetzt quasi das versenden von SMS erweitern durch den Verbindungsaufbau zu einem Server.
Wo muss ich den Programmcode einfügen und was muss ich entfernen?

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino für serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pin´s
char msg;
int inPin = 7;              // Input pin für Arduino Kommunikation mit CNC
int reading;               // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs

// folgende Variablen müssen vom Typo unsigned long sein da millis() disen Variablentyp liefert.

unsigned long time = 0;         // letzter Zeitwert bei dem der Ausgangzustand wechselte.
unsigned long debounce = 200;   // Entprellzeit


void setup()//Grundeinstellungen der Ein- und Ausgangskanäle definiert
{
 pinMode(inPin, INPUT);

  mySerial.begin(9600);   // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom GSM Module  
  Serial.begin(9600);    // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom Arduino
  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Signal von CNC:");
  Serial.println("LOW : to send message");
  Serial.println();
  delay(100);
}

void loop()//Status Abfrage
{
 reading = digitalRead(inPin);
                   // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
 if (reading == HIGH && previous == LOW && millis() - time > debounce) {
   time = millis(); 
   Serial.println("Sende SMS");
   SendMessage();    //Nachricht senden
   }
                   // Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
 if (reading == LOW && previous == HIGH && millis() - time > debounce) {
   time = millis();    
   }
 previous = reading;
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1");    //Setzt the GSM Module in Text Mode
  delay(1000);  // Delay von 1000 milli sekunde oder 1 sekunde
  mySerial.println("AT+CMGS=\"+49XXX\"\r"); // Rufnummer an die gesendet werden soll
  delay(1000);
  mySerial.println("K-Modul");// Text der gesendet werden soll
  delay(100);
   mySerial.println((char)26);// ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

Es muss doch jetzt erst das GSM mit dem Server die Verbindung herstellen oder?

#include <SoftwareSerial.h>
SoftwareSerial GSM(7, 8); // RX, TX

enum _parseState {
  PS_DETECT_MSG_TYPE,

  PS_IGNORING_COMMAND_ECHO,

  PS_HTTPACTION_TYPE,
  PS_HTTPACTION_RESULT,
  PS_HTTPACTION_LENGTH,

  PS_HTTPREAD_LENGTH,
  PS_HTTPREAD_CONTENT
};

byte parseState = PS_DETECT_MSG_TYPE;
char buffer[80];
byte pos = 0;

int contentLength = 0;

void resetBuffer() {
  memset(buffer, 0, sizeof(buffer));
  pos = 0;
}

void sendGSM(const char* msg, int waitMs = 500) {
  GSM.println(msg);
  delay(waitMs);
  while(GSM.available()) {
    parseATText(GSM.read());
  }
}

void setup()
{
  GSM.begin(9600);
  Serial.begin(9600);
  
  sendGSM("AT+SAPBR=3,1,\"APN\",\"vodafone\"");  
  sendGSM("AT+SAPBR=1,1",3000);
  sendGSM("AT+HTTPINIT");  
  sendGSM("AT+HTTPPARA=\"CID\",1");
  sendGSM("AT+HTTPPARA=\"URL\",\"http://www.iforce2d.net/test.php\"");
  sendGSM("AT+HTTPACTION=0");
}

void loop()
{  
  while(GSM.available()) {
    parseATText(GSM.read());
  }
}

void parseATText(byte b) {

  buffer[pos++] = b;

  if ( pos >= sizeof(buffer) )
    resetBuffer(); // just to be safe

  /*
   // Detailed debugging
   Serial.println();
   Serial.print("state = ");
   Serial.println(state);
   Serial.print("b = ");
   Serial.println(b);
   Serial.print("pos = ");
   Serial.println(pos);
   Serial.print("buffer = ");
   Serial.println(buffer);*/

  switch (parseState) {
  case PS_DETECT_MSG_TYPE: 
    {
      if ( b == '\n' )
        resetBuffer();
      else {        
        if ( pos == 3 && strcmp(buffer, "AT+") == 0 ) {
          parseState = PS_IGNORING_COMMAND_ECHO;
        }
        else if ( b == ':' ) {
          //Serial.print("Checking message type: ");
          //Serial.println(buffer);

          if ( strcmp(buffer, "+HTTPACTION:") == 0 ) {
            Serial.println("Received HTTPACTION");
            parseState = PS_HTTPACTION_TYPE;
          }
          else if ( strcmp(buffer, "+HTTPREAD:") == 0 ) {
            Serial.println("Received HTTPREAD");            
            parseState = PS_HTTPREAD_LENGTH;
          }
          resetBuffer();
        }
      }
    }
    break;

  case PS_IGNORING_COMMAND_ECHO:
    {
      if ( b == '\n' ) {
        Serial.print("Ignoring echo: ");
        Serial.println(buffer);
        parseState = PS_DETECT_MSG_TYPE;
        resetBuffer();
      }
    }
    break;

  case PS_HTTPACTION_TYPE:
    {
      if ( b == ',' ) {
        Serial.print("HTTPACTION type is ");
        Serial.println(buffer);
        parseState = PS_HTTPACTION_RESULT;
        resetBuffer();
      }
    }
    break;

  case PS_HTTPACTION_RESULT:
    {
      if ( b == ',' ) {
        Serial.print("HTTPACTION result is ");
        Serial.println(buffer);
        parseState = PS_HTTPACTION_LENGTH;
        resetBuffer();
      }
    }
    break;

  case PS_HTTPACTION_LENGTH:
    {
      if ( b == '\n' ) {
        Serial.print("HTTPACTION length is ");
        Serial.println(buffer);
        
        // now request content
        GSM.print("AT+HTTPREAD=0,");
        GSM.println(buffer);
        
        parseState = PS_DETECT_MSG_TYPE;
        resetBuffer();
      }
    }
    break;

  case PS_HTTPREAD_LENGTH:
    {
      if ( b == '\n' ) {
        contentLength = atoi(buffer);
        Serial.print("HTTPREAD length is ");
        Serial.println(contentLength);
        
        Serial.print("HTTPREAD content: ");
        
        parseState = PS_HTTPREAD_CONTENT;
        resetBuffer();
      }
    }
    break;

  case PS_HTTPREAD_CONTENT:
    {
      // for this demo I'm just showing the content bytes in the serial monitor
      Serial.write(b);
      
      contentLength--;
      
      if ( contentLength <= 0 ) {

        // all content bytes have now been read

        parseState = PS_DETECT_MSG_TYPE;
        resetBuffer();
      }
    }
    break;
  }
}

Baril:
... Code ...

Dein Code ist meiner Meinung nach übel zu lesen. Die Mühe, das nachzuvollziehen, was Du machen möchtest und dann zu überlegen, wie Du das erreichen könntest, mache ich mir daher erst gar nicht.

Räume Deinen Code auf und mache ihn lesbar. Wenn Du etwas auskommentiert hast, dann lösche es aus dem Code und formatiere den Rest so, dass Zusammenhänge und Abläufe klar sind und man sich keine Knoten ins Hirn machen muss.

Gruß

Gregor

Hallo Gregorss,

also ich möchte den funktionierenden Code zum versenden von SMS so modifizieren, dass ich damit Emails versenden kann. Nachdem die Speicherkapazität für Standardverschlüsselungen von Email vom Arduino wohl nicht reicht wollte ich den Umweg über einen Internetprovider gehen.

Das heißt...

  1. Basiscode vom SMS versenden erlösen von den nutzlosen Sachen --> z.B. Eingabe der Rufnummer
  2. Grundeinstellungen und Abfrage Pin 7 bleibt bestehen
  3. Basiscode erweitern um Verbindung zu Email-Server herstellen zu können
  4. Nachricht versenden über Internetanbieter

Kann man den Code so jetzt lesen?

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino für serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pin´s
char msg;
int inPin = 7;              // Input pin für Arduino
int reading;               // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs


// folgende Variablen müssen vom Typo unsigned long sein da millis() disen Variablentyp liefert.

unsigned long time = 0;         // letzter Zeitwert bei dem der Ausgangzustand wechselte.
unsigned long debounce = 200;   // Entprellzeit


void setup()//Grundeinstellungen der Ein- und Ausgangskanäle definiert
{
 pinMode(inPin, INPUT);

  mySerial.begin(9600);   // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom GSM Module  
  Serial.begin(9600);    // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom Arduino
  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Signal von CNC:");
  Serial.println("LOW : to send message");
  Serial.println();
  delay(100);
}

void loop()//Status Abfrage
{
 reading = digitalRead(inPin);
                   // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
 if (reading == HIGH && previous == LOW && millis() - time > debounce) {
   time = millis(); 
   Serial.println("Sende SMS");
   SendMessage();    //Nachricht senden
   }
                   // Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
 if (reading == LOW && previous == HIGH && millis() - time > debounce) {
   time = millis();    
   }
 previous = reading;
}
void SubmitHttpRequest()
{
 
  SIM900.println("AT+CSQ"); // Signal überprüfen

  delay(100);
 
  ShowSerialData();// Anzeige vom GSM für http request  
  SIM900.println("AT+CGATT?"); //Verbindung zu GPRS
  delay(100);
 
  ShowSerialData();
  SIM900.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//Einstellung SAPBR nach GPRS
  delay(1000);
 
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=3,1,\"APN\",\"K-Modul\"");//
  delay(4000);
 
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=1,1");//Einstellung the SAPBR
  delay(2000);
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPINIT"); //init HTTP request
 
  delay(2000); 
  ShowSerialData();
 
  SIM900.println("AT+HTTPPARA=\"URL\",\"WebsiteAccess?"");// Einstellung httppara, parameter für website eingeben auf die Zugegriffen werden soll
  delay(1000);
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPACTION=0");//Anfrage senden 
  delay(10000);//Delay Zeit für Datenübertragung ausreichend anlegen
  //while(!SIM900.available());
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPREAD");// Lesen der Daten von Website
  delay(300);
  SendMessage();
  ShowSerialData();
 
  SIM900.println("");
  delay(100);
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1");    //Setzt the GSM Module in Text Mode
  delay(1000);  // Delay von 1000 milli sekunde oder 1 sekunde
  mySerial.println("K-Modul");// Text der gesendet werden soll
  delay(100);
   mySerial.println((char)26);// ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

Grüße
Baril

Baril:
Kann man den Code so jetzt lesen?

Sehr viel besser. Ich habe das noch ein wenig umformatiert und teilweise kommentiert. Wesentliche Änderung: Auf 80 Zeichen Breite bringen, weil ich sowas am liebsten auf Papier lese. Damit Du schon mal etwas davon hast:

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino fuer
                            // serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pins
char msg;
int inPin = 7;         // Input pin für Arduino
int reading;           // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs


// folgende Variablen müssen vom Typ unsigned long sein da millis() diesen
// Variablentyp liefert.

unsigned long time = 0;       // letzter Zeitwert bei dem der Ausgangzustand 
                              // wechselte.
unsigned long debounce = 200; // Entprellzeit


void setup()
{
 pinMode(inPin, INPUT);

  mySerial.begin(9600);   // Baudrate GSM Modul
  Serial.begin(9600);     // Baudrate Arduino

  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Signal von CNC:");
  Serial.println("LOW : to send message");
  Serial.println();

  delay(100); // ?
}

void loop()//Status Abfrage
{
   reading = digitalRead(inPin);

  // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
  if ((reading == HIGH) && (previous == LOW) && (millis() - time > debounce)) {
    time = millis(); 
    Serial.println("Sende SMS");
    SendMessage();    //Nachricht senden
  }

// Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
  if (reading == LOW && previous == HIGH && millis() - time > debounce) {
    time = millis();    
  }

previous = reading;
}

void SubmitHttpRequest()
{
 
  SIM900.println("AT+CSQ"); // Signal pruefen

  delay(100);
 
  ShowSerialData(); // Anzeige vom GSM fuer http request  
  SIM900.println("AT+CGATT?"); //Verbindung zu GPRS
  delay(100); // ?
 
  ShowSerialData();
  SIM900.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//Einstellung SAPBR
                                                      // nach GPRS
  delay(1000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=3,1,\"APN\",\"K-Modul\"");
  delay(4000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=1,1"); //Einstellung SAPBR
  delay(2000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPINIT"); //init HTTP request
 
  delay(2000); //?

  ShowSerialData();
 
  SIM900.println("AT+HTTPPARA=\"URL\",\"WebsiteAccess?\""); // Einstellung http-
                                                          // para, Parameter f.
                                                         // website eingeben,
                                                        // auf die Zugegriffen
                                                       // werden soll
  delay(1000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPACTION=0"); //Anfrage senden 
  delay(10000); //Delay Zeit für Datenübertragung ausreichend anlegen
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPREAD");// Lesen der Daten von Website
  delay(300);
  SendMessage();
  ShowSerialData();
 
  SIM900.println("");
  delay(100);
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1"); //Setzt GSM Module in Textmodus
  delay(1000); // Delay von 1000 milli sekunde oder 1 sekunde

  mySerial.println("K-Modul"); // Text der gesendet werden soll
  delay(100);

  mySerial.println((char)26); // ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

Gruß

Gregor

Nachtrag:
Vorweg: Ich kenne die SoftwareSerial-Bibliothek noch nicht, aber ich werde sie bald ziemlich gut kennen müssen.
Was mir auffällt: SIM900 wird nirgendwo angelegt. Ist das ein Ding, das von der Bibliothek zur Verfügung gestellt wird? Ebenso vermisse ich die Definition von ShowSerialData(). Gilt hierfür das Gleiche?
Hoffnungsvoll stimmt mich immerhin, dass es wohl möglich ist, direkt mit einem Server zu kommunizieren. Wenn Du einen E-Mail-Account hast, von dem aus Du senden kannst, ist das Versenden einer E-Mail nicht allzu schwierig. Es ist halt notwendig, eine „Telnet-Session“ mit einem Server herstellen zu können. Dann kannst Du dem Server quasi per „Text-hin-und-her“ sagen, dass er eine E-Mail zu versenden hat. Wenn ich nur grad das richtige RFC zur Hand hätte ...

Ok danke ich werde da in Zukunft darauf achten!

Ja genau das SIM900 uns Serial.data wird von der Bib zur Verfügung gestellt.
Also könnte ich eigentlich meine Gmailadresse verwenden und einen Port freigeben auf den zugegriffen werden kann und dann darüber eine Email versenden. Oder brauche ich dazu einen speziellen Provider der seine Programme freigibt und es erlaubt über Fremden Zugriff zu arbeiten?
Das heißt aber der Code ist schon einmal nicht so schlecht oder?

Baril:
Also könnte ich eigentlich meine Gmailadresse verwenden und einen Port freigeben auf den zugegriffen werden kann und dann darüber eine Email versenden. Oder brauche ich dazu einen speziellen Provider der seine Programme freigibt und es erlaubt über Fremden Zugriff zu arbeiten?

Jein, d. h. ich bin mir grad nicht mehr so sicher, ob das problemlos geht, weil ich zu Test- und Demozwecken gerade eine entsprechende Session zu meinem Provider anstellen wollte. Der Zugriffsversuch per telnet hat jedoch nur ein „Request timed out“ ergeben.
Ein Workaround könnte sein, eine Webmail-Session zu simulieren, aber das wird evtl. ein blödes Gefummel.

Baril:
Das heißt aber der Code ist schon einmal nicht so schlecht oder?

Naja, ich kann zumindest alles auf eine A4-Seite drucken (jetzt, wo ich es auf 80 Zeichen Breite gebracht habe :-). Weitergehende Code-Kritik lasse ich lieber bleiben.

Gruß

Gregor

Nachtrag: Manchmal ist es doch ganz gut, wenn man denken kann. Was Du tun möchtest, geht wohl nicht direkt, weil es eben das Verschlüsselungsproblem gibt. Abhilfe wäre möglicherweise, wenn Du selbst einen Server einrichtest, der unverschüsselte Kommunikation via SMTP (Simple Mail Transfer Protocol, Port 25) ermöglicht und der seinerseits verschlüsselt an den Provider weiterreicht. Ob und wie das mit aktuellen Systemen geht, weiß ich nicht. Ich konnte mich mit derlei Zeug eine Zeit lang nicht beschäftigen und habe mein Wissen seither nicht gerade auf dem Laufenden gehalten. Hm ...

Hmmm ja gut und jetzt irgend eine Idee wie das Problem zu lösen ist?

Soll ich einen speziellen Provider (HOST) benutzen der das Versenden von Mails zulässt?

Kennt jemand einen Anbieter der sowas zulässt.

Grüße
BAril

Baril:
Hmmm ja gut und jetzt irgend eine Idee wie das Problem zu lösen ist?

Hattest Du den Link in der ersten Antwort (von Theseus) geshen?

Gruß

Gregor

Ja habe ich gesehen konnte ich aber nicht ganz nachvollziehen. Habe aber darauf hin mein Programm geschrieben und dachte ich mach dort genau das gleiche...

Habe jetzt nochmal ein bisschen drüber nachgedacht über eine Lösung und was haltet ihr davon...

Ich richte bei meiner Fritzbox einen Email-Server ein der unverschlüsselte Nachrichten empfängt und diese dann verschlüsselt weiterleitet.

Ist sowas möglich oder denke ich da grad falsch?

Somit könnte ich den Programmcode so stehen lassen und müsste nur die Fritzbox zwischen schalten und die Sache sollte funktionieren oder?

Baril:
Ich richte bei meiner Fritzbox einen Email-Server ein der unverschlüsselte Nachrichten empfängt und diese dann verschlüsselt weiterleitet.
Ist sowas möglich oder denke ich da grad falsch?

Wenn Deine Fritzbox das kann, ist das wohl die beste Lösung. Dass eine Fritzbox einen E-Mail-Server mimen kann, halte ich aber für sehr unwahrscheinlich.

Nochmal zurück zum Anfang: Du kannst die Info, auf die es ankommt, ja per SMS versenden. Problem ist, dass es jedoch nicht per E-Mail klappt. Wieso ist es so wichtig (ist es das denn wirklich?), dass das per E-Mail klappen soll?

Gruß

Gregor

gregorss:
Wenn Deine Fritzbox das kann, ist das wohl die beste Lösung. Dass eine Fritzbox einen E-Mail-Server mimen kann, halte ich aber für sehr unwahrscheinlich.

Ich auch.

Hinzu kommt noch, dass andere Mailserver Mails von dynamischen IP-Adressen fast ausschließlich als Spam betrachten und weg werfen.
Der Mailserver des Providers wird wohl auch nicht von einem anderen Mailserver aus seinem Netz Mails annehmen, weil er dann Gefahr läuft, selbst als Spamschleuder auf die schwarzen Listen zu geraten.

Wenn Du also einen Mailprovider findest, der unverschlüsselt Mails von Dir annimmt oder eine feste IP hast kann es funktionieren, sonst wohl nicht.

Gruß Tommy

Edit: Dazu kommt dann bei einem eigenen Mailserver noch das Problem mit dem MX-DNS-Record.

Tommy56:
Edit: Dazu kommt dann bei einem eigenen Mailserver noch das Problem mit dem MX-DNS-Record.

Das Problem sehe ich nicht. Der MX-Record ist ja nur nötig, wenn der Fritzbox-Server auch E-Mails von außerhalb empfangen können soll.

Wenn für den E-Mail-Empfang bereits ein Account beim Provider existiert, kann man ja den benutzen.

Gruß

Gregor

Ok, hast Recht. Er will ja nur senden.
Wobei viele Webserver heute schon eine reverse MX-Prüfung zur Spamabwehr/Absenderverifikation fahren.

Gruß Tommy

Hallo,

ohne das Angebot genau geprüft zu haben, ist https://www.smart-mail.de/ ein kostenloser Email-Provider, der auch Mailversand ohne SSL/TLS zulässt.

Es lohnt sich auch mal die alten Accounts durchzugehen. Mein Internetprovider, den ich vor fast 20J. noch vor Compuserve und AOL benutzte, hat laut Webseite auch unverschlüsselten Mailversand. Mich kennt er noch. Den kostenlosen und werbefreien Webspace nutze ich noch immer.

Gruß
Theseus

Hallo und danke für die zahlreichen Antworten,

ich werde es nun über die Smart-Mail-Provider probieren. Aber mir ist gerade aufgefallen das mein Code dazu garnicht ausreicht und der Login in die zu dem Server fehlt. Wie müsste ich den Code erweitern damit das dann auch funktioniert?

Im Moment habe ich ja nur den Request ohne Login und Email Versand drinnen...

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino fuer
                            // serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pins
char msg;
int inPin = 7;         // Input pin für Arduino
int reading;           // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs


// folgende Variablen müssen vom Typ unsigned long sein da millis() diesen
// Variablentyp liefert.

unsigned long time = 0;       // letzter Zeitwert bei dem der Ausgangzustand 
                              // wechselte.
unsigned long debounce = 200; // Entprellzeit


void setup()
{
 pinMode(inPin, INPUT);

  mySerial.begin(9600);   // Baudrate GSM Modul
  Serial.begin(9600);     // Baudrate Arduino

  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Signal von CNC:");
  Serial.println("LOW : to send message");
  Serial.println();

  delay(100); // ?
}

void loop()//Status Abfrage
{
   reading = digitalRead(inPin);

  // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
  if ((reading == HIGH) && (previous == LOW) && (millis() - time > debounce)) {
    time = millis(); 
    Serial.println("Sende SMS");
    SendMessage();    //Nachricht senden
  }

// Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
  if (reading == LOW && previous == HIGH && millis() - time > debounce) {
    time = millis();    
  }

previous = reading;
}

void SubmitHttpRequest()
{
 
  SIM900.println("AT+CSQ"); // Signal pruefen

  delay(100);
 
  ShowSerialData(); // Anzeige vom GSM fuer http request  
  SIM900.println("AT+CGATT?"); //Verbindung zu GPRS
  delay(100); // ?
 
  ShowSerialData();
  SIM900.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//Einstellung SAPBR
                                                      // nach GPRS
  delay(1000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=3,1,\"APN\",\"K-Modul\"");
  delay(4000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=1,1"); //Einstellung SAPBR
  delay(2000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPINIT"); //init HTTP request
 
  delay(2000); //?

  ShowSerialData();
 
  SIM900.println("AT+HTTPPARA=\"URL\",\"WebsiteAccess?\""); // Einstellung http-
                                                          // para, Parameter f.
                                                         // website eingeben,
                                                        // auf die Zugegriffen
                                                       // werden soll
  delay(1000); // ?
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPACTION=0"); //Anfrage senden 
  delay(10000); //Delay Zeit für Datenübertragung ausreichend anlegen
 
  ShowSerialData();
 
  SIM900.println("AT+HTTPREAD");// Lesen der Daten von Website
  delay(300);
  SendMessage();
  ShowSerialData();
 
  SIM900.println("");
  delay(100);
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1"); //Setzt GSM Module in Textmodus
  delay(1000); // Delay von 1000 milli sekunde oder 1 sekunde

  mySerial.println("K-Modul"); // Text der gesendet werden soll
  delay(100);

  mySerial.println((char)26); // ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

Die Anleitung mit Command-Fenster kann ich nicht ganz nachvollziehen und wie das dann im Arduino-Code ausschauen soll

Grüße
Baril

Probiers mal damit:

Das is für gerade für solche IoT Sachen entwickelt worden.

Da hast du den Vorteil dass alles über PHP Request abläuft

Edit:
Wenn du unter api schaust findest du sogar Code für den Arduino

Allerdings nicht für GSM sondern Ethernet
aber man kann ma gucken wie es funktioniert.

Edit2:
Ich seh grad darüber lassen sich offensichtlich doch keine Mails versenden sondern nur Notifications.

Sry mein Fehler :S

Edit3:
Laut Beschreibung auf Startseite geht`s doch.