Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau 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.

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:

  1. 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>
    
  2. 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-domaineutilisateur 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:

Image:Receiving email (POP).png

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