View All

Facebook Timeline

Emails avec Arduino et les modules SIM800 et SIM900

Posted On: oct. 31, 2022

Seen by: 469

Categories: GSM/GPRS

Author: Christian Joseph

Après avoir envoyé des SMS, MMS et APPELS avec Les modules SIM800 et SIM900 et Arduino, nous allons maintenant envoyer des Emails.

SOMMAIRE:

  1. LES CARTES SIM800 ET SIM900
  2. PROTOCOLE DES EMAILS
  3. PROGRAMME ARDUINO: ENVOI EMAILS AVEC SIM800 OU SIM900
    1. ENVOI D'UN EMAIL SIMPLE
    2. ENVOI D'UN EMAIL AVEC PIECE JOINTE
  4. ASSISTANCE

1- LES CARTES SIM800 ET SIM900

Les modules SIM800 et SIM900 sont des modules GSM/GPRS quadri-bande et qui servent à envoyer des SMS, des MMS, des Appels et des Emails. Ces modules disposent tous de connecteurs pour carte SIM ou micro SIM (SIM800C) et sont compatibles tous opérateurs.

Dans cet article nous allons traiter de l'envoi des Emails, mais en ce qui concerne le traitement des SMS, MMS, et APPELS, vous pouvez vous référer à nos articles de blog suivant:

2- PROTOCOLE DES EMAILS.

Avant d'attaquer le programme Arduino, nous aurons d'abord besoin de récupérer certaines informations importantes pour mener à bien notre projet d'emails:

  • APN Opérateur téléphonique
  • Informations SMTP du serveur mails sortants
  • Port du serveur mails sortants
  • Email et mot de passe de l'emetteur
  • Email de réception

La plupart des messageries d'email, si ce n'est la majorité disposent de ce que l'on appelle d'une adresse SMTP pour les mails sortants. En clair ils disposent d'une adresse pour les mails entrants et une autre pour les mails sortants.

Dans notre code, nous utilisons LAPOSTE.NET comme messagerie et SFR comme opérateur téléphonique. Il est tout à fait possible de choisir une messagerie professionnelle en fonction de votre hébergeur.

D'autres messageries comme GMAIL posent des problèmes de blocage du fait de la double authentification par exemple. En effet lorsque vous souhaitez vous connecter à votre messagerie GMAIL, le mot de passe seul ne suffit pas. Je vous conseillerai donc du tout sauf GMAIL.

Voici quelques exemples d'APN d'opérateurs téléphoniques:

  • SFR / RED / LA POSTE MOBILE: APN = sl2sfr
  • ORANGE / SOSH: APN = orange
  • BOUYGUES: APN = mmsbouygtel.com (paramètre APN identique chez Bouygues pour les MMS et la connexion à internet)
  • FREE MOBILE:APN = free
  • VIRGIN MOBILE / CIC Mobile: ofnew.fr

Voici quelques exemples d'adresses SMTP de messageries:

  • LAPOSTE.NET: smtp.laposte.net
  • YAHOO: smtp.mail.yahoo.com
  • FREE: smtp.free.fr
  • ORANGE: smtp.orange.fr
  • OVH: ssl0.ovh.net
  • IONOS: smtp.ionos.fr
  • AMEN: smtp-fr.securemail.pro

Choix du port de connexion au Serveur:

  • Non sécurisé (ou non-SSL): 587
  • Sécurisé (SSL): 465

Qui dit envoi de mails, dit accès internet:

Les modules SIM800, SIM800C et SIM900 ne sont pas configurés de base pour l'envoi d'EMAILS en France. C'est pourquoi nous faisons la mise à jour du firmware de nos modules SIM800 et  SIM900  afin de les rendre compatibles pour les MMS et EMAILS avec les réseaux France et Europe.

3- PROGRAMME ARDUINO: ENVOI DE MAILS AVEC LE SIM800 ET LE SIM900

3.1- ENVOI D'UN EMAIL SIMPLE

IMPORTANT:

Comme toujours, notre charmant éditeur de texte de Blog de Bip Bip Bip ne prend pas encore le symbole ANTISLASH ou BACKSLASH (in english please!) , il faudra donc remplacer dans code Arduino ci-dessous le mot (ANTISLASH) par son symbole. si tu c'est pas ce que c'est Google est ton meilleur ami: tape ce mot et il te montrera à quoi ressemble ce symbole!

Dans l'IDE Arduino, appuyez sur CTRL + F et renseignez les cases comme dans l'image ci-dessous, puis cliquez sur "TOUT REMPLACER".

Remplacement Antislash CTRL +F

Dans ce code nous utilisons l'opérateur téléphonique SFR et la messagerie LAPOSTE.NET

ATTENTION: Pour le corps de votre Mail, le SIM800 exige que vous lui indiquiez le nombre de caractères à envoyer alors que le SIM900 pas du tout. Ainsi, pour envoyer le mot "Bonjour" par exemple, vous devez mettre AT+SMTPBODY=7 pour le SIM800 (Le mot "Bonjour" faisant 7 caractères), et juste AT+SMTPBODY pour le SIM900. Je vous ai mis les 2 instructions dans le code. Pensez donc à décommenter la ligne qui vous intéresse et mettre l'autre en commentaire grâce à //.

/*Programme: Envoi de Mails Arduino SIM800 - 900
 *Auteur: Christian Joseph
 *Date: 24/06/2022
 *Site:www.eagle-robotics.com
 *Help: Projet@eagle-robotics.com
 */

#include "SoftwareSerial.h"


SoftwareSerial SIM800 (7,8);

void setup()
{
 
  SIM800.begin(9600);
  Serial.begin(9600);
  delay(10000); //On laisse le temps au module SIM800-900 de s'allumer
    
}

void loop()
{
  sendMAILS();//Envoi du Mail
  while(1); //Boucle d'attente infinie
}

void sendMAILS()
{
  SIM800.println("AT");
  delay(1000);
  updateSerial();
 
 
  SIM800.print("AT+SAPBR=3,1,(ANTISLASH)"CONTYPE(ANTISLASH)",(ANTISLASH)"GPRS(ANTISLASH)"(ANTISLASH)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=3,1,(ANTISLASH)"APN(ANTISLASH)",(ANTISLASH)"sl2sfr(ANTISLASH)"(ANTISLASH)r"); //Activation internet opérateur téléphonique
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=1,1(ANTISLASH)r");
  delay(4000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=2,1(ANTISLASH)r");
  delay(1000);
  updateSerial();

  SIM800.print("AT+EMAILCID=1(ANTISLASH)r");
  delay(1000);
  updateSerial();

  SIM800.print("AT+EMAILSSL=1(ANTISLASH)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+EMAILTO=30(ANTISLASH)r");
  delay(1000);
  updateSerial();

  SIM800.print("AT+SMTPSRV=(ANTISLASH)"smtp.laposte.net(ANTISLASH)",465(ANTISLASH)r");//Serveur de messagerie pour les mails sortants + numéro de Port
  delay(1000);
  updateSerial();

  SIM800.print("AT+SMTPAUTH=1,(ANTISLASH)"chrisjoseph86@laposte.net(ANTISLASH)",(ANTISLASH)"Motdepasse(ANTISLASH)"(ANTISLASH)r");//Connexion à la messagerie: identifiant + mot de passe
  delay(2000);
  updateSerial();

  SIM800.print("AT+SMTPFROM=(ANTISLASH)"chrisjoseph86@laposte.net(ANTISLASH)",(ANTISLASH)"Christian Joseph(ANTISLASH)"(ANTISLASH)r");//Mail + nom de l'expéditeur
  delay(1000);
  updateSerial();

   SIM800.print("AT+SMTPRCPT=0,0,(ANTISLASH)"contact@eagle-robotics.com(ANTISLASH)",(ANTISLASH)"Eagle Robotics(ANTISLASH)"(ANTISLASH)r");//Mail + nom du destinataire
  delay(1000);
  updateSerial();

  SIM800.print("AT+SMTPSUB=(ANTISLASH)"Paris est Magique(ANTISLASH)"(ANTISLASH)r");//Titre du mail
  delay(1000);
  updateSerial();

//SIM800.print("AT+SMTPBODY(ANTISLASH)r"); //Envoi du message Pour le SIM900

SIM800.print("AT+SMTPBODY=11(ANTISLASH)r");// Envoi du message Pour le SIM800 - Taille du message en nombre de caractères 
  delay(1000);
  updateSerial();
  SIM800.println("MBAPPE 2025");//Message ou corps du mail - le message fait bien 11 caractères en comptant les espaces.
  delay(500);
  updateSerial();
  SIM800.write((char)26);//Validation du message
  delay(500);
  updateSerial();

  SIM800.print("AT+SMTPSEND(ANTISLASH)r");// Envoi du Mail
  delay(1000);
  updateSerial();
 
}

void updateSerial()
{

  delay(500);
  while (Serial.available())
  {
    SIM800.write(Serial.read());
  }
  while(SIM800.available())
  {
    Serial.write(SIM800.read());
  }
}

3.2- ENVOI D'UN EMAIL AVEC PIECE JOINTE

Voici de quelle manière se déroule l'envoi d'un mail avec pièce jointe:

  1. Tout d'abord nous suivons le chemin classique de l'envoi d'email simple, mais cette fois-ci en indiquant au serveur de messagerie que l'on a une pièce jointe à lui envoyer aussi. Nous pouvons envoyer un fichier texte (.txt), une image (JPEG, BMP, etc...), une vidéo etc...avec l'instruction "AT+SMTPFILE= A, NOM DU FICHIER, B"
    • A peut prendre pour valeurs 1 (si le fichier est de type texte ou .txt) ou 2 (si le fichier est une image ou une vidéo).
    • B peut prendre pour valeurs 0 pour un fichier 7 bits US-ASCII (ce qui correspond aux fichiers textes) ou 1 pour un fichier en BASE64 (ce qui corresponds aux fichiers JPEG, BMP, MP3, MOV, etc...)
  2. Le corps de l'email est envoyé
  3. Le serveur nous envoi une notification avec la taille maximale de données que l'on peut envoyer par paquets. Pour faire simple, imaginez que vous ayez une voiture 5 places et 12 personnes à transporter. Vous l'aurez compris vous aurez 3 voyages à faire. Là le serveur vous indiquera le nombre maximal de données à envoyer par voyage. Le nombre maximal est de 1360 octets mais peut varier selon l'opérateur téléphonique.
  4. Nous pouvons commencer à envoyer notre pièce jointe. Si notre pièce jointe fait moins de 1360 octets, alors nous n'aurons qu'un voyage à effectuer, autrement il faudra faire autant de voyage que nécessaires. Tous les 1360 octets envoyés, le serveur mail nous envoi une notification selon laquelle il est prêt à recevoir un autre paquet de données de 1360 octets maximum.
  5. Une fois la totalité des données envoyée, nous indiquons au serveur mail que nous avons fini et l'envoi final de l'email s'effectue à ce moment là.

LE FORMAT BASE64

L'envoi d'un fichier texte ou .txt est plutôt facile et se fait généralement en une seul voyage, compte tenu du fait que ces types de fichiers sont de petites tailles et dépassent rarement les 1360 octets ( à moins que vous essayez de transférer une encyclopédie!). De plus ils ne nécessitent aucune transformation étant donné qu'ils sont extraits de notre carte mémoire SD ou micro-SD puis expédiés tels quels via le SIM800 ou SIM900 vers le serveur de messagerie. 

Vous l'aurez deviné, il n'en est pas de même pour les images, lesquelles doivent d'abord être converties en au format BASE64 avant d'être envoyées, sinon le serveur de messagerie ne les comprend pas et donc ne peut pas les afficher. Bien entendu le mail sera envoyé et vous verrez bien qu'il y a une pièce jointe attachée mais le fichier sera inexploitable.

Le format BASE64 a pour caractéristiques de faire grossir votre fichier aussi, et donc accessoirement faire plus de voyages. Pour être plus clair on peut appliquer l'équation suivante:

  • Taille image BASE64 = Taille image JPEG x 1,33

De plus il faut 6 octets d'un fichier JPEG pour faire une donnée correcte en BASE64.

Donc le défi est d'extraire les données de la carte SD ou micro-SD, de les convertir tous les 6 octets en BASE64, puis d'envoyer au fur et à mesure au serveur de messagerie tout en faisant attention de ne pas dépasser les 1360 octets par voyages. Kafkaïen n'est-il pas?

ENVOI DE MAIL AVEC FICHIER TEXTE (.TXT) EN PIECE JOINTE

/*
Projet: Envoi d'email avec pièce jointe texte
Programmer: Christian Joseph
Carte: Arduino Uno + SIM800 ou SIM900
Date: 16 Decembre 2022
Website: www.eagle-robotics.com
Help: Projet@eagle-robotics.com
*/
#include "SPI.h"
#include "SD.h"
#include "SoftwareSerial.h"

#define CS 10

SoftwareSerial SIM800 (7,8);
File dataFile;
unsigned long taille_fichier;
unsigned char data;
String pjte ="";

void setup()
{
pinMode(CS,OUTPUT);
SIM800.begin(9600);
Serial.begin(9600);
while (!Serial) {
}

Serial.print("Initialisation SD...");

if (!SD.begin(CS)) {
Serial.println("initialisation KO!");
return;
}
Serial.println("initialisation Faite.");

delay(10000);//On laisse le temps au SIM800 de se connecter au réseau mobile

}

void loop()
{
EnvoiMail();
while(1);
}

void EnvoiMail()
{

SIM800.println("AT");
delay(1000);
updateSerial();
SIM800.print("AT+SAPBR=3,1,(ANTISLASH)"CONTYPE(ANTISLASH)",(ANTISLASH)"GPRS(ANTISLASH)"(ANTISLASH)r");
delay(1000);
updateSerial();

SIM800.print("AT+SAPBR=3,1,(ANTISLASH)"APN(ANTISLASH)",(ANTISLASH)"sl2sfr(ANTISLASH)"(ANTISLASH)r");
delay(1000);
updateSerial();

SIM800.print("AT+SAPBR=1,1(ANTISLASH)r");
delay(4000);
updateSerial();

SIM800.print("AT+SAPBR=2,1(ANTISLASH)r");
delay(1000);
updateSerial();

SIM800.print("AT+EMAILCID=1(ANTISLASH)r");
delay(1000);
updateSerial();
SIM800.print("AT+EMAILSSL=1(ANTISLASH)r");
delay(1000);
updateSerial();

SIM800.print("AT+EMAILTO=30(ANTISLASH)r");
delay(1000);
updateSerial();

SIM800.print("AT+SMTPSRV=(ANTISLASH)"smtp.laposte.net(ANTISLASH)",465(ANTISLASH)r");//Serveur de messagerie pour les mails sortants + numéro de Port
  delay(1000);
  updateSerial();

 SIM800.print("AT+SMTPAUTH=1,(ANTISLASH)"chrisjoseph86@laposte.net(ANTISLASH)",(ANTISLASH)"Motdepasse(ANTISLASH)"(ANTISLASH)r");//Connexion à la messagerie: identifiant + mot de passe
  delay(2000);
  updateSerial();

  SIM800.print("AT+SMTPFROM=(ANTISLASH)"chrisjoseph86@laposte.net(ANTISLASH)",(ANTISLASH)"Christian Joseph(ANTISLASH)"(ANTISLASH)r");//Mail + nom de l'expéditeur
  delay(1000);
  updateSerial();

   SIM800.print("AT+SMTPRCPT=0,0,(ANTISLASH)"contact@eagle-robotics.com(ANTISLASH)",(ANTISLASH)"Eagle Robotics(ANTISLASH)"(ANTISLASH)r");//Mail + nom du destinataire
  delay(1000);
  updateSerial();

  SIM800.print("AT+SMTPSUB=(ANTISLASH)"Paris est Magique(ANTISLASH)"(ANTISLASH)r");//Titre du mail
  delay(1000);
  updateSerial();

//SIM800.print("AT+SMTPBODY(ANTISLASH)r"); //Envoi du message Pour le SIM900

SIM800.print("AT+SMTPBODY=11(ANTISLASH)r");// Envoi du message Pour le SIM800 - Taille du message en nombre de caractères 
  delay(1000);
  updateSerial();
  SIM800.println("MBAPPE 2025");//Message ou corps du mail - le message fait bien 11 caractères en comptant les espaces.
  delay(500);
  updateSerial();
  SIM800.write((char)26);//Validation du message
  delay(500);
  updateSerial();

SIM800.print("AT+SMTPFILE=1,(ANTISLASH)"test.txt(ANTISLASH)",0(ANTISLASH)r"); // Ajout de la pièce jointe Fichier de type texte - 7 bits ASCII
delay(1000);
updateSerial();

SIM800.print("AT+SMTPSEND(ANTISLASH)r"); //Envoi de l'Email
delay(1000);
updateSerial();

att: //Attente d'autorisation du serveur mail pour lui envoyer la pièce-jointe
if(SIM800.available()){
pjte = SIM800.readString();// On attend la taille maximale que le serveur peut accepter par voyages
Serial.print("pjte ="); //Généralement la réponse est "+SMTPFT: 1,1360" ou 1360 est la taille maximale
Serial.println(pjte); //Mais cette valeur peut varier selon l'opérateur téléphonique
if(pjte = "+SMTPFT: 1,1360"){ //Taille maximale du paquet de données que l'on peut envoyer à chaque fois
goto suite;
}
}
goto att;
suite: pjte ="";
dataFile=SD.open("test.txt");
taille_fichier = dataFile.size();// Récupération de la taille du fichier
Serial.println(taille_fichier);
dataFile.close();
SIM800.print("AT+SMTPFT=");
SIM800.println(String(taille_fichier)); //On indique ici au serveur mail la taille du fichier qu'on souhaite lui envoyer
delay(2000);
updateSerial();

dataFile=SD.open("test.txt");// Ouverture du fichier dans la carte SD
if(dataFile)
{
while(dataFile.available()) //Téléchargement de la pièce-jointe
{
data=dataFile.read();
Serial.print(data,HEX);
SIM800.print(data);
}
dataFile.close();
}
else
{
Serial.println("erreur ouverture fichier");
}
updateSerial();
delay(3000);
SIM800.print("AT+SMTPFT=0(ANTISLASH)r"); //Envoi de la pièce Jointe
delay(5000);
updateSerial();
}

void updateSerial()
{

delay(500);
while (Serial.available())
{
SIM800.write(Serial.read());
}
while(SIM800.available())
{
Serial.write(SIM800.read());
}
}

4-ASSISTANCE

Pour toutes demandes d'assistante, veuillez nous adresser votre requête sur Projet@eagle-robotics.com, sans oublier de joindre les flatteries habituelles ("Oh Grand Maître de la robotique, etc etc...) et soyez convaincants et créatifs sinon votre requête ne sera pas traitée.