Email con allegati

Ho trovato su internet un codice interessante, ma che non permette di inviare allegati

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

 // Local network configuration:
 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };
 byte ip[] = { 192,168,0, 177 };

 // Login data:
 String UserName64 = "XXXXXXX";
 String Password64 = "XXXXXXX";
 String User = "XX";

 // SMTP server data:
 // smtp.libero.it : 212.52.84.54
 // smtp.iol.it : 212.52.84.203
 // out.virgilio.it : 62.211.72.20
 byte server[] = { 62, 211, 72, 20 }; // SMTP server
 String ServerName = "out.virgilio.it";

 // Mail data:
 String Sender = "XXXXXXX@virgilio.it";
 String Recipient = "XXXXXXX@virgilio.it";
 String Subject = "Messaggio inviato da Arduino!";
 String Body = "Testo del messaggio\nsu piu'\ndi una riga.";

 int time = 1000;
 int wait = 1000;
 String ServerResponse="";
 EthernetClient client;

 void setup()
 {
  Serial.begin(9600);
  Serial.println("Program started, waiting for router...");
  delay(time); /* allow the router to identify the Arduino before the Arduino connects to the internet */

  Serial.println("Starting network module...");
  Ethernet.begin(mac, ip);
  delay(2000);

  Serial.println("connecting...");
  if (client.connect(server, 587)) {
     Serial.println("connected");

     SendMsg("HELO " + User); /* say hello*/
     SendMsg("AUTH LOGIN ");
     SendMsg(UserName64); /* Username*/
     SendMsg(Password64); /* Password */
     SendMsg("MAIL From:<" + Sender +">"); /* identify sender */
     SendMsg("RCPT To:<" + Recipient + ">"); /* identify recipient */
     SendMsg("DATA");
     SendMsg("To: " + Recipient); /*  recipient in message header */
     SendMsg("From: " + Sender); /* seder name in message header */
     SendMsg("Subject: "+ Subject); /* insert subject */
     SendMsg(""); /* empty line */
     SendMsg(Body); /* insert body */
     SendMsg(""); /* empty line */
     SendMsg("."); /* end mail */
     SendMsg("QUIT"); /* terminate connection */
     client.println();

  } else {
    Serial.println("connection failed");
  }
 }

 void loop()
 {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

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

 void GetResponse() {
    if (client.available()) {
         char c = client.read();
         while (client.available()) { // Store command char by char.
           ServerResponse +=c;
           c = client.read();
         }
    Serial.println("<<<" + ServerResponse);
    ServerResponse="";
  }
 }

 void SendMsg(String m) {
   client.println(m);
   Serial.println(">>>" + m);
   delay(wait); /* wait for a response */
   GetResponse();
 }

Poi, riguardo al post #17 a me funziona anche se ho rete Teletu, cioè Vodafone

Intanto vedi se riesci a farlo girare senza allegati ... poi penserai ad aggiungere la parte degli allegati (... sempre se, come ho già detto, resta memoria sufficiente).

Nel frattempo ... studiati bene il protocollo SMTP ed i messaggi multipart perché ti servirà ... ::slight_smile:

Guglielmo

Non so se va bene ma ho trovato su Wikipedia una voce sul protocollo smtp che mi sembra abbastanza dettagliata. Riguardo ai

gpb01:
messaggi multipart perché ti servirà ... ::slight_smile:

Non so cosa siano e quindi, se potrei avere una breve spiegazione ne sarei felice.

Cerca "SMTP multipart" e troverai anche gli esempi ... :wink:

Guglielmo

Forse ho capito....

Per inviare un allegato devo codificare l'immagine scattata da jpeg a Base64 e poi includerlo nel testo della mail sotto forma di allegato.
Forse è una cosa simile:

MIME-Version: 1.0
To:  ZZZ@WWW.it
Subject: XXXYYZZZWWW
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
 
ABCDEFGHIJKLMNOPQRSTUVWXYZ
 

Content-Type: image/jpeg; name="WWW.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="WWW.jpg"
(Codifica Base64 Immagine)
--------------060708020103050401060503--
.

E poi... anche se fosse così:

  • Come fare a codificare un'immagine da scheda sd base64?
  • Come devo riadattare QUESTO?
  • E, se possibile, si può utilizzare il lettore sd incluso nella ethernet shieild?

Grazie di nuovo in anticipo.

... chi vuole fare troppe cose tutte assieme NON arriva da nessuna parte ! Te l'ho già detto, comincia ad inviare una semplice eMail che già avrai i tuoi problemi ... ::slight_smile:

Guglielmo

Ora provo.

Ma comunque, il processo è giusto?

Io ti dico solo che Arduno NON è fatto per trattare immagini, NON ha le potenzialità e, fondamentalmente NON ha la memoria dove mettere l’immagine …

Hai 2 KB di SRAM, togli quella che usi tu con il programma e, probabilmente, te ne resta meno della metà, ora …
… ogni pixel in B/N occupa un byte … fatti i conti di cosa riesci a memorizzare e cosa riesci a maneggiare …

Per questo ti dicevo, parti con una eMail normale e vedi quello che ti resta … ::slight_smile:

Guglielmo

Provando a memorizzare l'immagine sulla scheda SD?

Il problema è poi creare l'attach ... NON è che puoi inviare un byte per volta eh ...
... hai cercato, come ti ho detto, SMTP multipart ? Hai visto come è fatto ? Come fai a costruire tutto il messaggio da trasmettere in SRAM ?

Purtroppo Arduino UNO NON è nato per fare queste cose, e un piccolo microcontroloer a 8 bit ... si può cominciare a pensarci con Arduno Yún (o lo Yún Shield per la UNO) o, meglio, passando a cose tipo Raspberry PI ... ::slight_smile:

Guglielmo

Ho visto che alcuni costanti possono essere dichiarate come PROGEM e quindi, da quello che ho capito verrebbero memorizzati nella flash.
Ho cercato smtp multipart, ed ho scritto sopra un esempio che potrebbe essere giusto.

Hai detto bene 'costanti' ... ovvero cose NON modificabili ... NON variabili !

Guglielmo

Non esistono variabili PROGEM?

NO, PROGMEM indica la memoria Flash dove puoi mettere delle "costanti" in fase di caricamento del programma !

Guglielmo

Comunque, oggi ci sono quasi riuscito ad inviare una normale mail. Univo problema mi sono dimenticato di mettere il mac esatto e, visto che è tardi, preferisco riposarmi e pensarci domani.

E, se poi la memoria mi bastasse?
Provare non nuoce.
Intanto, come faccio a codificare base64 un'immagine su scheda sd?

Arduino Mega potrebbe andare bene?
Ha più memoria della UNO e gli shieild per la UNO vanno bene anche per la MEGA; inoltre la MEGA è più economica della YÚN.

Ho visto Arduino DUE che ha molta SRAM. Mi può bastare?

  1. Arduino DUE è molto poco supportato e pochissime librerie di terze parti sono state convertite per funzionarci.

  2. Molti pochi shield sono fatti per funzionare su Arduino DUE.

  3. La scheda funziona esclusivamente a 3.3V e molti dei suoi pin sono in grado di dare un decimo della corrente (max 3 mA) dei pin degli altri Arduino (max 40 mA). I rimanenti comunque non danno più di 15 mA.

  4. E' sicuramente un processore molto più complesso da utilizzare. Basta guardare le oltre 1400 pagine di cui è composto il datasheet.

  5. Difficilmente vedrà ulteriori sviluppi dato che ... ora ci sono tutte le nuove schede.

Detto questo ... la scheda per il tuo progetto è o un Arduino Yún (o Yún shield) o, ancora meglio ... una raspberry ... inutile che continui a voler usate a tutti i costi schede poco adatte.

Guglielmo

Quindi acquisto un arduino YUN.
Ma ho letto che ha solo 2.5kb di SRAM?
É normale? Mi basta?