jeudi 24 février 2011

Mettre en place rapidement un serveur mail de test

Introduction

Nos applications on bien souvent besoin d'envoyer des mails. Nous ne disposons pourtant pas toujours d'un serveur de mail disponible immédiatement. Avec Apache James, j'expliquerai comment créer un tel serveur en moins de 15 minutes et comment court-circuiter des adresses mail publiques.


Un mode de communication omniprésent

Qu'il s'agisse d'alertes ou de simples informations, le mail est devenu un élément central dans les modes de communication d'une application. On les retrouve, par exemple, dans les cas suivants :

  • Informer les clients des offres promotionnelles du moment (ex : FNAC, Amazon, ...)
  • Informer l'utilisateur d'une connexion a son compte (ex : OVH)
  • Alerter l'administrateur sur la santé de ses serveurs (ex : la plupart des serveurs UNIX)

Aujourd'hui, les courriers électroniques sont largement utilisés dans de très nombreux domaines. Nous aurions tort de nous en priver...


Contexte

Nous souhaitons tester une application de commerce en ligne.

Notre cahier des charges mentionne l'envoi massif de courriers électroniques pour informer les utilisateurs de bons plans totalement inédits. Nous devons donc disposer d'utilisateurs et de boites mail de test.

Dans un premier temps, nous créerons un nom de domaine de test qui hébergera toutes nos adresses mail : PingtimeoutMailServer.fr.
Dans un second temps, nous tenterons d'usurper le domaine gmail.com de sorte que tous les mails envoyé à destination de GMail soient capturés par notre serveur.

Top chrono.


Choix du serveur de mail

Il existe un grand nombre de serveurs de mail, parmi lesquels ont peut citer Postfix, Microsoft Exchage Server et IBM Lotus Domino.

Dans cette multitude de solutions, on trouve également Apache James, un serveur SMTP et POP3 open-source entièrement écrit en Java, que nous retenons.

Note : ma confiance dans les solutions soutenues par la fondation Apache me pousse à utiliser James dans ce tutoriel. Il est bien évidemment possible d'obtenir le même résultat avec d'autres serveurs.

Téléchargeons donc Apache James v2.3.2 depuis le site officiel (http://james.apache.org/)


Installation et configuration basique

Attention : les opérations de ce tutoriel doivent être exécutées en tant que root. En effet, sous UNIX, il faut disposer des droits du super-utilisateur pour pouvoir utiliser les ports inférieurs à 1024.

1 - Modifier le fichier /etc/hosts pour qu'il contienne la ligne suivante :

127.0.0.1   PingtimeoutMailServer.fr

2 - Créer le dossier /opt/

3 - Extraire le contenu de l'archive james-binary-2.3.2.tar.gz dans le dossier /opt/

4 - Rendre exécutable les fichier .sh du dossier /opt/james-2.3.2/bin/

5 - Puis exécuter le fichier bin/run.sh de James. La console doit afficher ceci :

root@ubuntu:/opt/james-2.3.2# ./bin/run.sh 
Using PHOENIX_HOME:   /opt/james-2.3.2
Using PHOENIX_TMPDIR: /opt/james-2.3.2/temp
Using JAVA_HOME:      /usr/lib/jvm/java-6-sun/
Running Phoenix: 

Phoenix 4.2

James Mail Server 2.3.2
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
FetchMail Disabled

6 - Stopper James en utilisant le raccourci CTRL+C dans la console

7 - Editer le fichier /opt/james-2.3.2/apps/james/SAR-INF/config.xml. Localiser les lignes suivantes :

<servernames autodetect="true" autodetectIP="true">
 <servername>localhost</servername>
</servernames>
Les modifier pour qu'elles correspondent au listing suivant :
<servernames autodetect="true" autodetectIP="true">
 <servername>localhost</servername>
 <servername>PingtimeoutMailServer.fr</servername>
</servernames>

Localiser la section <dnsserver> et s'assurer que la balise <servers> ne contient aucun élément.

8 - Puis exécuter le fichier bin/run.sh de James pour redémarrer le serveur de mail.

Dans une autre console, créer un utilisateur de test (ici, on lui donne le mot de passe "password")

root@ubuntu:~# telnet localhost 4555
Trying ::1...
Connected to localhost.
Escape character is '^]'.
JAMES Remote Administration Tool 2.3.2
Please enter your login and password
Login id:
root
Password:
root
Welcome root. HELP for a list of commands
adduser ping password
User ping added
quit
Bye
Connection closed by foreign host.

Top. C'est terminé. Le serveur mail est configuré et complètement opérationnel.


Test de réception de mail

Ouvrir Mozilla Thunderbird (ou tout autre client mail de votre choix) puis créer un compte mail avec les paramètres suivants :

Type : Email account
Your Name : ping
Email Address : ping@PingtimeoutMailServer.fr
Type of incoming server : POP
Incoming Server : PingtimeoutMailServer.fr
Incoming User Name : ping
Outgoing Server Name : PingtimeoutMailServer.fr
Outgoing User Name : ping
Account Name : ping@PingtimeoutMailServer.fr

Ensuite, dans une console, envoyer un mail par telnet. Dans ce test, nous utilisons la méthode rustique.

root@ubuntu:~# telnet PingtimeoutMailServer.fr 25
Trying 127.0.0.1...
Connected to PingtimeoutMailServer.fr.
Escape character is '^]'.
220 ubuntu SMTP Server (JAMES SMTP Server 2.3.2) ready Thu, 24 Feb 2011 22:58:34 +0100 (CET)
HELO PingtimeoutMailServer.fr
250 ubuntu Hello PingtimeoutMailServer.fr (localhost [127.0.0.1])
mail from: <toto@AdresseInexistante.nul>
250 2.1.0 Sender <toto@AdresseInexistante.nul> OK
rcpt to: <ping@PingtimeoutMailServer.fr>
250 2.1.5 Recipient <ping@PingtimeoutMailServer.fr> OK
data
354 Ok Send data ending with <CRLF>.<CRLF>

Ceci est un e-mail de test

.
250 2.6.0 Message received
quit
221 2.0.0 ubuntu Service closing transmission channel
Connection closed by foreign host.

Dans Thunderbird, déplier le noeud "ping@PingtimeoutMailServer.fr" puis cliquer sur inbox. Saisir "password" comme mot de passe puis valider. Surprise, notre mail est bien arrivé.


Test d'envoi de mail

Dans Thunderbird, cliquer sur le bouton "Write" puis écrire un mail à destination de ping@PingtimeoutMailServer.fr

Cliquer ensuite sur le bouton "Get Mail". Comme prévu, le mail a bien été envoyé et reçu.

Nous avons donc un serveur d'envoi et de réception de mail qui fonctionne pour des adresses e-mail d'un domaine fantaisiste.


Court-circuiter des adresses mail publiques

Le paramétrage précédent nous a permis de tester l'envoi et la réception de mail depuis des adresses imaginaires.

Nous souhaitons maintenant nous assurer que tout mail que nous envoyons à destination d'un domaine publique (par exemple : gmail.com) soit capté par James comme nous l'avons fait pour le domaine PingtimeoutMailServer.fr.

Rien de plus simple, il suffit de s'assurer que les points suivants sont respectés :

  • Le fichier /etc/hosts du serveur doit rediriger le domaine gmail.com sur l'adresse locale 127.0.0.1
  • Le fichier /opt/james-2.3.2/apps/james/SAR-INF/config.xml doit inclure le domaine gmail.com dans la section servernames
  • Les adresses mail des destinataires doivent avoir été créées dans James

Une fois ces trois actions effectuées, c'est terminé. Toute tentative d'envoi de mail à une adresse en gmail.com sur le serveur James sera captée et conservée en local.


Conclusion

Nous avions bien dit en moins de 15 minutes. C'est chose faite :).

Il ne reste plus qu'à configurer notre serveur d'application pour qu'il utilise notre machine en tant que serveur de mail.

Vous utilisez une solution alternative ? Vous voyez des points à améliorer ? Discutons-en dans les commentaires !

P.L.