Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Envoyer et recevoir des e-mails en Perl 5 (2/5) : Envoyer un e-mail avec Net::SMTP

9 août 2022

Au cours de ce chapitre, nous allons voir ensemble comment envoyer un e-mail à l’aide du module Net::SMTP.

Plan

Les différentes étapes

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 :

  • se connecter au serveur SMTP ;
  • indiquer l’adresse électronique de l’expéditeur ;
  • indiquer l’adresse électronique du destinataire ;
  • indiquer le contenu du message ;
  • quitter proprement le serveur.

Le module Net::SMTP

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 objet

Le module Net::SMTP est un module orienté objet. Cette méthode est donc le constructeur de la classe Net::SMTP.

Cette méthode peut prendre plusieurs paramètres comme par exemple :

  • le serveur auquel on souhaite se connecter ;
  • le mode débogage ;
  • durée limite pour établir la connexion.

mail() : indiquer l’expéditeur

Lorsque 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 destinataire

Cette 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 copie

Sur 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ée

Dans 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ées

Cette 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ées

Cette 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ées

Cette 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 serveur

Cette fonction permet de fermer proprement la connexion avec le serveur. Cette fonction ne prend pas de paramètre.

Implémentation Perl

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 :

  • se connecter au serveur SMTP ;
  • indiquer l’adresse électronique de l’expéditeur ;
  • indiquer l’adresse électronique du destinataire ;
  • indiquer le contenu du message ;
  • quitter proprement le serveur.

C’est parti !

Étape 1 : se connecter au serveur SMTP

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 :

  • le serveur auquel on souhaite se connecter ;
  • le mode débogage ;
  • durée limite pour établir la connexion.

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”.

Étape 2 : indiquer l’adresse électronique de l’expéditeur

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() !';

Étape 3 : indiquer l’adresse électronique du destinataire

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() !';

Étape 4 : indiquer le contenu du message

C’est dans cette étape, tout se corse puisque nous n’allons pas utiliser une, mais 3 méthodes ! Chacune correspondant à une étape :

  • initialiser la transmission des données ;
  • transmettre les données ;
  • clôturer la transmission des données.

Pour réaliser ces 3 étapes, nous allons respectivement utiliser les méthodes data(), datasend() et dataend().

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() !';
#É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() 

Étape 5 : quitter proprement le serveur

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() !';

Pour résumer

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() !';

Aller plus loin

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();

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();

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 !

Commentaires