home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


ricevere email con ESP32
     
Autore Messaggio opzioni
MB54




una ogni 100 livelli


postato il:
13.07.2021, alle ore 21:36
ricevere email con ESP32 

Ho bisogno di ricevere mail su un ESP32, tramite IMAP.
Ho usato la libreria ESP Mail Client.
https://github.com/mobizt/ESP-Mail-Client
https://mobizt.github.io/ESP-Mail-Client/src/


Per inviare le mail non ci sono problemi.

Per riceverle neppure, ma non riesco ad utilizzare ciò che ricevo. Nel senso che devo decodificare opportunamente oggetto, corpo del testo ed eventuale allegato. Devo quindi assegnare oggetto e corpo ( solo testo) ad una o piu' variabili, sulle quali fare il parsing del testo ed eseguire le operazioni conseguenti. Il problema è che non riesco ad assegnare le variabili.
La libreria, usando le funzioni pubbliche ( secondo gli esempi della libreria), mi stampa tutte di fila le mail ricevute, opportunamente filtrate.

Suggerimenti per come fare?
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
19.07.2021, alle ore 10:18
Pubblica il codice, può servire a capire cosa stai facendo.



Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
MB54




una ogni 100 livelli


postato il:
19.07.2021, alle ore 10:41
Grazie, ho risolto. Negli esempi della libreria ci sono delle funzioni che non vedevo richiamare dal main; pensavo fossero ad uso interno della libreria, ma sono proprio gli esempi che stavo cercando sul come usare le variabili della libreria. La soluzione era banale e bene in vista; non averlo capito subito è stato un effetto collaterale della guerra fra i miei neuroni.
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
19.07.2021, alle ore 12:33
Sarebbe interessante vedere il codice come riferimento.


Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
MB54




una ogni 100 livelli


postato il:
19.07.2021, alle ore 14:30
diegobincoletto:
Sarebbe interessante vedere il codice come riferimento.


Non c'é problema. Per le mail uso la libreria : https://github.com/mobizt/ESP-Mail-Client

Sono al momento più di 2500 righe di codice (vuote e commenti compresi, ma le mail occunano solo una piccola parte del codice) e sono poco oltre la metà.

Inviare le mail all' ESP32 mi serve per due cose:
1) inviare comandi semplici (ma anche multipli)che inserisco nell' oggetto della mail, codificandoli in modo opportuno. L' ESP se li va poi a cercare nel testo e fa di conseguenza
2) inviare dei file di riconfigurazione, piuttosto lunghi (sono la programmazione oraria suddivisa nei 12 mesi e per slot orari di 2 ore.

L' ESP32 cerca le reti presenti e vede se ha i codici per una di queste; si connette.
Estrapolando dal codice, ci sono inizialmente le configurazioni necessarie :
 
#define SMTP_HOST 'smtp.tiscali.it'
#define SMTP_PORT 465
#define IMAP_HOST 'imap.tiscali.it'
#define IMAP_PORT 993
#define AUTHOR_EMAIL 'espxxx@tiscali.it'
#define AUTHOR_PASSWORD 'prxxxx'
#define RECIPIENT_EMAIL 'maurxxx@tiscali.it'



Poi una funzione di impostazione dell 'IMAP, nella quale sono filtrati solo i miei messaggi:

 
void imappone(){
   /** Enable the debug via Serial port 
     * none debug or 0
     * basic debug or 1
    */
    imap.debug(1);

    /* Set the callback function to get the reading results */
    imap.callback(imapCallback);

    /** In case the SD card/adapter was used for the file storagge, the SPI pins can be configure from
     * MailClient.sdBegin function which may be different for ESP32 and ESP8266
     * For ESP32, assign all of SPI pins
     * MailClient.sdBegin(14,2,15,13)
     * Which SCK = 14, MISO = 2, MOSI = 15 and SS = 13
     * And for ESP8266, assign the CS pins of SPI port
     * MailClient.sdBegin(15)
     * Which pin 15 is the CS pin of SD card adapter
    */

    /* Set the session config */
    session.server.host_name = IMAP_HOST;
    session.server.port = IMAP_PORT;
    session.login.email = AUTHOR_EMAIL;
    session.login.password = AUTHOR_PASSWORD;


    /* Message UID to fetch or read */
    config.fetch.uid = ';

    /* Search criteria */
    config.search.criteria = 'FROM mauxxxx@tiscali.it';

    /* Also search the unseen message */
    config.search.unseen_msg = true;

    /* Set the storage to save the downloaded files and attachments */
    config.storage.saved_path = '/email_data';

    /** The file storage type e.g.
     * esp_mail_file_storage_type_none,
     * esp_mail_file_storage_type_flash, and 
     * esp_mail_file_storage_type_sd 
    */
    config.storage.type = esp_mail_file_storage_type_none;

    /** Set to download heades, text and html messaeges, 
     * attachments and inline images respectively.
    */
    config.download.header = false;
    config.download.text = false;
    config.download.html = false;
    config.download.attachment = false;
    config.download.inlineImg = false;

    /** Set to enable the results i.e. html and text messaeges 
     * which the content stored in the IMAPSession object is limited
     * by the option config.limit.msg_size.
     * The whole message can be download through config.download.text
     * or config.download.html which not depends on these enable options.
    */
    config.enable.html = true;
    config.enable.text = true;

    /* Set to enable the sort the result by message UID in the ascending order */
    config.enable.recent_sort = true;

    /* Set to report the download progress via the default serial port */
    config.enable.download_status = true;

    /* Set the limit of number of messages in the search results */
    config.limit.search = 5;

    /** Set the maximum size of message stored in 
     * IMAPSession object in byte
    */
    config.limit.msg_size = 1024;

    /** Set the maximum attachments and inline images files size
     * that can be downloaded in byte. 
     * The file which its size is largger than this limit may be saved 
     * as truncated file.
    */
    config.limit.attachment_size = 1024 * 1024 * 5;
    

    /* Connect to server with the session and config */
    if (!imap.connect(&session, &config))
        return;

    /*  {Optional] */
    printAllMailboxesInfo(imap);

    /* Open or select the mailbox folder to read or search the message */
    if (!imap.selectFolder('INBOX'))
        return;

    /*  {Optional] */
    printSelectedMailboxInfo(imap);
  
}


Da notare config.limit.msg_size = 1024; per motivi specifici il testo del messaggio potrà essere lungo (normalmente fra 400 e 900B). Se serve potrò aumentare.

Poi ci sono altre funzioni connesse:

 
void uso_Email(){
  Serial.println();Serial.println('...nuova ricerca mail:   ');Serial.println();
  config.search.criteria = 'FROM maurxx@tiscali.it'; 
  for (contoMail = ultimo_UID+1; contoMail < nextMsgUID;contoMail++){
      
      Serial.println(ultimo_UID+1);Serial.println(contoMail);
      
      String uid = String(contoMail);
      config.fetch.uid = uid.c_str();
      config.fetch.set_seen = true;/* Set seen flag */
      Serial.println(uid);
      /** Read or search the Email and keep the TCP session to open
       * The second parameter is for close the session. */
      MailClient.readMail(&imap, false);
      imap.empty();/* Clear all stored data in IMAPSession object */
      //Serial.println();
      Serial.print('conteggio mail:  ');Serial.print(contoMail);
      Serial.print(' oggetto:');
      Serial.print(testo_Oggetto [contoMail-ultimo_UID-1]); 
      Serial.println(); 
      Serial.println('testo mail :');
      Serial.println(testo_Messaggio); 
      Serial.println(); 
      verifica_Email();        
  }

void printMessages(IMAPSession &imap)
{
    /* Get the message list from the message list data */
    String stringhetta;
    IMAP_MSG_List msgList = imap.data();

    for (size_t i = 0; i < msgList.msgItems.size(); i++)
    {
        /* Iterate to get each message data through the message item data */
        IMAP_MSG_Item msg = msgList.msgItems[i];

        Serial.println('######################################');

        ESP_MAIL_PRINTF('Messsage UID: %s
', msg.UID);

        ESP_MAIL_PRINTF('Date: %s
', msg.date);
        ESP_MAIL_PRINTF('Subject: %s
', msg.subject);
        stringhetta = String(msg.subject); 
        stringhetta.replace(' ', '); 
        testo_Oggetto[contoMail-ultimo_UID-1]= stringhetta; 

           testo_Messaggio = msg.text.content;
           testo_Messaggio.replace(' ', ');
           testo_Messaggio.replace('=', ');
           ESP_MAIL_PRINTF('Text Message: %s
', testo_Messaggio);

            if (msg.attachments.size() > 0)
                printAttacements(msg);


        Serial.println();
    }
}


Nell' ultima funzzione, oggetto della mail e testo sono salvati rispettivamente in un vettore per elaborare fino a 10 mail e in una variabile per il txt. In quest' ultima sono eliminati tutti gli spazi bianchi e i segni di = che si inseriscono da soli nel passaggio IMAP per un motivo a me sconosciuto.

Fatto questo ci sono poi funzioni a piacere per elaborare ed eseguire i comandi. Una nota per le sole mail di riconfigurazione. Si tratta di 287 byte, che al momento per semplicità ho preferito inviare come testo del messaiio in forma di testo letterale, per cui occupano appunto molti byte (potenzialmente fino ad oltre 1024 B ). Se servirà spazio invierò la riconfigurazione come byte grezzi.

Il tutto è abbozzato a fondo, funziona bene e le mail non tradiscono. Potevo fare il tutto con un browser web, magari socket, ma ho preferito provare le mail che evitano di riconfigurare le interfacce web ad ogni modifica o ripensamento.
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
19.07.2021, alle ore 17:40
Grazie, Utile per imparare qualcosa di nuovo.
Questo è li spirito di GRIX



Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
gironico




una ogni 100 livelli


postato il:
19.07.2021, alle ore 17:53
ottimo lavoro mauro.... quando ho tempo lo provo e vediamo se metto in pensione telegram.......


La vita è troppo breve per bere vini mediocri
MB54




una ogni 100 livelli


postato il:
19.07.2021, alle ore 18:20
gironico:
ottimo lavoro mauro.... quando ho tempo lo provo e vediamo se metto in pensione telegram.......


Telegram sarebbe perfetto, ma come bene hai detto tu qualche tempo fa, ogni tanto si 'aggiorna' e bisogna riscrivere il codice o quanto meno usare una libreria piu' recente.
Nel caso dell' uso delle mail ho riscontrato problemi.
Account di google mail: un vero sbattimento. Ovviamente non funziona al primo colpo, manco si connette. Cerchi suggerimenti nel web e ti dicono come fare. Provi e non va. Ricerchi ancora e trovi consigli piu' recenti. Provi e non va. Alla fine scopri che se Google si accorge che la mail arriva da un dispositivo stupido (come l' ESP32) ci pensa su per qualche giorno prima di autorizzare. La connessione IMAP funziona, risponde all' invio dell' ESP ma poi non traferisce. Poi mi sono letto meglio come funziona, ed ho visto che l' account andava 'attivato' in qualche modo riconoscendolo come ok. Non mi ricordo esattamente come ho fatto, ma alla fine ha funzionato ( e non era la semplice attivazione sul pannello di controllo che Google consiglia). Alla fine ho capito che Google é troppo avanti nel futuro, prende giustamente troppe cautele ed ho deciso che non poteva andare per questo scopo; magari fra 6 mesi si inventerà qualche cosa d' àltro e toccherebbe riprendere in mano il progetto.
Con le mail di Tiscali (e simili) il problema potrebbe non esserci (spero); l' importante è che abbiano il server IMAP.
Forse si potrebbe anche usare MQTT, ma sarà per la prossima volta.

diegobincoletto:
Grazie, Utile per imparare qualcosa di nuovo.
Questo è li spirito di GRIX

Sul forum ho imparato molte cose

Le librerie di Arduino e simili sono estremamente utili, ma mal spiegate. Difficile trovare nel web qualche cosa che vada oltre all' accendo led e spengo led: centinaia di copiaincolla.... CTRL+C, CTRL+V
Sempre per questo progetto sono impazzito ad usare utilmente il doppio core dell' ESP. Vero è che il C non è il mio mestiere.
A stima finirò il programma per inizio settembre... esticazzi...


segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale