Beantwoord

Arduino@mail@gas standen


Even ter inleiding: Ik ben van KPN overgegaan naar T-Mobile thuis. 

Ik heb een Arduino board met het programma Solarmeter en hiermee lees ik mijn slimme meter uit voor elektra en gas. Tevens meet ik mijn waterstand en wat mijn brutoproductiemeter van de zonnepanelen opleveren. De Arduino stuurt elke avond om 22:00 uur een mailtje naar mij met de data van die dag via poort 25. Ook word er data van de gas stand naar mindergas.nl gestuurd dit gaat via poort 80 en zou altijd moeten werken. Dit ging altijd probleemloos totdat ik naar een andere internet provider ging. Ik heb in de config wel smtp.t-mobilethuis.nl staan ipv. smtp.kpn.nl.

Mijn NAS en RasPi3 versturen ook mail dat wel goed gaat maar dat gaat via poort 587 met TLS met inlognaam en wachtwoord van gmail. Solarmeter gebruikt voor mail poort 25 zonder inlognaam en wachtwoord.

Ik heb het modem-router de firewall op low gezet en zelf uit maar zonder succes.Iemand een idee?

icon

Beste antwoord door Pieter_B 8 July 2020, 19:27

Bekijk origineel

16 reacties

Reputatie 7
Badge +3

Hallo @master64nl 

Op de github pagina zie ik dat er een file is “Mail.io” waarin staat opgeslagen via welke poort de app moet mailen.

Hier staat ‘hardcoded’ poort 25 opgegeven, deze zou je natuurlijk kunnen wijzigen.

Maar het probleem waar je dan tegenaan gaat lopen is, dat de CLASS ‘mailClient’ en functie ‘connect’ niet zijn geschreven om een username en password mee te sturen. 

Dus dus omzetten van de poort is 1, maar de CLASS herschrijven dat je dus ook een user/paswoord mee kunt sturen is een ander verhaal. Plus dat je dan ‘hardcoded’ toegang gegevens in het bestand opneemt .. wat gewoon volgens de codingrule .. NOT DONE EVER .. tenzijn deze gegeven extern buiten de server omgeving staan weggeschreven. 

 

Even nog iets over poort 25, deze is een paradijs poort voor spammers en is steeds vaker geblokkeerd door ISP’s

 

Weet niet of je het probleem recent pas hebt, of is het echt pas begonnen toen je overgestapt bent?

Een paar dagen terug is er bij Gmail wel iets gebeurd, want ik kon plotseling niet meer mijn mail ophalen. De oorzaak was dat Google heeft besloten om mijn Thunderbird mail programma als een UNTRUSTED app te markeren. Door aan te geven dat je wilt blijven werken met deze app, moest ik een setting daarvoor aanzetten.

Hi Pieter,

Fijn dat je er meteen diep ingedoken bent en het programma Solarmeter gevonden hebt. Ik ben ook bezig met de maker van Solarmeter Harold en op het Arduino forum Nederland en met mindergas.nl, dus ben er druk mee. Dat herschrijven word hem niet, voor mij tenminste.

Ik heb het sinds ik overgestapt ben en dat is recent 30-06-2020.

Reputatie 7
Badge +3

@master64nl 

Als ik een telnet test doe naar de SMTP server van TM, krijg ik een 220 terug, wat betekent dat de server gereed staat.

 

Dus de mailserver is wel degelijk toegankelijk op poort 25 vanuit mijn locatie, alleen kan ik niet zeggen of hij daarna de fout in zou gaan met data uit die betreffende applicatie.

Dit krijg ik op het Arduino forum te horen;

De email komt niet aan vanwege: BAD HEADER SECTION, MISSING_DATE, MISSING_FROM, MISSING_MID, MISSING_SUBJECT.

Reputatie 7
Badge +3

@master64nl

Net even een testmail via Telent gestuurd, maar hij bounced due to no FROM data

 

De mailserver verwerk het dus zeker wel goed, maar Gmail, in dit geval, is de bottleneck.

Wel raar, want de FROM is wel degelijk geaccepteerd door TM mailserver (mail from: = resultcode 250)

Reputatie 7
Badge +3

@master64nl

Nou, ik heb het werkend met alle benodigde regels die voldoen aan de RFC 5322 

 

Dat was weer een leuke oefening :sunglasses:

 

//KNIP ///

mailClient << F("RCPT TO:" MAIL_TO) << endl; // identify recipient
if(CheckResponse())
{
mailClient << F("DATA") << endl;
if(CheckResponse())
{

NIEUWE REGEL EVENTUEEL >>>>> mailClient << F("FROM:" MAIL_FROM) << endl; // identify sender

mailClient << F("Subject:SolarMeter ") << day() << endl; // insert subject
mailClient << F("Content-type: text/html;") << endl << endl;

ShowStatus(mailClient);

mailClient << endl << F(".") << endl; // end of mail

if(CheckResponse())
{
mailClient << F("QUIT") << endl; // terminate connection
}



//KNIP//

 

Whow wat goed zeg! Wat en waar moet ik de code veranderen? In tab mail van Solarmeter?

Dit staat er bij mij:

#ifdef USE_MAIL
EthernetClient mailClient;

void SendMail()
{
if(mailClient.connect(MAIL_SERVER,25))
{
if(CheckResponse())
{
mailClient << F("HELO Arduino") << endl; // say hello
if(CheckResponse())
{
mailClient << F("MAIL FROM:" MAIL_FROM) << endl; // identify sender
if(CheckResponse())
{
mailClient << F("RCPT TO:" MAIL_TO) << endl; // identify recipient
if(CheckResponse())
{
mailClient << F("DATA") << endl;
if(CheckResponse())
{
mailClient << F("Subject:SolarMeter ") << day() << endl; // insert subject
mailClient << F("Content-type: text/html;") << endl << endl;

ShowStatus(mailClient);

mailClient << endl << F(".") << endl; // end of mail

if(CheckResponse())
{
mailClient << F("QUIT") << endl; // terminate connection
}
}
}
}
}
}
mailClient.stop();
}
}

boolean CheckResponse()
{
return mailClient.find((char*)"\n");

// long timer = millis();
// while(millis() - timer < 5000)
// {
// if(mailClient.available())
// {
// char c = mailClient.read();
// if(c=='\n') return true;
// }
// }
// return false;
}


#endif

 

In de userdefs.h staat dit:

// Mail variables. Uncomment the next line and a mail will be sent once a day
#define USE_MAIL
#define MAIL_TIME 22 // The default time to mail is 23:30 h
#define MAIL_TO "XXXXXX@gmail.com" // fill in the destination mail address
#define MAIL_FROM "XXXXXXX@t-mobilethuis.nl" // any valid mail address will do here
#define MAIL_SERVER "smtp.t-mobilethuis.nl" // use the server address of your own provider

 

Reputatie 7
Badge +3

@master64nl

Ik ben niet de schrijver van deze applicatie, maar je zou kunnen proberen het file Mail.ino aan te passen met boven de Subject invoeg regel de volgende regel op te nemen:

mailClient << F("FROM:" MAIL_FROM) << endl;

Dis is in ieder geval waar de Gmail mailserver problemen mee heeft als je hem via Telnet mail wil laten ontvangen vanuit het TMT mailserver.

 

Hieronder mijn idee hoe het Mail.ino file zou kunnen werken.

#ifdef USE_MAIL
EthernetClient mailClient;

void SendMail()
{
if(mailClient.connect(MAIL_SERVER,25))
{
if(CheckResponse())
{
mailClient << F("HELO Arduino") << endl; // say hello
if(CheckResponse())
{
mailClient << F("MAIL FROM:" MAIL_FROM) << endl; // identify sender
if(CheckResponse())
{
mailClient << F("RCPT TO:" MAIL_TO) << endl; // identify recipient
if(CheckResponse())
{
mailClient << F("DATA") << endl;
if(CheckResponse())
{
// Toegevoegde regel FROM i.v.m. Gmail mail server rejection
mailClient << F("FROM:" MAIL_FROM) << endl;

mailClient << F("Subject:SolarMeter ") << day() << endl; // insert subject
mailClient << F("Content-type: text/html;") << endl << endl;

ShowStatus(mailClient);

mailClient << endl << F(".") << endl; // end of mail

if(CheckResponse())
{
mailClient << F("QUIT") << endl; // terminate connection
}
}
}
}
}
}
mailClient.stop();
}
}

boolean CheckResponse()
{
return mailClient.find((char*)"\n");

// long timer = millis();
// while(millis() - timer < 5000)
// {
// if(mailClient.available())
// {
// char c = mailClient.read();
// if(c=='\n') return true;
// }
// }
// return false;
}


#endif

Maak een copie van je huidige Mail.ino naar bijv. Mail_old.io en maak een nieuw file met de naam Mail.ino aan, om vervolgens bovenstaande code er in te plakken.

Succes 

Reputatie 7
Badge +3

In de userdefs.h staat dit:

 // Mail variables. Uncomment the next line and a mail will be sent once a day
#define USE_MAIL
#define MAIL_TIME 22 // The default time to mail is 23:30 h
#define MAIL_TO "XXXXXX@gmail.com" // fill in the destination mail address
#define MAIL_FROM "XXXXXXX@t-mobilethuis.nl" // any valid mail address will do here
#define MAIL_SERVER "smtp.t-mobilethuis.nl" // use the server address of your own provider

 

Neem aan dat de XXXXX bedoeld zijn om de werkelijk ingevulde naam te verbergen?

De Mail.ino zal dit userdefs.h gebruiken om de verwijzingen in dat file te gebruiken, dus als dat correct is ingevuld met je eigen mail adressen van Gmail en TMT .. zou het goed moeten komen.

Maar wat ik al zeg, ik ben niet de schrijver van deze app, dus ben ik nu een beetje aan het reverse engineren. De schrijver weet precies wat alles voorstelt, maar op Github zie ik dat het project al min of meer 3 jaar geen onderhoud heeft gehad.

Ik heb de sketch er net in gezet. Ben benieuwd vanavond om 22:00 uur. Spannend :scream:

Ik moet eerlijkheidshalve zeggen dat ze op het KPN forum niet zulke handige Harry`s (Pieter) hadden.

Als het werkt ben ik super blij want ondertussen heb ik mindergas ook aan de praat. Ook daar moest een kleine verandering in de code.

sprintf(dataString,"{\"date\":\"%04d-%02d-%02d\",\"reading_l\":\"%ld\"}", year(t),month(t),day(t),MG_SENSOR.Midnight);

                // send headers

                mgClient << F("POST /you_less/gas_meter_readings?auth_token=" MG_KEY " HTTP/1.1") << endl;

                mgClient << F("Host: mindergas.nl") << endl;

                mgClient << F("User-Agent: Arduino") << endl;

                mgClient << F("Content-Type: application/json") << endl;

                mgClient << F("Accept: application/json") << endl;

                mgClient << F("Content-Length: ") << strlen(dataString) << endl << endl;

                // send the data

                mgClient << dataString << endl;

 

Indien je hierin 'you_less' aanpast in 'api' dan zal het weer werken.

 

Dus:

 

mgClient << F("POST /api/gas_meter_readings?auth_token=" MG_KEY " HTTP/1.1") << endl;

 

Alvast heel veel bedankt voor het uitzoeken :relaxed:

In de userdefs.h staat dit:

     // Mail variables. Uncomment the next line and a mail will be sent once a day
#define USE_MAIL
#define MAIL_TIME 22 // The default time to mail is 23:30 h
#define MAIL_TO "XXXXXX@gmail.com" // fill in the destination mail address
#define MAIL_FROM "XXXXXXX@t-mobilethuis.nl" // any valid mail address will do here
#define MAIL_SERVER "smtp.t-mobilethuis.nl" // use the server address of your own provider

 

Neem aan dat de XXXXX bedoeld zijn om de werkelijk ingevulde naam te verbergen? Ja!

De Mail.ino zal dit userdefs.h gebruiken om de verwijzingen in dat file te gebruiken, dus als dat correct is ingevuld met je eigen mail adressen van Gmail en TMT .. zou het goed moeten komen.

Maar wat ik al zeg, ik ben niet de schrijver van deze app, dus ben ik nu een beetje aan het reverse engineren. De schrijver weet precies wat alles voorstelt, maar op Github zie ik dat het project al min of meer 3 jaar geen onderhoud heeft gehad.

Volgens mij kun je dit in github opgeven dat je een verbetering hebt. Hier zullen anderen ook blij mee zijn.

Reputatie 7
Badge +3

Ik heb de sketch er net in gezet. Ben benieuwd vanavond om 22:00 uur. Spannend :scream:

Ik moet eerlijkheidshalve zeggen dat ze op het KPN forum niet zulke handige Harry`s (Pieter) hadden.

Als het werkt ben ik super blij want ondertussen heb ik mindergas ook aan de praat. Ook daar moest een kleine verandering in de code.

sprintf(dataString,"{\"date\":\"%04d-%02d-%02d\",\"reading_l\":\"%ld\"}", year(t),month(t),day(t),MG_SENSOR.Midnight);

                // send headers

                mgClient << F("POST /you_less/gas_meter_readings?auth_token=" MG_KEY " HTTP/1.1") << endl;

                mgClient << F("Host: mindergas.nl") << endl;

                mgClient << F("User-Agent: Arduino") << endl;

                mgClient << F("Content-Type: application/json") << endl;

                mgClient << F("Accept: application/json") << endl;

                mgClient << F("Content-Length: ") << strlen(dataString) << endl << endl;

                // send the data

                mgClient << dataString << endl;

 

Indien je hierin 'you_less' aanpast in 'api' dan zal het weer werken.

 

Dus:

 

mgClient << F("POST /api/gas_meter_readings?auth_token=" MG_KEY " HTTP/1.1") << endl;

 

Alvast heel veel bedankt voor het uitzoeken :relaxed:

Ik hou wel van een uitdaging op netwerk gebied, was ook al een tijdje geleden dat er weer eens een echte uitdaging voorbij kwam.

Even wachten dus tot 22.00 .. je zou ook de tijd even tijdelijk aan kunnen passen om te testen .. zit je minder lang in spanning :joy:

Dat van minderrgas is dus een wijziging in het PATH .. dat heeft mindergas dus zelf gedaan op hun server. Zo kun je hele volksstammen  op het verkeerde been zetten als je dat soort details niet deelt met je klanten.

Het werkt! Fantastisch! Mail kwam gisteren even na 22:00 uur binnen. Je hebt het opgelost! Je bent de beste, Pieter!

Reputatie 7
Badge +3

@master64nl 

Als mede klant help ik graag om te zoeken naar een oplossing, ben daarom ook blij dat alles weer als een zonnetje werkt.

 

Succes, Pieter

Dus in beiden gevallen lag het niet aan T-Mobile overgang.

Reageer