Email avec piece jointe via gsm

Bonjour à tous,

J'aurais besoin de vos conseils :

Je recherche à envoyer via le module GSM (SIM7600CE) un email avec un fichier .txt en pièce jointe.

Ce fichier texte se trouve sur une carte SD.

Ainsi j'essaye de trouver le moyen de dire à arduino uno :

  1. envoie les commandes AT au module GSM pour préparer le mail (connection au serveur/destinataire/emetteur/corps de l'email...)
  2. va chercher le fichier qui se trouve dans la carte SD via le port serial
  3. attache le fichier texte au mail puis envoie le mail.

Mon problème aujourd'hui :

  • je parviens à envoyer un email classique avec un texte, mais SANS pièce jointe (grâce aux commandes "SMTP")
  • je parviens à ouvrir le fichier texte dans la carte SD et lire son contenu.

Mais je ne parviens pas maintenant à dire au module GSM que je souhaite joindre au mail le fichier texte sur la carte SD.

Auriez-vous vous des conseils pour m'aiguiller sur la méthode à suivre?

Je vous joins le code commenté. Le module GSM me renvoie OK après chaque instruction AT reçu. Il y a juste pour l'avant-dernière instruction AT+SMTPFILE=1,"test.txt" pour laquelle le module GSM me renvoie "ERROR".

Je vous remercie pour votre aide et me tiens à disposition.
Martin

#include <SD.h>


const unsigned int delayGSMstep = 1000; //délai en ms pour laisser le temps au shield de se connecter du réseau
const unsigned int delayGSMenvoi = 10000; //délai en ms pour laisser le temps au shield de se connecter du réseau


String loginserveursmtp = "\"login\"";  //login serveur smpt (site : sendinblue.com)
String passwordserveursmtp = "\"motdepasse\""; //password serveur smpt
String serveursmtp = "\"smtp-relay.sendinblue.com\"";   //adresse serveur smpt
int portserveursmtp = 587; //port smtp à utiliser
String emailemetteur = "\"adresse\"";
String emaildestinataire = "\"adresse\"";
String objet = "\"GSMshield\"";  //objet message
String bodyemail = "\"voir PJ\"";

int x = 0;


void setup()
{

  Serial.begin(115200); //Initialize Arduino default serial port
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");


}

void loop() {
  x = 0;

  if (x == 0) {  //pour executer une seule fois la boucle

    Serial.begin(115200); //faire en sorte que le module GSM et le moniteur soit avec le meme baudrate
    Serial.print("AT+IPREX=115200");
    Serial.print(F("\r")); //ecrire cela à la fin de l'instruction
    delay(delayGSMstep);
    Serial.println();
    retourserial(); //voir le retour du module GSM


    Serial.print(F("AT+CFUN?")); //statut du module GSM
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CPIN?")); //statut de la carte SIM du module GSM
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+COPS?"));  //pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CGATT?")); //pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CREG?")); //pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CGDCONT=1,\"IP\",\"sl2sfr\"")); //pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CGACT=1,1"));//pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CGPADDR=1")); //pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+CGREG?"));//pas sûr que cela soit utile
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+SMTPSRV=")); //adresse du serveur smtp non SSL
    Serial.print(serveursmtp);
    Serial.print(F(","));
    Serial.print(portserveursmtp);
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();

    Serial.print(F("AT+SMTPAUTH=1,")); //info pour autoriser la connection au serveur smtp
    Serial.print(loginserveursmtp);
    Serial.print(F(","));
    Serial.print(passwordserveursmtp);
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();


    Serial.print(F("AT+SMTPFROM=")); //info emetteur
    Serial.print(emailemetteur);
    Serial.print(F(","));
    Serial.print(emailemetteur);
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();

    Serial.print(F("AT+SMTPRCPT=0,0,")); //info destinataire
    Serial.print(emaildestinataire);
    Serial.print(F(","));
    Serial.print("\"martin\"");
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();

    Serial.print(F("AT+SMTPSUB=")); //objet du mail
    Serial.print(objet);
    Serial.print(F("\r"));
    delay(delayGSMstep);
    Serial.println();
    retourserial();

    Serial.print(F("AT+SMTPBODY=")); //corps du mail
    Serial.print(bodyemail);
    Serial.print(F("\r"));
    Serial.println();
    delay(delayGSMstep);
    retourserial();

    Serial.print(F("AT+SMTPFILE=1,\"test.txt\""));    //le module GSM retourne le statut "ERROR" pour cette instruction.
    Serial.print("\r");
    delay(delayGSMstep);
    Serial.println();
    retourserial();

    Serial.print(F("AT+SMTPSEND"));  //pour envoyer le mail
    Serial.print("\r");
    delay(delayGSMstep);
    Serial.println();
    retourserial();
  }

  x = 1;

}


void retourserial() {



  while (Serial.available() > 0) {

    //Serial.read();
    Serial.write(Serial.read());//if Serial received data, output it via mySerial.
    Serial.println();
  }

}

Sur un sim800, Essayez avec AT+SMTPFILE=1,"test.txt",0

Il faut ensuite prévoir d’envoyer le contenu du fichier (max 1340 octets d’un coup)

Merci J-M-L pour la piste.

Bien vu, je vous avoue que j'ai déjà essayer de faire le test en regardant des projets similaires. Il y a même un projet dans lequel l'auteur réussi à dépasser la limite de 1300 octets, en faisant un découpage de sa pièce jointe en paquets de 1300 octets. Y'a des gens malins, j'en suis pas encore là :slight_smile:

Pour revenir à la commande SMTPFILE, j'ai même essayé des combinaisons différentes étant donné le modèle différent que je possède (SIM7600) :
AT+SMTPFILE=X ,"test.txt, Y : tests avec 0,1,2 à la place de X et Y / tests en changeant l'ordre des paramètres de l'instruction / tests sans X et/ou Y.

Rien n'y fait malheureusement, je deviens zinzin.

Pour avancer :
Le seul cas où le module GSM ne me renvoie pas une erreur, c'est lorsque j'indique juste "AT+SMTPFILE=1". Mais j'ai le sentiment que ce n'est pas bon car dans tous les projets similaires qu'on trouve sur la toile, les utilisateurs renseignent au moins un nom de fichier.

Du coup je me pose ces questions :

   Cas 1 : il faut bien indiquer AT+SMTPFILE=X ,"test.txt", Y. Mais il me manque quelque chose dans le code, avant ou après, pour que la commande AT+SMTPFILE fonctionne correctement

         Piste "avant" : ne doit-on pas par exemple créer au préalable un fichier test.txt dans la mémoire du module GSM (ainsi au moment d'indiquer AT+SMTPFILE=X ,"test.txt", Y, le module verrait que ce fichier existe bien).

         Piste "après" : faudrait-il charger juste le fichier texte après AT+SMTPFILE=X ,"test.txt", Y ? C'est-à-dire concrètement ouvrir le fichier texte sur la carte SD et lire les caractères un par un ? Vu que j'ai le message d'erreur AT+SMTPFILE, est ce que ca passera malgré tout.

  Cas 2 : il y a une autre méthode pour attacher une pièce jointe. C'est à dire qu'on indique juste "AT+SMTPFILE=1" (le seul cas où je n'ai pas de message d'erreur provenant du module GSM), et c'est après qu'on charger les données du fichier test.txt.

  Cas 3 : le module 7600 n'a peut-être pas cette fonctionnalité. Mais dans le manuel, je vois bien un paragraphe sur les commande AT "SMTP".

  Cas 4 : quelque chose m'échappe, je n'ai pas la bonne méthode (envoi via les commandes SMTP)

Un grand merci à vous pour votre aide.

Bonne journée, soirée à tous
Martin

Vous avez essayé de suivre exactement la doc ?

Je suis sur mon iPhone - pas simple de tout lire

Merci J-M-L,
Je vois dans le guide des commandes AT absentes de mon code (exemple : AT+EMAILCID et AT+EMAILTO).
Je lis tout cela, teste et reviens vers vous dans la journée avec les résultats.

Re J-M-L,

J'ai regardé la documentation que vous avez postée.

Le problème persiste : retour erreur sur la commande AT+SMTPFILE=1,"test.txt",0)

J'avance malgré tout grâce à vous : j'ai le sentiment qu'il y a sujet "trouver le bon manuel du module SIM7600CE".

En effet, quand je consulte la partie 5.3 que vous m'avez transmis (page 31 du manuel), 2 points font douter :

  1. Les commandes AT+EMAILCID=0 et AT+EMAILTO=30 sont utilisées dans le manuel. Or mon module GSM ne semble pas prendre en charge ces 2 commandes. Lorsque je teste avec AT+EMAILCID=? et AT+EMAILTO=? pour voir ce que le module me retourne, j'obtiens en effet 2 retours en "Erreur" (comme si le module ne connaissait pas les fonctions

-> très possible que je me trompe mais j'ai l'impression que ces 2 commandes ne sont pas vitales, car lorsque j'exécute le code sans ces 2 commandes, je reçois bien un mail, mais sans pièce jointe.

  1. la ligne AT+SMTPFILE du manuel reprend effectivement la structure de commande que vous m'avez indiqué ce matin : AT+SMTPFILE=1,"test.txt",0. Je reçois malgré cela, un retour "en erreur".

Sur le site SIMCom je trouve une ribambelle de manuels : certains contiennent des infos sur les commandes SMTP, certains non. Je commence à me demander si le module 7600CE que je possède est bien capable de gérer un envoi d'email avec pièces jointes via le protocole SMTP...

Je suis en panne d'idée sur la manière d'écrire correctement cette commande AT+SMTPFILE pour aujourd'hui.

Merci encore pour vos retours J-M-L.

Avec un 'degré de liberté' supplémentaire : la version du firmware installée.... :wink:

la commande ATI devrait donner les informations sur le firmware

Bonsoir J-M-L et Al1fch,

Ce message pour vous remercier et vous tenir informé.

Je vais demander directement à SIMCOM le manuel relatif à mon module et le firmware, car ce qu'on trouve sur la toile ne me parait pas cohérent par rapport à la version de mon module et/ou firmware.

Si cela n'aboutit pas, je changerai d'approche (trop de journées passées sur ce problème à faire des tests) :

Je noterai les informations que je veux transmettre dans le corps du mail. Pas l'idéal car on est limité qu'à 5100 caractères par mail, mais au moins cela sera dans mes cordes.

Bonne soirée à vous.
Martin

Oui sans la doc exacte difficile d’avancer

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.