Blog technique sur mes expériences de développeur.
9 août 2022
Au cours de ce chapitre, nous allons voir ensemble comment envoyer un e-mail à l’aide du module Net::SMTP.
Ce cours était originalement publié sur la plateforme OpenClassrooms. La plateforme OpenClassrooms ayant supprimée ce tutoriel en 2020 et le tutoriel étant sous licence CC BY-SA 4.0, je vous propose de le (re)découvrir ici.
Comme je le disais dans le chapitre précédent, la bibliothèque libnet nous permet de donner des instructions aux serveurs auquel nous sommes connectés.
Pour dans le cas de l’envoi d’un e-mail, il est possible de découper le travail selon 5 étapes que voici :
Afin d’implémenter ces 5 étapes, nous allons utiliser le module Net::SMTP. Ce module nous permet en fait de faire l’intermédiaire entre notre programme et le serveur avec lequel nous souhaitons communiquer.
Je vous propose de regarder immédiatement quelques unes des méthodes et fonctions qui nous serviront par la suite.
new()
: instancier un objetLe module Net::SMTP est un module orienté objet. Cette méthode est donc le constructeur de la classe Net::SMTP.
Si la Programmation Orienté Objet ne vous parle vraiment pas, je vous conseille de jeter un œil sur un des tutoriels de M@téo21 expliquant simplement le principe des objets et la POO de manière générale.
Cette méthode peut prendre plusieurs paramètres comme par exemple :
mail()
: indiquer l’expéditeurLorsque vous envoyez un e-mail, vous devez impérativement indiquer l’adresse électronique de son expéditeur. C’est avec cette méthode vous devez procéder. Comme vous pouvez vous en douter, l’adresse est passée en paramètre de la fonction.
to()
: indiquer le destinataireCette fonction permet d’indiquer l’adresse électronique du ou des destinataires de votre e-mail. Les différentes adresses e-mails sont passées sous la forme de paramètres, où chaque adresse représente un paramètre.
cc()
: mettre en copieSur la plupart des clients messageries, il est possible d’envoyer une copie de votre e-mail à un ou plusieurs destinataires. En Perl, c’est également possible et c’est à l’aide de cette fonction que vous procéderez. Tout comme pour la fonction to()
, les différentes adresses e-mails sont passées sous la forme de paramètres, où chaque adresse représente un paramètre.
bcc()
: la copie cachéeDans le même esprit que la fonction cc()
, la fonction bcc()
permet d’envoyer de manière cachée votre e-mail à des destinataires. Une fois de plus, les différentes adresses e-mails sont passées sous la forme de paramètres, où chaque adresse représente un paramètre.
data()
: initialiser l’envoi de donnéesCette fonction permet d’initialiser la transmission des données de l’e-mail en cours. Cette fonction est souvent utilisée sans paramètre. Dans ce cas là, on couple son utilisation aux fonctions datasend()
et dataend()
.
datasend()
: envoyer des donnéesCette fonction est utilisée afin d’envoyer des données au serveur auquel vous êtes connectés. Les différentes données à envoyer sont passées sous la forme de paramètres.
dataend()
: terminer l’envoi des donnéesCette fonction permet clôturer la transmission des données vers le serveur auquel vous êtes connectés. Cette fonction ne prend pas de paramètre.
quit()
: se déconnecter du serveurCette fonction permet de fermer proprement la connexion avec le serveur. Cette fonction ne prend pas de paramètre.
Maintenant que vous avez fait connaissance avec le module Net::SMTP, nous allons voir ensemble comment implémenter en Perl les 5 étapes décrites un plus haut.
Pour rappel, voici les 5 étapes que nous allons implémenter au cours de ce chapitre :
C’est parti !
La première étape consiste donc à indiquer à notre programme Perl l’adresse du serveur auquel on souhaite se connecter. Si vous vous souvenez bien, c’est la méthode new()
qui nous le permet. Pour rappel, voici quelques paramètres que peut prendre cette fonction :
Dans ce premier exemple, nous allons nous connecter au serveur SMTP de Wanadoo. Nous allons donc utiliser ici un seul paramètre.
#!usr/bin/perl -w
use strict;
use Net::SMTP; #Indique que nous allons utiliser ce module au cours de notre programme.
#Étape 1
my $smtp = Net::SMTP->new('smtp.wanadoo.fr') or die 'Impossible de se connecter au serveur : ' . $!;
Tout comme dans la partie 1 de ce tutoriel, leor diepermet de gérer les éventuelles exceptions renvoyées par notre programme. La variable $!
quant à elle, nous indique la source exacte du problème.
Il est possible de faire passer d’autres paramètres à la méthode new()
comme par exemple le mode débogage ou un temps limite de connexion. Le passage de ces nouveaux paramètres se fait sous la forme d’un tableau associatif.
Voyons tout de suite un exemple dans lequel nous les paramètres de débug et de limitation de temps sont présents.
#!usr/bin/perl -w
use strict;
use Net::SMTP;
#Étape 1
my $smtp = Net::SMTP->new('smtp.wanadoo.fr', Debug => 1, Timeout => 10) or die 'Impossible de se connecter au serveur : ' . $!;
Par défaut, le mode débogage est désactivé. Le mettre à 1 permet donc son activation. Nous pouvons ainsi afficher à l’écran le détail du dialogue qui s’opère entre le serveur et votre programme.
Le temps limite de connexion se donne en seconde. Ainsi, dans mon exemple, si au bout de 10 secondes le programme n’a pas réussi à se connecter au serveur, une exception sera levée, et la variable $!
contiendra le message “Connexion terminée par expiration du délai d’attente”.
Si une fois de plus vous avez correctement retenu ce qui était écrit plus haut, vous n’aurez pas de difficulté à deviner que cette étape s’effectue grâce à la méthode mail()
. Vous avez juste à indiquer votre adresse e-mail comme paramètre de la fonction.
#Étape 2
$smtp->mail('*****@wanadoo.fr') or die 'Un problème est survenu avec la méthode mail() !';
Cette étape n’a une nouvelle fois rien de compliquée, et se calque parfaitement sur l’étape précédente, sauf que cette fois, c’est la méthode to()
qu’il faut utiliser. Une nouvelle fois, vous avez juste à indiquer l’adresse e-mail comme paramètre de la fonction.
#Étape 3
$smtp->to('*****@hotmail.fr') or die 'Un problème est survenu avec la méthode to() !';
Comme je le disais lors de la présentation des différentes fonctions, il est possible d’indiquer plusieurs destinataires. Chaque adresse représente alors un paramètre.
#Étape 3
$smtp->to('*****@hotmail.fr', '******@yahoo.fr', '******@gmail.com') or die 'Un problème est survenu avec la méthode to() !';
Si vous souhaitez envoyer des copies ou des copies cachées à des destinataires à l’aide des méthodes cc()
et bcc()
, c’est à la fin de cette étape qu’il faut le faire. En ce qui concerne la syntaxe, c’est exactement la même que pour la méthode to()
!
C’est dans cette étape, tout se corse puisque nous n’allons pas utiliser une, mais 3 méthodes ! Chacune correspondant à une étape :
Pour réaliser ces 3 étapes, nous allons respectivement utiliser les méthodes data()
, datasend()
et dataend()
.
Pour rappel, seule la méthode datasend()
prend un paramètre, à savoir le contenu de votre message !
Voici tout de suite un exemple d’utilisation.
#Étape 4
$smtp->data() or die 'Un problème est survenu avec la méthode data() !';
$smtp->datasend('J\'apprends à envoyer des mails en Perl !') or die 'Un problème est survenu avec la méthode datasend() !';
$smtp->dataend() or die 'Un problème est survenu avec la méthode dataend() !';
A noter que la méthode datasend()
peut s’utiliser autant de fois que l’on souhaite. Ainsi, si l’on reprend l’exemple précédent, il est tout à fait possible et correct d’écrire :
#Étape 4
$smtp->data() or die 'Un problème est survenu avec la méthode data() !';
$smtp->datasend('J\'apprends à envoyer ') or die 'Un problème est survenu avec la méthode datasend() !';
$smtp->datasend('des mails en Perl !') or die 'Un problème est survenu avec la méthode datasend() !';
$smtp->dataend() or die 'Un problème est survenu avec la méthode dataend()
Nous voilà enfin à la dernière étape qui consiste à fermer proprement la connexion avec le serveur. Pour ce faire, c’est la méthode quit()
qu’il faut utiliser.
#Étape 5
$smtp->quit() or die 'Un problème est survenu avec la méthode quit() !';
Voici le code complet de ce que nous avons vu ensemble sur l’envoi d’un e-mail grâce au module Net::SMTP :
#!usr/bin/perl -w
use strict;
use Net::SMTP;
#Étape 1
my $smtp = Net::SMTP->new('smtp.wanadoo.fr') or die 'Impossible de se connecter au serveur : ' . $!;
#Étape 2
$smtp->mail('*****@wanadoo.fr') or die 'Un problème est survenu avec la méthode mail() !';
#Étape 3
$smtp->to('*****@hotmail.fr') or die 'Un problème est survenu avec la méthode to() !';
#$smtp->cc('*****@hotmail.fr') or die 'Un problème est survenu avec la méthode cc() !';
#$smtp->bcc('*****@hotmail.fr') or die 'Un problème est survenu avec la méthode bcc() !';
#Étape 4
$smtp->data() or die 'Un problème est survenu avec la méthode data() !';
$smtp->datasend('J\'apprends à envoyer des mails en Perl !') or die 'Un problème est survenu avec la méthode datasend() !';
$smtp->dataend() or die 'Un problème est survenu avec la méthode dataend() !';
#Étape 5
$smtp->quit() or die 'Un problème est survenu avec la méthode quit() !';
Comment mettre un objet à mon e-mail ?
Le protocole SMTP ne prévoit pas l’ajout d’un objet, c’est pourquoi il faudra l’insérer en tant qu’en-tête dans le corps de votre message en utilisant la méthode datasend()
.
#Étape 4
$smtp->data();
$smtp->datasend('Subject: Hello !'); #En-tête
$smtp->datasend("\n"); #Séparateur en-tête/corps
$smtp->datasend('J\'apprends à envoyer des mails en Perl !'); #Corps du message
$smtp->dataend();
Dans le même esprit, il est conseillé d’ajouter les en-têtes From
et To
qui permettront à votre message de ne pas atterrir dans le dossier spams de vos contacts !
Voici donc un exemple complet reprenant les 3 en-têtes ainsi que le corps du message à proprement parlé.
#Étape 4
$smtp->data();
$smtp->datasend( << 'MESSAGE' );
From: Wapiti89 <*****@wanadoo.fr>
To: Coupain <*****@voila.fr>
Subject: Hello !
J'apprends à envoyer des mails en Perl !
MESSAGE
$smtp->dataend();
Comment ajouter une pièce jointe dans mon e-mail ?
Pour faire simple, nous allons admettre que le module Net::SMTP ne sait pas le faire. Ce module ne s’occupe en réalité que d’envoyer des données, il ne se préoccupe pas du contenu (texte simple, (x)HTML, fichier, et.). Bien sûr ce n’est pas impossible, mais c’est plus du ressort du bidouillage. C’est pourquoi, nous verrons par la suite comment utiliser le module MIME::Lite qui permet d’ajouter des pièces jointes de manière propre. ;)
La liste des méthodes données au cours de ce chapitre n’est évidemment pas une liste exhaustive ! S’il vous manque quelque chose, je vous encourage fortement à jeter un œil à la documentation officielle !
Maintenant que vous savez envoyer des e-mails, il est grand temps de voir comment consulter ceux que l’on reçoit !