Site icon Renzo Mischianti

Inviare email con allegati (v2.x): Arduino SAMD boards (WiFiNINA) – 3

Spread the love

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

Inviare email con allegati schede Arduino SAMD

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);

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ù

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

Arduino IDE WiFiNINA sketch aggiornamento firmware

poi clicca su WiFiNINA firmware updater

Arduino IDE menu aggiornamento firmware NINA-W101

Seleziona la porta COM corretta.

Aggiungi google.com alla lista dei domini (Add domain).

Arduino IDE WiFiNINA programma aggiornamento firmware

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

Arduino MKR WiFi 1010 connessione scheda SD EMailSender

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.

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

Send email with attachments Arduino esp8266 esp32 test with image and txt

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:

  1. Accedi a Gmail
  2. Fai clic qui per accedere a Accesso meno sicuro all’app  nel mio account.
  3. Accanto a “Consenti app meno sicure:  OFF ”, selezionare l’interruttore per accendere  su ON .

Questa impostazione potrebbe non essere disponibile per:

Per gli utenti di G-Suite: abilitazione delle app meno sicure per accedere agli account

  1. Accedi  alla tua Console di amministrazione Google (accedi utilizzando un  account amministratore , non il tuo account corrente.
  2. Fai clic su  Sicurezza> Impostazioni di base .
  3. In  App meno sicure , seleziona  Vai a impostazioni per app meno sicure .
  4. 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.

  1. Accedi  alla tua Console di amministrazione Google. Accedi utilizzando un  account amministratore
  2. Fai clic su  Sicurezza> Impostazioni di base .
  3. In  App meno sicure , seleziona  Vai a impostazioni per app meno sicure .
  4. 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

Sicurezza Google account verifica 2 passaggi e password applicazioni
  1. Vai alla pagina delle impostazioni di sicurezza di GMail: https://myaccount.google.com/security
  2. Innanzitutto è necessario abilitare l’autenticazione a 2 fattori.
  3. 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!
Inviare email con allegati GMail password applicazioni esterne

Grazie

  1. Inviare email con allegati (libreria v2.x): Arduino Ethernet
  2. Inviare email con allegati (libreria v2.x): esp32 e esp8266
  3. Inviare email con allegati (libreria v2.x): schede Arduino SAMD (WiFiNINA)

GitHub library


Spread the love
Exit mobile version