Looking for Computer Science & Information Technology online
courses ?
Check my new web site: https://www.yesik.it !
Apache James est un serveur de courrier électronique libre écrit entièrement en Java. Dans cet article, nous allons voir comment installer Apache James en environnement Unix/Linux et le configurer pour créer un premier compte de messagerie.
Sommaire
Installation
A partir du site du projet Apache James (http://james.apache.org/), téléchargez l'archive de la dernière version de James disponible. Au moment où j'écrivais ces lignes, il s'agissait du fichier james-binary-2.3.1.tar.gz. Comme vous le voyez, j'ai téléchargé la version binaire. En effet, les sources ne m'intéressent pas pour l'instant.
Une fois l'archive de James sur votre disque dur, il faut la décompresser, ce qui créera un dossier contenant tous les fichiers de James:
sh$ tar xzf /path/to/james-binary-2.3.1.tar.gz sh$ cd james-2.3.1
Le sous-dossier bin contient les scripts nécessaires pour lancer le serveur. Néanmoins, les permissions sur ces fichiers ne sont pas conservées lors de l'extraction de l'archive. Il faut donc les restaurer:
sh$ chmod +x bin/*.sh
Maintenant, reste à lancer James Server. Comme celui-ci va ouvrir des sockets serveur sur des ports réservés (<1024), il faut être administrateur pour effectuer cette opération:
sh$ sudo JAVA_HOME=$JAVA_HOME bin/run.sh [sudo] password for sylvain: Using PHOENIX_HOME: /home/sylvain/james-2.3.1 Using PHOENIX_TMPDIR: /home/sylvain/james-2.3.1/temp Using JAVA_HOME: /usr/lib/jvm/java-6-sun-1.6.0.12 Running Phoenix: Phoenix 4.2 James Mail Server 2.3.1 Remote Manager Service started plain:4555 POP3 Service started plain:110 SMTP Service started plain:25 NNTP Service started plain:119 FetchMail Disabled

JAVA_HOME
Pour que le script run.sh fonctionne correctement, il faut définir la variable d'environnement JAVA_HOME pour désigner le répertoire racine de votre installation de Java.
Si celle-ci n'est pas définie dans l'environnement courant lorsque vous utilisez sudo il sera nécessaire de l'invoquer plutôt ainsi:
sh$ sudo JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.12 bin/run.sh
Bien sûr, il faudra indiquer le chemin du répertoire où est installé Java sur votre machine!

Address already in use
Si un message d'erreur au lancement de James Server de ce style apparaît:
org.apache.avalon.phoenix.containerkit.lifecycle.LifecycleException: Component named "smtpserver" failed to pass through the Starting stage. (Reason: java.net.BindException: Address already in use).
C'est le signe qu'un autre service de votre machine est à l'écoute sur un port définit dans la configuration de James. En particulier, sous Debian exim4 (un autre MTA - Mail Transfert Agent) est installé en standard. Il m'a fallut l'arrêter:
sh# /etc/init.d/exim4 stop Stopping MTA: exim4_listener.
Premier contact
Dans cette étape, nous allons créer un premier compte de courrier électronique pour tester James. Cette opération se fait en se connectant au serveur via telnet:
sh$ telnet localhost 4555 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. JAMES Remote Administration Tool 2.3.1 Please enter your login and password Login id: root Password: root Welcome root. HELP for a list of commands

Sécurité?
Avant d'aller plus loin, si vous envisagez l'administration à distance de votre serveur de courrier électronique James, je vous conseille:
- De changer le mot de passe d'administration dans le fichier /path/to/james/apps/james/SAR-INF/config.xml. Il serait très imprudent de laisser la valeur par défaut root/root:
<!-- ... --> <administrator_accounts> <!-- CHECKME! --> <!-- Change the default login/password. --> <account login="root" password="root"/> </administrator_accounts>
- De n'utiliser telnet(1) qu'au travers d'un tunnel ssh(1). En effet, comme vous le savez, telnet transmet les données en clair – ce qui permettrait d'intercepter votre mot de passe administrateur.
Configuration
La configuration du fonctionnement de Jame se fait dans le fichier /path/to/james/apps/james/SAR-INF/config.xml. Celui-ci est lu au démarrage de James, et les changements apportés nécessitent de redémarrer James pour être pris en compte.

Piège:
Le dossier apps/james/SAR-INF est extrait de l'archive james.sar lors du premier lancement du serveur. Il est donc nécessaire de lancer une fois James avant de modifier la configuration.
Nom de domaine
L'élément servername vous permet de configurer le nom de domaine DNS pour lequel James gère les messages:
<!-- ... -->
<servernames autodetect="true" autodetectIP="true">
<!-- CONFIRM? -->
<servername>localhost</servername>
</servernames>
Ici, je vais modifier la configuration pour accepter les mails à destination du domaine chicoree.fr (j'utilise perl -i pour faire la modification dans le fichier à partir de la ligne de commande. Mais vous pouvez plus simplement modifier le fichier avec votre éditeur préféré!):
sh$ cd /path/to/james sh$ cd apps/james sh$ perl -n -i -e 's:<servername>.*</servername>:<servername>chicoree.fr</servername>:; print' SAR-INF/config.xml
Mot de passe administrateur
<!-- ... --> <administrator_accounts> <!-- CHECKME! --> <!-- Change the default login/password. --> <account login="root" password="root"/> </administrator_accounts>
Comme signalé dans un encadré plus haut, il n'est vraiment pas prudent de laisser l'identifiant et le mot de passe par défaut pour le compte d'administration. Changeons donc cela tout de suite (bon, mon mot de passe n'est pas terrible, mais vous trouverez sûrement mieux!):
sh$ perl -n -i -e 's:<account login="[^"]*" password="[^"]*"/>:<account login="casimir" password="gloubiboulga1234"/>:; print' SAR-INF/config.xml
Liste des commandes
Comme le suggère l'invite de la console d'administration, la commande HELP permet d'obtenir la liste des commandes supportées par le serveur:
HELP Currently implemented commands: help display this help listusers display existing accounts countusers display the number of existing accounts adduser [username] [password] add a new user verify [username] verify if specified user exist deluser [username] delete existing user setpassword [username] [password] sets a user's password setalias [user] [alias] locally forwards all email for 'user' to 'alias' showalias [username] shows a user's current email alias unsetalias [user] unsets an alias for 'user' setforwarding [username] [emailaddress] forwards a user's email to another email address showforwarding [username] shows a user's current email forwarding unsetforwarding [username] removes a forward user [repositoryname] change to another user repository shutdown kills the current JVM (convenient when James is run as a daemon) quit close connection

Remarque:
Les commandes James sont insensibles à la casse.
Deux commandes utiles à connaître sont quit et shutdown. La plupart des autres commandes sont liées à la gestion des comptes utilisateurs, que nous aborderons un peu plus loin:
- quit
- Pour se déconnecter de la console d'administration. Après cette commande, le serveur tourne toujours.
- shutdown
- Pour arrêter le serveur.
Créer un compte
Créer un compte utilisateur dans le serveur de messagerie se fait à l'aide de la commande adduser. Vous pouvez aussi utiliser listuser pour afficher la liste de tous les comptes gérés par James:
adduser sylvain User sylvain added listusers Existing accounts 1 user: sylvain quit Bye Connection closed by foreign host.
Côté client...
Envoyer un message
Une fois le compte utilisateur créé, nous pouvons tenter de lui envoyer un mail. Dans votre client de messagerie préféré, créez un nouveau compte pour vous connecter au serveur SMTP (Simple Mail Transfert Protocol – Un protocole utilisé pour envoyer des courriers électroniques.) hébergé sur localhost, et envoyez un mail à utilisateur@nom-de-domaine où utilisateur correspond à l'utilisateur que vous avez ajouté, et nom-de-domaine correspond au domaine DNS auquel James est associé (voir plus haut). Dans mon cas, le destinataire était sylvain@chicoree.fr.
Si vous êtes amateur de la ligne de commande, vous pouvez aussi utiliser telnet pour vous connecter au serveur SMTP et lui envoyer directement des commandes:
sh$ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mobal SMTP Server (JAMES SMTP Server 2.3.1) ready Wed, 30 Dec 2009 02:53:37 +0100 (CET) EHLO here.com 250-mobal Hello here.com (localhost [127.0.0.1]) 250-PIPELINING 250 ENHANCEDSTATUSCODES MAIL FROM:<me@here.com> 250 2.1.0 Sender <me@here.com> OK RCPT TO:<sylvain@chicoree.fr> 250 2.1.5 Recipient <sylvain@chicoree.fr> OK DATA 354 Ok Send data ending with <CRLF>.<CRLF> Subject: Test James From: Sylvain <me@here.com> To: sylvain@chicoree.fr Content-Type: text/plain If you receive this message, the Apache James is working properly! . 250 2.6.0 Message received RSET 250 2.0.0 OK QUIT 221 2.0.0 mobal Service closing transmission channel Connection closed by foreign host.
Si tout est OK, le message devrait être reçu par James, stocké dans le répertoire $JAMES_HOME/apps/james/var/spool pendant quelques instants, puis délivré dans $JAMES_HOME/apps/james/var/inboxes/username/:
sh$ find var/mail/
var/mail/
var/mail/relay-denied
var/mail/inboxes
var/mail/inboxes/sylvain
var/mail/inboxes/sylvain/4D61696C313236323133373435323836322D30.Repository.FileObjectStore
var/mail/inboxes/sylvain/4D61696C313236323133373435323836322D30.Repository.FileStreamStore
var/mail/address-error
var/mail/spam
var/mail/spool
var/mail/error
var/mail/outgoing
Vous pouvez vous assurer que c'est bien le message envoyé qui a été reçu. Le contenu en est stocké en clair dans le fichier var/mail/inboxes/username/*.Repository.FileStreamStore:
sh$ cat var/mail/inboxes/sylvain/4D61696C313236323133373435323836322D30.Repository.FileStreamStore Return-Path: <me@here.com> Delivered-To: sylvain@chicoree.fr Received: from localhost ([127.0.0.1]) by mobal (JAMES SMTP Server 2.3.1) with SMTP ID 267 for <sylvain@chicoree.fr>; Wed, 30 Dec 2009 02:53:42 +0100 (CET) Subject: Test James From: Sylvain <me@here.com> To: sylvain@chicoree.fr Content-Type: text/plain If you receive this message, the Apache James is working properly!
Récupérer ses mails
Un serveur de messagerie qui permettrait de recevoir du courrier, mais pas de le récupérer serait ... hum ... peu pratique. James incorpore donc un serveur POP pour permettre aux utilisateurs de relever leur boîte mail.
Bien sûr, vous ne voulez pas que n'importe qui lise votre courrier, n'est-ce pas? Donc avant de poursuivre nous allons faire ce que nous aurions dû faire bien plus tôt: associer un mot de passe au compte de courrier de notre utilisateur. Si vous avez saisi la philosophie de James, vous vous doutez que nous allons nous y connecter via l'interface d'administration:
sh$ telnet localhost 4555 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. JAMES Remote Administration Tool 2.3.1 Please enter your login and password Login id: casimir Password: gloubiboulga1234 Welcome casimir. HELP for a list of commands help Currently implemented commands: help display this help listusers display existing accounts countusers display the number of existing accounts adduser [username] [password] add a new user verify [username] verify if specified user exist deluser [username] delete existing user setpassword [username] [password] sets a user's password setalias [user] [alias] locally forwards all email for 'user' to 'alias' showalias [username] shows a user's current email alias unsetalias [user] unsets an alias for 'user' setforwarding [username] [emailaddress] forwards a user's email to another email address showforwarding [username] shows a user's current email forwarding unsetforwarding [username] removes a forward user [repositoryname] change to another user repository shutdown kills the current JVM (convenient when James is run as a daemon) quit close connection setpassword sylvain 70'srules Password for sylvain reset quit Bye Connection closed by foreign host.

Note:
Comme l'indique la commande help, il est possible de définir directement le mot de passe lors de la création d'un utilisateur:
adduser sonia xyz1234
Désormais sylvain@chicoree.fr peut relever son courrier – à condition de fournir au serveur le mot de passe adéquat. Comme pour l'envoi, configurez votre client de messagerie avec les informations suivantes, et vous devriez pouvoir relever le mail envoyé précédemment:
- protocole POP;
- serveur localhost (ou l'adresse/le nom de la machine distante sur laquelle tourne James);
- utilisateur sylvain (ou le nom de l'utilisateur que vous avez créé dans James);
- identification par mot de passe.
Les amateurs de ligne de commande peuvent aussi relever leur courrier avec telnet:
sh$ telnet localhost 110 +OK mobal POP3 server (JAMES POP3 Server 2.3.1) ready USER sylvain +OK PASS 70'srules +OK Welcome sylvain LIST +OK 1 597 1 597 . RETR 1 +OK Message follows Return-Path: <me@here.com> Delivered-To: sylvain@chicoree.fr Received: from localhost ([127.0.0.1]) by mobal (JAMES SMTP Server 2.3.1) with SMTP ID 86 for <sylvain@chicoree.fr>; Wed, 30 Dec 2009 21:04:54 +0100 (CET) Subject: Test James From: Sylvain <me@here.com> To: sylvain@chicoree.fr Content-Type: text/plain If you receive this message, the Apache James is working properly! . DELE 1 +OK Message deleted QUIT +OK Apache James POP3 Server signing off.
En résumé
Comme nous venons de le voir, Apache James est un serveur de messagerie supportant les protocoles POP et SMTP. Quand à sa configuration et sa gestion, elle se fait essentiellement via le fichier config.conf et la console d'administration accessible par telnet.
Si incontestablement Apache James a pour lui la simplicité de mise en oeuvre, un autre de ses grands atouts, dont nous n'avons pas parlé ici, est son côté extensible. Ainsi, il est possible d'écrire en Java des mailets c'est à dire des éléments de code chargés de traiter les courriers arrivants. Si vous êtes comme moi, vous trouvez certainement cette perspective excitante! Alors, si ce n'est déja fait, dépêchez vous d'installer James pour essayer d'en savoir plus...
Ressources
- http://james.apache.org/server/2.3.1/installation_instructions.html – Installation de James 2.3.1