Inviare email con allegati (v2.x): Arduino SAMD boards (WiFiNINA) – 3
Vado ad introdurre la versione 2 della mia libreria EMailSender, una grande evoluzione rispetto alla versione 1, con supporto per Arduino con dispositivi ethernet w5100, w5200 e w5500 e dispositivi clone enc28J60, supporto per esp32 ed esp8266 ed infine (dalla versione 2.2.0) supporto per tutti i dispositivi Arduino (SAMD) che utilizzano la libreria WiFiNINA (Arduino UNO WiFi Rev.2, Arduino NANO 33 IoT, Arduino MKR 1010 and Arduino MKR VIDOR 4000 WiFi ecc.).
Ora puoi anche aggiungere allegati , caricati da un dispositivo di archiviazione come SD o SPIFFS.
Puoi fare riferimento alla versione 1 in questo articolo Invia email con esp8266 e Arduino
Introduzione
Un metodo semplice per notificare un problema è utilizzare la posta elettronica, quindi ho creato una libreria per farlo.
Questa libreria utilizza il protocollo SMTP:
Simple Mail Transfer Protocol (SMTP) è un protocollo standard per la trasmissione di email. Inizialmente proposto nella RFC 778 nel 1981, poi aggiornato con RFC 821 nel 1982 ed ulteriormente modificato nel 2008 con l’introduzione di extended SMTP (RFC 1869 e RFC 5321), che è il protocollo attualmente in uso.
Anche se i server di posta elettronica utilizzano SMTP per inviare e ricevere mail, i client mail a livello utente utilizzano SMTP solo per inviare il messaggio al server mail, il quale si occupa dell’invio del messaggio stesso. Per recuperare i messaggi, le applicazioni client usano solitamente protocolli come IMAP o POP3.
La comunicazione tra i server mail utilizza il protocollo TCP sulla porta 25. I client mail, tuttavia, spesso inviano le mail in uscita al server sulla porta 587. Anche se deprecata, i provider mail e alcuni produttori come Apple, permettono ancora l’uso della porta non standard 465 per questa operazione. (Cit. Wiki)
Libreria
Puoi trovare la mia libreria qui, oppure basta che cerchi EMailSender sul gestore delle librerie dell’Arduino IDE.
Per scaricare.
Clicca il bottone DOWNLOADS sull’angolo in alto a destra, e rinomina la cartella decompressa EMailSender.
Controlla che la cartella EMailSender contenga EMailSender.cpp e EMailSender.h.
Posizione la libreria EMailSender nella tua cartella /libraries/.
Potresti dover creare la sottocartella libraries se è la tua prima libreria.
Riavvia l’IDE.
Uso
Costruttore: il valore predefinito è abbastanza semplice e usa GMail come server smtp.
EMailSender emailSend("smtp.account@gmail.com", "password");
Se si desidera utilizzare un altro fornitore, è possibile utilizzare un costruttore più complesso (ma comunque semplice)
EMailSender(const char* email_login, const char* email_password, const char* email_from, const char* name_from, const char* smtp_server, uint16_t smtp_port );
EMailSender(const char* email_login, const char* email_password, const char* email_from, const char* smtp_server, uint16_t smtp_port);
EMailSender(const char* email_login, const char* email_password, const char* email_from, const char* name_from );
EMailSender(const char* email_login, const char* email_password, const char* email_from);
EMailSender(const char* email_login, const char* email_password);
email_login
: login account smtpemail_password
: password account smtpemail_from
: email del mittentename_from
: nome utente del mittentesmtp_server
: server SMTPsmtp_port
: porta SMTP
Questi parametri sono modificabili anche in realtime con questi metodi:
void setSMTPPort(uint16_t smtp_port);
void setSMTPServer(const char* smtp_server);
void setEMailLogin(const char* email_login);
void setEMailFrom(const char* email_from);
void setNameFrom(const char* name_from);
void setEMailPassword(const char* email_password);
Ora rispetto alla libreria v1.x puoi notare che il flag isSecure non esiste più
ifisSecure = false
:false
BearSSL permette una connessione insicura TLS
ma puoi continuare a gestirlo con
void setIsSecure(bool isSecure = false);
Altri parametri che è possibile impostare post costruttore sono
void setUseAuth(bool useAuth = true);
void setPublicIpDescriptor(const char *publicIpDescriptor = "mischianti");
Il primo permette di escludere l’handshake di autenticazione, il secondo modifica l’identificazione del messaggio HELO.
Aggiornamento: 02/01/2021 (v2.1.5)
Altre due configurazioni aggiuntive sono
void setEHLOCommand(bool useEHLO = false)
void setSASLLogin(bool isSASLLogin = false)
Il primo comando modifica HELO in EHLO, è necessario per i server SMTP Postfix.
Il secondo attiva la login SASL, quindi il login e la password vengono inviati tutti in una unica riga.
È necessario connettersi a ad internet :P.
Esempio di base con GMail smtp
In fondo all’articolo trovi come configurare GMail.
Ricordati di aggiungere ai domini google.com:433
.
Devo pubblicare un articolo a riguardo, ma per ora devi caricarlo così
File –> Examples –> WiFiNINA –> Tools –> FirmwareUpdater
poi clicca su WiFiNINA firmware updater
Seleziona la porta COM corretta.
Aggiungi google.com alla lista dei domini (Add domain).
E clicca su Upload Certificates to WiFi module
.
Crea un messaggio con la struttura EMailMessage
EMailSender::EMailMessage message;
message.subject = "Subject";
message.message = "Hi, How are you<br>Fine.";
Invia messaggio:
EMailSender::Response resp = emailSend.send("account_to_send@gmail.com", message);
Quindi controlla la risposta:
Serial.println("Sending status: ");
Serial.println(resp.code);
Serial.println(resp.desc);
Serial.println(resp.status);
Esempio di output:
Connection: ESTABLISHED
Got IP address: 192.168.1.104
Sending status:
1
0
Message sent!
Puoi inviare a un elenco di email e selezionare un CC o CCn, ad esempio ecco il codice per 3 email diverse
const char* arrayOfEmail[] = {"<FIRST>@gmail.com", "<SECOND>@yahoo.com", "<THIRD>@hotmail.com"};
EMailSender::Response resp = emailSend.send(arrayOfEmail, 3, message);
oppure a 3 email, la prima come A e le ultime come CC
const char* arrayOfEmail[] = {"<FIRST>@gmail.com", "<SECOND>@yahoo.com", "<THIRD>@hotmail.com"};
EMailSender::Response resp = emailSend.send(arrayOfEmail, 1, 2, message);
o il primo come A, il secondo come CC e il terzo come CCn
const char* arrayOfEmail[] = {"<FIRST>@gmail.com", "<SECOND>@yahoo.com", "<THIRD>@hotmail.com"};
EMailSender::Response resp = emailSend.send(arrayOfEmail, 1,1,1, message);
Arduino MKR WiFi 1010 (Libreria WiFiNINA)
Questo è un dispositivo fantastico con documentazione e supporto eccellenti, è disponibile in vari store.
Puoi trovarlo qui Amazon Arduino MKR WiFi 1010
Inviare una semplice email
Ecco un semplice esempio di come inviare una EMail con GMail come provider SMTP.
/*
* EMailSender library for Arduino, Arduino SAMD boards (WiFiNINA), esp8266 and esp32
* Simple Arduino SAMD boards (WiFiNINA) Gmail send
*
* https://mischianti.org/category/my-libraries/emailsender-send-email-with-attachments/
*
*/
#include "Arduino.h"
#include <EMailSender.h>
#include <WiFiNINA.h>
const char* ssid = "<YOUR-SSID>";
const char* password = "<YOUR-PASSWD>";
uint8_t connection_state = 0;
uint16_t reconnect_interval = 10000;
EMailSender emailSend("your.smtp.account@gmail.com", "password");
uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
static uint16_t attempt = 0;
Serial.print("Connecting to ");
if(nSSID) {
WiFi.begin(nSSID, nPassword);
Serial.println(nSSID);
}
uint8_t i = 0;
while(WiFi.status()!= WL_CONNECTED && i++ < 50)
{
delay(200);
Serial.print(".");
}
++attempt;
Serial.println("");
if(i == 51) {
Serial.print("Connection: TIMEOUT on attempt: ");
Serial.println(attempt);
if(attempt % 2 == 0)
Serial.println("Check if access point available or SSID and Password\r\n");
return false;
}
Serial.println("Connection: ESTABLISHED");
Serial.print("Got IP address: ");
Serial.println(WiFi.localIP());
return true;
}
void Awaits()
{
uint32_t ts = millis();
while(!connection_state)
{
delay(50);
if(millis() > (ts + reconnect_interval) && !connection_state){
connection_state = WiFiConnect();
ts = millis();
}
}
}
void setup()
{
Serial.begin(115200);
connection_state = WiFiConnect(ssid, password);
if(!connection_state) // if not connected to WIFI
Awaits(); // constantly trying to connect
EMailSender::EMailMessage message;
message.subject = "Soggetto";
message.message = "Ciao come stai<br>io bene.<br>www.mischianti.org";
EMailSender::Response resp = emailSend.send("account_to_send@gmail.com", message);
Serial.println("Sending status: ");
Serial.println(resp.status);
Serial.println(resp.code);
Serial.println(resp.desc);
}
void loop()
{
}
Inviare una EMail con allegati
L’Arduino MKR WiFi 1010 non ha una flash interna, così come per i suoi fratelli minori, dobbiamo andare a collegare una scheda SD per il salvataggio degli allegati da inviare.
Qui lo schema di connessione utilizzando un comune adattatore, se vuoi approfondire l’argomento puoi fare riferimento a quest’articolo “Come usare la scheda SD con esp8266 e Arduino“.
Il core del codice è la generazione della struttura per caricare e trasmettere i file.
EMailSender::FileDescriptior fileDescriptor[2];
fileDescriptor[1].filename = F("test.txt");
fileDescriptor[1].url = F("/test.txt");
fileDescriptor[1].storageType = EMailSender::EMAIL_STORAGE_TYPE_SD;
fileDescriptor[0].filename = F("logo.jpg");
fileDescriptor[0].url = F("/logo.jpg");
fileDescriptor[0].mime = "image/jpg";
fileDescriptor[0].encode64 = true;
fileDescriptor[0].storageType = EMailSender::EMAIL_STORAGE_TYPE_SD;
EMailSender::Attachments attachs = {2, fileDescriptor};
EMailSender::Response resp = emailSend.send("<receipe@gmail.com>", message, attachs);
I campi EMailSender::FileDescriptior
sono abbastanza comprensibili, ma presta attenzione a encode64
che specifica se vuoi codificare l’allegato, questo è utile se ci sono alcuni caratteri speciali non supportati.
Per le immagini se non specifichi encode64 probabilmente arrivano artefatte.
Ma attenzione, la codifica di file di grandi dimensioni richiede un po ‘di tempo, ma molto meno rispetto ad un esp8266 o esp32.
Il campo mime specifica il tipo mime del file che si desidera allegare. Ecco alcuni esempi di tipi MIME esistenti.
Poi dovrai specificare lo storageType
, in genere SD e SPIFFS, per Arduino solo SD.
filename
e url
il nome del file è il nome che appare al destinatario, l’URL è dove si trova il file nell’FS selezionato.
Poi in EMailSender::Attachments
è necessario specificare il numero di allegati e impostare l’array del EMailSender::FileDescriptior
.
Il codice risultante è questo
/*
* EMailSender library for Arduino, Arduino SAMD boards (WiFiNINA), esp8266 and esp32
* Simple Arduino SAMD boards (WiFiNINA) Gmail send attachments
* to a single email
*
* The base64 encoding of the image is slow, so be patient
*
* https://mischianti.org/category/my-libraries/emailsender-send-email-with-attachments/
*
*/
#include "Arduino.h"
#include <EMailSender.h>
#include <WiFiNINA.h>
uint8_t connection_state = 0;
uint16_t reconnect_interval = 10000;
const char* ssid = "<YOUR_SSID>";
const char* password = "<YOUR_PASSWD>";
EMailSender emailSend("<smtp_account@gmail.com>", "<PASSWORD>");
uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
static uint16_t attempt = 0;
Serial.print("Connecting to ");
if(nSSID) {
WiFi.begin(nSSID, nPassword);
Serial.println(nSSID);
}
uint8_t i = 0;
while(WiFi.status()!= WL_CONNECTED && i++ < 50)
{
delay(200);
Serial.print(".");
}
++attempt;
Serial.println("");
if(i == 51) {
Serial.print("Connection: TIMEOUT on attempt: ");
Serial.println(attempt);
if(attempt % 2 == 0)
Serial.println("Check if access point available or SSID and Password\r\n");
return false;
}
Serial.println("Connection: ESTABLISHED");
Serial.print("Got IP address: ");
Serial.println(WiFi.localIP());
return true;
}
void Awaits()
{
uint32_t ts = millis();
while(!connection_state)
{
delay(50);
if(millis() > (ts + reconnect_interval) && !connection_state){
connection_state = WiFiConnect();
ts = millis();
}
}
}
void setup()
{
Serial.begin(115200);
connection_state = WiFiConnect(ssid, password);
if(!connection_state) // if not connected to WIFI
Awaits(); // constantly trying to connect
EMailSender::EMailMessage message;
message.subject = "Soggetto";
message.message = "Ciao come stai<br>io bene.<br>www.mischianti.org";
EMailSender::FileDescriptior fileDescriptor[2];
fileDescriptor[1].filename = F("test.txt");
fileDescriptor[1].url = F("/test.txt");
fileDescriptor[0].filename = F("logo.jpg");
fileDescriptor[0].url = F("/logo.jpg");
fileDescriptor[0].mime = "image/jpg";
fileDescriptor[0].encode64 = true;
EMailSender::Attachments attachs = {2, fileDescriptor};
EMailSender::Response resp = emailSend.send("<receipe@gmail.com>", message, attachs);
Serial.println("Sending status: ");
Serial.println(resp.status);
Serial.println(resp.code);
Serial.println(resp.desc);
}
void loop()
{
}
Qui puoi vedere il risultato dello sketch appena visto.
Inviare EMail a liste di distribuzione
Dalla versione 2.1.1 sono supportate le liste di distribuzione, quindi è possibile inviare e-mail a più account si possono inviare come A, CC o Cn.
Ecco un esempio
/*
* EMailSender library for Arduino, Arduino SAMD boards (WiFiNINA), esp8266 and esp32
* Simple Arduino SAMD boards (WiFiNINA) Gmail send
* to distribution lists
*
* https://mischianti.org/category/my-libraries/emailsender-send-email-with-attachments/
*
*/
#include "Arduino.h"
#include <EMailSender.h>
#include <WiFiNINA.h>
uint8_t connection_state = 0;
uint16_t reconnect_interval = 10000;
EMailSender emailSend("<YOUR-SMTP>", "<YOUR-SMTP-PASSWD>");
uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
static uint16_t attempt = 0;
Serial.print("Connecting to ");
if(nSSID) {
WiFi.begin(nSSID, nPassword);
Serial.println(nSSID);
}
uint8_t i = 0;
while(WiFi.status()!= WL_CONNECTED && i++ < 50)
{
delay(200);
Serial.print(".");
}
++attempt;
Serial.println("");
if(i == 51) {
Serial.print("Connection: TIMEOUT on attempt: ");
Serial.println(attempt);
if(attempt % 2 == 0)
Serial.println("Check if access point available or SSID and Password\r\n");
return false;
}
Serial.println("Connection: ESTABLISHED");
Serial.print("Got IP address: ");
Serial.println(WiFi.localIP());
return true;
}
void Awaits()
{
uint32_t ts = millis();
while(!connection_state)
{
delay(50);
if(millis() > (ts + reconnect_interval) && !connection_state){
connection_state = WiFiConnect();
ts = millis();
}
}
}
void setup()
{
Serial.begin(115200);
const char* ssid = "<YOUR-SSID>";
const char* password = "<YOUR-PASSWD>";
connection_state = WiFiConnect(ssid, password);
if(!connection_state) // if not connected to WIFI
Awaits(); // constantly trying to connect
EMailSender::EMailMessage message;
message.subject = "Soggetto";
message.message = "Ciao come stai<br>io bene.<br>www.mischianti.org";
// Send to 3 different email
const char* arrayOfEmail[] = {"<FIRST>@gmail.com", "<SECOND>@yahoo.com", "<THIRD>@hotmail.com"};
EMailSender::Response resp = emailSend.send(arrayOfEmail, 3, message);
// // Send to 3 different email, 2 in C and 1 in CC
// const char* arrayOfEmail[] = {"<FIRST>@gmail.com", "<SECOND>@yahoo.com", "<THIRD>@hotmail.com"};
// EMailSender::Response resp = emailSend.send(arrayOfEmail, 2, 1, message);
//
// // Send to 3 different email first to C second to CC and third to CCn
// const char* arrayOfEmail[] = {"<FIRST>@gmail.com", "<SECOND>@yahoo.com", "<THIRD>@hotmail.com"};
// EMailSender::Response resp = emailSend.send(arrayOfEmail, 1,1,1, message);
Serial.println("Sending status: ");
Serial.println(resp.status);
Serial.println(resp.code);
Serial.println(resp.desc);
}
void loop()
{
}
Abilita GMail
Ci sono 2 modalità per permettere l’utilizzo del server SMTP di google:
Consenti alle app meno sicure di accedere al tuo account Gmail
Google potrebbe bloccare i tentativi di accesso da alcune app o dispositivi che non utilizzano i moderni standard di sicurezza. Poiché queste app e dispositivi sono più facili da violare, il loro blocco aiuta a proteggere il tuo account.
Per disabilitare questa funzione di sicurezza:
- Accedi a Gmail
- Fai clic qui per accedere a Accesso meno sicuro all’app nel mio account.
- Accanto a “Consenti app meno sicure: OFF ”, selezionare l’interruttore per accendere su ON .
Questa impostazione potrebbe non essere disponibile per:
- Account con verifica in due passaggi abilitata: tali account richiedono una password specifica per l’applicazione per un accesso meno sicuro alle app .
- Utenti di G Suite: questa impostazione è nascosta se l’amministratore ha bloccato l’accesso all’account dell’app meno sicuro.
Per gli utenti di G-Suite: abilitazione delle app meno sicure per accedere agli account
- Accedi alla tua Console di amministrazione Google (accedi utilizzando un account amministratore , non il tuo account corrente.
- Fai clic su Sicurezza> Impostazioni di base .
- In App meno sicure , seleziona Vai a impostazioni per app meno sicure .
- Nella finestra secondaria, selezionare il pulsante di opzione Consenti agli utenti di gestire il loro accesso ad app meno sicure .
Dopo aver impostato Consenti agli utenti di gestire il loro accesso ad app meno sicure , gli utenti interessati all’interno del gruppo selezionato o Unità organizzativa saranno in grado di attivare o disattivare le app meno sicure.
Amministratori di G-Suite: imporre l’accesso ad app meno sicure per tutti gli utenti
Utilizzare questa impostazione quando si desidera che l’accesso da un’app meno sicura sia disponibile per tutti per un periodo di tempo limitato, ad esempio per gli aggiornamenti.
- Accedi alla tua Console di amministrazione Google. Accedi utilizzando un account amministratore
- Fai clic su Sicurezza> Impostazioni di base .
- In App meno sicure , seleziona Vai a impostazioni per app meno sicure .
- Nella finestra secondaria, seleziona il pulsante di opzione Imponi accesso ad app meno sicure per tutti gli utenti .
Una volta impostato Applica l’accesso ad app meno sicure per tutti gli utenti , gli utenti interessati all’interno del gruppo selezionato o Unità organizzativa non saranno in grado di disattivare l’accesso per le app meno sicure. Dovrai ripristinare le impostazioni su Consenti agli utenti di gestire il loro accesso ad app meno sicure per consentire loro di attivare o disattivare le app meno sicure.
Creare una password applicativa
- Vai alla pagina delle impostazioni di sicurezza di GMail: https://myaccount.google.com/security
- Innanzitutto è necessario abilitare l’autenticazione a 2 fattori.
- Poi è necessario creare una password per questa applicazione. La password è una stringa di 16 caratteri, copiala e usala come normale password del tuo account gmail SMTP!
Grazie
- Inviare email con allegati (libreria v2.x): Arduino Ethernet
- Inviare email con allegati (libreria v2.x): esp32 e esp8266
- Inviare email con allegati (libreria v2.x): schede Arduino SAMD (WiFiNINA)