
Après avoir envoyé des SMS, MMS et APPELS avec Les modules SIM800 et SIM900 et Arduino, nous allons maintenant envoyer des Emails.
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:
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:
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:
Voici quelques exemples d'adresses SMTP de messageries:
Choix du port de connexion au Serveur:
Qui dit envoi de mails, dit accès internet:
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".
/*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());
}
}
Voici de quelle manière se déroule l'envoi d'un mail avec pièce jointe:
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:
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?
/*
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());
}
}
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.