Utiliser le serveur james (pop, smtp et nntp)

Utiliser le serveur james (pop, smtp et nntp)

C'est bien, c'est beau, c'est gratuit... c'est Java.

Avant-propos

Ce tutoriel va expliquer comment configurer ce logiciel JAVA multiplateforme.

Le but sera ici multiple :
- savoir utiliser le logiciel,
- être capable de générer une configuration.

Installation

James est une application Java dédiée à la gestion des mails sur LAN ou Internet. Il fonctionne sur tout système d'exploitation supportant la machine Java (Windows, Unix...). Sa taille est supérieure à 8 Mo.

Il supporte :

  • SMTP [25] : protocole pour envoyer des mails
  • POP3 [110] : protocole pour recevoir des mails
  • NNTP [119] : gestion de news (sorte de forum dont l'accès se fait depuis votre client de messagerie Outlook ou Thunderbird)

Vous avez donc besoin :

  • d'un ordinateur
  • du JDK ou JRE de Sun (version la plus récente conseillée !!)
  • de James 2.0.x
  • de Phoenix 4.0.x (c'est un container fourni avec James et dont la version 4.0 connaît un bug)
  • éventuellement d'une connexion Internet (James peut s'en passer si vous décidez d'en faire un serveur local ou LAN)
  • de l'espace disque car de nombreux mails vont transiter

Rendez-vous sur le site http://james.apache.org pour télécharger ce logiciel libre, gratuit et illimité.

Décompressez l'archive compressée dans un répertoire tel qu'il n'y ait pas de caractères accentués dans le chemin d'accès !! Si vous ne faîtes pas ça, James n'arrivera pas à se lancer.

La documentation de James demande de définir préalablement la variable environnementale JAVA_HOME. Préférons les chemins courts MS-DOS avec tilda et sans espace.

  • Sous Windows 9x, éditez le fichier AUTOEXEC.BAT et redémarrez
  • Sous Windows NT, dans les propriétés système, onglet Avancé, bouton Variables d'environnement
  • Sous Unix, certains le savent sûrement mieux que moi.

Sous Unix, les ports inférieurs à 1024 sont restreints à l'utilisateur Root. James doit donc avoir les mêmes privilèges pour pouvoir fonctionner avec la configuration par défaut (sauf si vous décidez de changer les ports des différents protocoles).

Exécutez le fichier BAT (Windows) ou SH (Linux) du répertoire BIN de James. Ils sont déjà correctement écrits. Vous devez lire à l'écran :

Using PHOENIX_HOME: C:\James\
Using PHOENIX_TMPDIR: C:\James\temp
Using JAVA_HOME: C:\Progra~1\JRE\
Phoenix 4.0.1
James 2.2.0
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
Fetch POP Disabled
FetchMail Disabled

Le fonctionnement est assez simple. Quand vous lui envoyez un mail, tout tombe dans le SPOOL. De temps en temps, le ménage est fait : soit c'est un mail local dans tel cas il est déplacé dans INBOXES (succès) ou ADDRESS-ERROR (échec), soit c'est un mail externe et alors James se prend pour un relais.

Ces différents dossiers stockent les messages reçus et à envoyer, les utilisateurs, les alias... Par contre, il est préférable d'utiliser des bases de données JDBC pour accroître la vitesse et les performances de traitement. James accepte aussi une administration distante sur le port 4555 (ce sera indispensable par la suite).

Configuration

Vous devez arrêter James ! pour faire apparaître les fichiers de configuration non fournis au départ, mais générés à l'arrêt du logiciel.
D'où : 1) Start, 2) Stop, 3) Edit, 4) Restart

Chemins d'accès

Même si ce n'est pas écrit dans la documentation de James, les utilisateurs de Windows doivent lever toute ambiguïté. Par exemple :
file://var/mail/inboxes/ == > file:///C:/James/var/mail/inboxes/

C'EST IMPERATIF ! VOUS RISQUEZ DE TOUT CHOPER SOUS LA RACINE DE C:\

A répéter sur toutes les entrées du fichier CONFIG.XML en remarquant que "file:" est suivi de 3 "/".

Serveur DNS

En général, c'est la machine elle-même qui peut le faire.
Les adresses locales sont généralement réparties sur 3 domaines : 127.*.*.*, 192.168.*.* et 10.*.*.*

<dnsserver>
  <servers>
    <server>127.0.0.1</server>
    <!-- <server>192.168.0.1</server> -->
    <!-- <server>10.0.0.1</server>  -->
  </servers>
  <autodiscover>true</autodiscover>
  <authoritative>false</authoritative>
</dnsserver>

Serveur POP3

C'est la réception des mails. Le port 110 est standard, le SSL/TLS utilise le 995.

<pop3server enabled="true">
  <port>110</port>
  <handler>
    <helloName autodetect="true">localhost</helloName>
    <connectiontimeout>120000</connectiontimeout>
  </handler>
</pop3server>

Serveur SMTP

C'est l'envoi des mails. Le port 25 est standard. On fixe la taille des mails sortant à 8 Mo, ce qui est généralement courant. Même si à la base la valeur est 0 (illimité), il est prudent de ne pas se prendre des Gigas dans la figure.

<smtpserver enabled="true">
  <port>25</port>
  <handler>
    <helloName autodetect="true">localhost</helloName>
    <connectiontimeout>360000</connectiontimeout>
    <!-- <authRequired>false</authRequired> -->
    <!-- <authorizedAddresses>127.0.0.1</authorizedAddresses> -->
    <!-- <verifyIdentity>true</verifyIdentity> -->
    <maxmessagesize>8388608</maxmessagesize>
  </handler>
</smtpserver>

ATTENTION : la documentation de James propose plus d'informations concernant l'empêchement que votre serveur devienne un relais pour le spam.

Définissons aussi, un serveur SMTP relais si nécessaire grâce au gateway :

<processor name="transport">
  <mailet match="All" class="RemoteDelivery">
    ...
    <gateway> smtp.free.fr </gateway>
    <gatewayPort>25</gatewayPort>
  </mailet>
</processor>

Serveur NNTP

C'est les news. James précise que c'est une fonctionnalité expérimentale qui nécessitera probablement une mise à jour dans l'avenir. Le port est 119, ou 563 si sécurisé SSL/TLS.

<nntpserver enabled="true">
  <port>119</port>
  <handler>
    <helloName autodetect="true">localhost</helloName>
    <connectiontimeout>120000</connectiontimeout>
    <authRequired>false</authRequired>
  </handler>
</nntpserver>

FetchPOP

Désactivé, car déprécié.

<fetchpop enabled="false">
  <fetch name="mydomain.com">
    <host>localhost</host>
    <user>postmaster</user>
    <password>pass</password>
    <interval>600000</interval>
  </fetch>
</fetchpop>

FetchMAIL

Par défaut, FetchMail est désactivé. Il permet de gérer des filtres. Le sujet étant très large, le mieux est de consulter vous-même la documentation de James sur le site officiel.

RemoteManager

Vous devez changer l'utilisateur et le mot de passe de l'administration distante. Ça permet de gérer les comptes utilisateur à distance. Vous pouvez mettre plusieurs utilisateur en ajoutant une balise account.

<remotemanager>
  <port>4555</port>
  <handler>
    <helloName autodetect="true">localhost</helloName>
    <administrator_accounts>
      <account login="NomDUtilisateur" password="MotDePasse"/>
    </administrator_accounts>
    <connectiontimeout>150000</connectiontimeout>
  </handler>
</remotemanager>

Ensuite, dans une commande DOS, voici ce qui se passe.

C:\Windows>telnet

Bienvenue dans le client Telnet Microsoft
Microsoft Telnet> open localhost 4555
Connexion à localhost...

JAMES Remote Administration Tool 2.2.0
Please enter your login and password
Login id:
User1234
Password:
Pass1234
Welcome User1234. 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

listusers
Existing accounts 0

quit
Bye

Perte de la connexion à l'hôte.
Appuyez sur une touche pour continuer...

Microsoft Telnet>quit

C:\Windows>exit

Si vous n'arrivez pas à réaliser toutes ces commandes, ne continuez pas. Ceci doit marcher impérativement. Mais j'espère que cet exemple vous a montré comment il sera facile de gérer les utilisateurs. Pour un réseau, cette administration est bien pratique car l'administrateur n'a pas à jouer de sa présence ou du FTP pour modifier les fichiers de configuration. Naturellement, il faut choisir un mot de passe difficile, car la sécurité de tous les comptes mails en dépend.

Par défaut, James ne contient pas de compte utilisateur.

Normalement, le port standard TelNet est 23. Si vous changez le port, vous aurez simplement à faire "open localhost" sans spécifier le port particulier (qui était 4555).

Une fois que les utilisateurs seront correctement créés, il est conseillé de désactiver l'administration distante et de redémarrer James :

<remotemanager enabled= "false">

Fonctionnement global du serveur

C'est James qu'on va taquiner maintenant. Il faut fixer :

  • le mail de l'administrateur
  • la gestion de la casse
  • l'activation des alias
  • le forwarding
  • l'activation des alias
  • comment stocker les mails (là, ce sera des fichiers)
  • liste des domaines considérés comme locaux
 <James>
  <postmaster>postermaster@localhost</postmaster>
  <servernames autodetect="true" autodetectIP="true">
    <servername>localhost</servername>
    <servername>127.0.0.1</servername>
  </servernames>
  <usernames ignoreCase="true" enableAliases="true" enableForwarding="true"/>
  <inboxRepository>
    <repository destinationURL=" file://var/mail/inboxes/ " type="MAIL"/>
  </inboxRepository>
 </James>

Supposons que nous ayons un compte "TOTO", alors la section SERVERNAMES nous indique d'ores-et-déjà que le mail de cet utilisateur sera "toto@localhost" ou "toto@[127.0.0.1]".

Ajouter des utilisateurs

Comme déjà dit, l'ajout se fait à distance. C'est pour cela qu'il faut que ça marche. On peut aussi utiliser HyperTerminal si on veut. Il est important de ne pas faire de fautes d'orthographe.

Welcome User1234. HELP for a list of commands

adduser toto PwdTota
User toto added

adduser nana PwdNana
Use nana added

setpassword toto PwdToto
Password for toto reset

adduser postmaster AdminPass
User postmaster added

listusers
Existing accounts 3
user: nana
user: postmaster
user: toto

quit

Des fichiers ".Repository.FileObjectStore" ont été créés dans le répertoire USERS\ et on comprend pourquoi cela ne se fait pas manuellement avec un simple éditeur de texte. Les mots de passe sont hachés avec SHA. Les noms des fichiers sont tout simplement le dump hexadécimal dans la table ASCII de l'utilisateur en question.

Phase des tests

On va enfin pouvoir tester James grandeur nature :P
Lancez James.

Recevoir des mails

Du moment que les comptes utilisateurs ont été créés, le POP3 fonctionne. Dans le client de messagerie, il suffit de rentrer son mot de passe et les mails sont rapatriés.

Contacter des gens dont le mail est local

Lancez votre client de message (Outlook ou Thunderbird) et créez un compte pour l'utilisateur "postmaster" configuré tel que le mail de retour soit "postmaster@localhost".

Si on envoie un mail à "toto@localhost", le dossier INBOXES fait apparaître un dossier TOTO avec deux fichiers dedans :

  • .Repository.FileObjectStore : des informations sur le mail
  • .Repository.FileStreamStore : le contenu du mail du même nom

Faisons-nous passer pour "unknown@localhost" et renvoyons un mail à Toto. Bien que le mail "unknown@localhost" n'existe pas dans la base, Toto reçoit bien un mail. Il peut alors se demander qui a vraiment envoyé le mail. En général, c'est à cela que sert l'envoi authentifié des mails : empêcher que ça se produise.

Reprenons l'envoyeur "postmaster@localhost" et envoyons un mail à "jexistepas@localhost". Biensûr, le mail ne sera pas délivré, car "jexistepas" n'est pas un utilisateur de la base. Il tombe dans le répertoire ADDRESS-ERROR et le postmaster reçoit éventuellement un mail (si configuré pour).

Envoyer des mails sur des serveurs relais intermédiaires

Ecrivons à "toto@localhsot" (avec la faute d'orthographe !). Le mail tombe forcément dans OUTGOING\ dans l'espoir que le serveur relais suivant sera apte à résoudre le domaine "localhsot".

Plus sérieusement, on peut envoyer un mail à "machin@free.fr" depuis James en local. Le mail tombe dans OUTGOING\, puis part dans le monde via le gateway (si activé).

Ce système de gateway permet de relier deux serveurs de mails ensemble, des machines antispam ou antivirales. Sorte de division du travail...

Trucs et astuces sur les mails

Voir les Provided Matchers de la documentation de James pour plus d'informations.

Tout se fait dans CONFIG.XML

Supprimer les pièces jointes sensibles

Ceci est important, car tous les mails contenant des exécutables seront effacés. Plutôt sympathique pour lutter contre les virus !

  • attachment : enlève tout fichier joint
  • passTrough : coupe la transmission du mail
  • bounce : prévient l'envoyeur
  • prefix : ajoute un préfixe dans l'objet du mail d'avertissement
  • notice : donne les caractéristiques du mail envoyé

http://wiki.apache.org/james/HandlingExceptions

<spoolmanager>
  <processor name="root">
    <mailet match="AttachmentFileNameIs=*.exe,*.com,*.bat,*.pif,*.scr,*.vbs,*.eml,*.avi,*.mp3,*.mpeg,*.shs" class="Bounce" onMatchException="noMatch">
      <attachment>none</attachment>
      <passThrough>false</passThrough>
      <prefix>[REJECTED] </prefix>
      <notice>Mail rejected due to risky attached file</notice>
    </mailet>
  </processor>
</spoolmanager>

Ainsi, le message de retour est :

Object: [REJECTED]Tentative d'envoi
Message:

Mail rejected due to risky attached file.

Message details:
Subject: Tentative d'envoi
Sent date: Sat May 13 17:52:11 CEST 2006
MAIL FROM: postmaster@localhost
RCPT TO: toto@localhost
From: "Postmaster" <postmaster@localhost>
To: <toto@localhost>
Size (in bytes): 557

Si la ligne rouge est enlevée, le mail d'erreur comporte une pièce jointe qui n'est ni plus ni moins que le mail refusé. Pratique pour renvoyer le mail sous une nouvelle forme acceptable.

Ejecter les mails vers exterieur par relais

Ne fait que répéter ce qui a déjà été plus haut sur le GATEWAY.

<spoolmanager>
  <processor name="transport">
    ...
    <mailet match="All" class="RemoteDelivery">
      <outgoing> file://var/mail/outgoing/ </outgoing>
      <delayTime>  5 minutes </delayTime>
      <delayTime> 10 minutes </delayTime>
      <delayTime> 45 minutes </delayTime>
      <delayTime>  2 hours </delayTime>
      <delayTime>  3 hours </delayTime>
      <delayTime>  6 hours </delayTime>
      <maxRetries> 25 </maxRetries>
      <deliveryThreads> 1 </deliveryThreads>
      <sendpartial>false</sendpartial>
      <gateway> smtp.free.fr </gateway>
      <gatewayPort>25</gatewayPort>
    </mailet>
  </processor>
</spoolmanager>

Empêcher un utilisateur de recevoir un mail

On pourrait certes enlever l'utilisateur de la base (peut toujours envoyer mail sauf si authentification requise), mais faisons-le avec la configuration pour que vous compreniez.

Sans message de retour :

<spoolmanager>
  <processor name="root">
    <mailet match=" RecipientIs=toto@localhost " class="Null"/>
  </processor>
</spoolmanager>

Avec message de retour à l'envoyeur :

<spoolmanager>
  <processor name="root">
    <mailet match=" RecipientIs=toto@localhost " class="Bounce">
      <passThrough>false</passThrough>
      <prefix>[UNJOINABLE] </prefix>
      <notice>The user can't be contacted with this email address</notice>
    </mailet>
  </processor>
</spoolmanager>

Le message d'erreur est de la forme :

Object: [UNJOINABLE]Hello Toto
Message:

The user can't be contacted with this email address.

Message details:
Subject: Salut
Sent date: Sat May 13 18:10:31 CEST 2006
MAIL FROM: postmaster@localhost
RCPT TO: toto@localhost
From: "Postmaster" <postmaster@localhost>
To: <toto@localhost>
Size (in bytes): 1155

On aurait pû aussi utiliser UserIs qui ne regarde pas le domaine.

<mailet match="UserIs=toto,nana" class="Bounce">

Recevoir des mails, mais ne pas pouvoir en envoyer

C'est le même principe. On remplace "RecipientIs" par "SenderIs".

SMTP authentifié pour éviter l'OpenRelay

De la même manière qu'on s'authentifie pour récupérer ses mails, on peut s'authentifier pour en envoyer. L'intérêt est de ne pas pouvoir envoyer un mail vers l'extérieur à la place de quelqu'un d'autre. Consulter la documentation.

Activer les transferts sécurisés

Le SSL et TLS (Transfert Layer Socket) sont des technologies de cryptage à ajouter manuellement à Java : Sun Java Secure Sockets Extension (JSSE) infrastructure.
http://java.sun.com/jsse

Tout se joue ensuite sur la balise USETLS, mais consultez la documentation officielle pour plus d'informations.

Relayage avec SendMail sous Unix

Consulter une fois de plus la documentation de James. L'explication est très claire..

Créer un alias pour contacter un groupe de personnes

L'alias ALL est complètement virtuel (il n'a pas besoin d'exister dans la base). C'est juste un support pour réécriture...

<spoolmanager>
  <processor name="root">
    <mailet match="RecipientIs=all@localhost" class="Forward">
      <forwardto> nana@localhost</forwardto>
      <forwardto> toto@localhost</forwardto>
    </mailet>
  </processor>
</spoolmanager>

Bloquer les envoyeurs d'un autre domaine

Ca permet de bloquer les envoyeurs se prenant pour "machin@free.fr" alors que seules les adresses "@localhost" sont autorisées. Envoyer des mails à "truc@free.fr" est bien sûr possible, même en se prenant pour "jetemmerde@localhost".

<mailet match="RemoteAddrNotInNetwork=127.*,192.168.*" class="ToProcessor">
  <processor> relay-denied </processor>
  <notice>550 - Requested action not taken: relaying denied</notice>
</mailet>

Le protocole DNS ne doit pas être bloqué, sinon les IP ne pourront pas être résolues.

Extras...

Il sera alors facile de :

  • faire une copie au postmaster quand X envoie un mail à Y
  • modifier dynamiquement le sujet d'un mail
  • supprimer les mails non destinés aux domaines réseaux autorisés
  • ...

Console TelNet

Ou comment envoyer un mail en utilisant une fenêtre DOS... N'oubliez pas les "<" et ">" entre les adresses mail, sinon ça ne marchera pas.

TelNet>open localhost 25
220 localhost SMTP Server (JAMES SMTP Server 2.2.0) ready [DATE *

hello LOCALHOST
250 localhost Hello LOCALHOST (localhost [127.0.0.1 * )

mail from: <postmaster@localhost>
250 Sender <postmaster@localhost> OK

rcpt to: <postmaster@localhost>
250 Recipient <postmaster@localhost> OK

data
354 Ok Send data ending with <CRLF>.<CRLF>

subject: Test du mail

Je m'envoie un mail à moi même
.

250 Message received

quit
221 localhost Service closing transmission channel

Le point sur une seule ligne délimite la fin du mail. Le sujet se met avant le corps du mail en sautant une ou plusieurs lignes !

Utiliser James en PHP

Faut déjà arrêter Apache. Ensuite faut éditer PHP.INI :

[mail function]
SMTP = localhost
sendmail_from = postmaster@localhost

Ensuite, pour envoyer un mail, c'est tout simple :

<?php
  mail('toto@localhost', 'Sujet', 'Message du mail');
?>

Bien sûr, en utilisant des librairies PHP plus évoluées, vous pourrez (en PHP toujours) envoyer des mails avec des pièces jointes et compagnie.

Créer son forum de news (NNTP)

C'est ce qu'il y a de plus rapide. Il suffit de se donner le port 119 et configurer le nom des groupes de discussion !

<nntpserver enabled="true">
   <port>119</port>
   <handler>
      <helloName autodetect="true">localhost</helloName>
      <connectiontimeout>150000</connectiontimeout>
      <authRequired>false</authRequired>
   </handler>
</nntpserver>
<nntp-repository>
   <readOnly>true</readOnly>
   <rootPath>file:///C:/james/var/nntp/groups</rootPath>
   <tempPath>file:///C:/james/var/nntp/temp</tempPath>
   <articleIDPath>file:///C:/james/var/nntp/articleid</articleIDPath>
   <articleIDDomainSuffix>localhost</articleIDDomainSuffix>
   <newsgroups>
      <newsgroup>localhost.james</newsgroup>
      <newsgroup>localhost.freespace</newsgroup>
   </newsgroups>
   <spool>
      <configuration>
         <spoolPath>file:///C:/james/var/nntp/spool</spoolPath>
         <threadCount>5</threadCount>
         <threadIdleTime>10000</threadIdleTime>
      </configuration>
   </spool>
</nntp-repository>

Ensuite, il suffit de faire joujou avec Outlook ou Thunderbird en rajoutant un compte pour NNTP (News), d'ajouter localhost et de s'abonner aux forums qui vous intéressent.

Pour supprimer un forum, il faut bien sûr éditer le fichier de config, mais il faut aussi effacer les dossiers appropriés dans apps\james\var\nntp\groups\

Si vous voulez que les utilisateurs s'authentifient pour accéder aux news, mettez TRUE dans <authRequired>. Utile pour les forums privés.

Conclusion

Au final, c'est vous qui devez sentir si votre serveur est bien ou mal configuré.

grandvizir, http://altert.family.free.fr/

Ce document intitulé « Utiliser le serveur james (pop, smtp et nntp) » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous