AccueilProjetsPortFolioPhotosCVContact
Mailster 0.9.3 Nouveau | MailsterSMTP 1.0.0-M2 Nouveau | Apache MINA 2.0 & Proxy Connector 

MailsterSMTP 1.0.0-M2 Nouveau

Mise en ligne le 10/02/2009

MailsterSMTP est le fruit de plusieurs mois de travail dont voici un bref résumé. SubethaSMTP est une librairie SMTP que j'ai découvert après quelques mois de travail sur Mailster et le serveur SMTP dérivé de Dumbster (un serveur SMTP basique en java) que j'y ai intégré. Il ma semblé que cette librairie possédait certaines qualités qui en faisait une alternative viable. Cependant comme je voulais disposer d'un serveur SMTP utilisant les NIO, j'ai donc crée un patch que j'ai intégré dans les versions 2.x de la librairie après que l'on m'ai demandé de rejoindre l'équipe du projet. Ce patch améliorait la librairie en différents points et modifiait sa couche réseau qui passait alors d'un mode IO synchrone à des IO asynchrones reposant sur le framework NIO à hautes performances de la fondation Apache nommé MINA.

Récemment, les administrateurs du projet SubEthaSMTP ont décidé d'abandonner la branche 2.x pour revenir à l'API bloquante classique principalement à cause de la complexité accrue du coeur de la librairie. Après maintes discussions pour comprendre le pourquoi de cette soudaine décision, on peut reconnaître une certaine logique sur le fond bien que motivée par des contraintes très liées à leur utilisation de la librairie (comme l'utilisation de la librairie dans du code J2EE avec une gestion de transaction de type conteneur).

J'ai donc décidé de quitter le projet et de développer MailsterSMTP à partir des restes du code dont j'ai été le contributeur principal ces deux dernières années. Le but est de se libérer un peu des contraintes de l'existant (même s'il sera simple de porter les anciens programmes) et d'améliorer un certain nombre de points dont ceux listés dans le changelog ci dessous :

En bref ...
»  Type
Serveur SMTP en Java
»  Téléchargements
  • 1.0.0-M2

  • 1.0.0-M1
  • »  Progression
    Intégré dans Mailster 0.9.1
    »  Dernière version
    1.0.0-M2
    »  Technologies
    Java JDK1.5+, Mina NIO framework
    »  License
    APL v2.0


    Cliquer sur l'icône pour afficher/masquerListe des changements
    1.0.0-M2
    Codename: A new dawn
    • Ajout du fichier de license ASF.
    • Ajout de javadoc.
    • Refactoring de la classe SMTPServer class afin d'utiliser un objet de configuration qui rend le code interne plus propre et moins enchevêtré.
    • Ajout de javadoc sur chaque option de configuration pour mettre en évidence le moment où elles sont lues.
    • Les paramètres charset et dataDeferredSize seront maintenant relus à chaque démarrage du serveur.
    • Suppression de la méthode getHelp(..) method dans l'interface Command.
    • Les objets de type Command disposent maintenant d'une référence directe envers leur CommandHandler.
    • Les méthodes starp/stop ont été retravaillées et une méthode shutdown ajoutée à la classe SMTPServer permettant ainsi de redémarrer de multiples fois la même instance jusqu'à que la méthode shutdown soit appellée.
    • Suppression du pool de threads de l'acceptor qui n'est plus utilisé depuis la migration vers MINA 2.
    • Ajout d'un constructeur sans arguments à la classe SMTPServer pour faciliter l'utilisation de la classe.
    • Ajout de logs en mode trace dans l'implémentation par défaut du DeliveryHandler.
    • Amélioration de 10% du transfert de gros fchiers en supprimant des copies inutiles de IoBuffer à cause de la fonction d'auto agrandissement de celui-ci.
    • DefaultDeliveryHandler amélioré contre les modifications concurrentes de sa liste de remise.
    • Correction de l'état interne après la fin d'un transfert de données. Ce n'est plus au DeliveryHandler de remettre à zéro l'état à la fin de la méthode data(...) car la méthode resetMessageState() sera appelé automatiquement.
    • Extraction des classes Delivery et SharedStreamUtils depuis la classe AbstractDeliveryHandler pour prévenir encore plus la duplication de code dans les implémentations customisées.
    • Ajout d'un test renvoyant une NPE dans l'API d'authentification pour empêcher une factory de renvoyer une instance nulle.
    1.0.0-M1
    Nom de code: The 5th Of November
    • Migration vers la version 2.0.0-M4 de MINA (pour remplacer l'utilisation d'une version 1.1.x avant).
    • Gros refactoring de l'ensemble du code pour en améliorer l'apprentissage et la compréhension
    • Ajout de tests junit pour les nouvelles fonctionnalités
    • Suppression de certaines classes et interfaces qui ne faisaient que rendre le code plus complexe.
    • Nettoyage de l'API notamment par le renommage de certaines classes afin qu'elles reflètent mieux leur fonction.
    • On peut désormais ajouter un MessageListener à la volée à un serveur SMTP qui écoutera immédiatement les événements des nouvelles connections.
    • La nouvelle MessageDelivery API permet de contrôler la remise des messages en évitant au développeur la charge de réécrire ou de 'réinventer la roue' en réutilisant le code disponible et déjà testé de la class abstraite AbstractDeliveryHandler.
    • Correction de la commande Help qui évite de présenter la pseudo commande DATA_END dans la liste des commandes disponibles et reformatage de l'ensemble des messages d'aide.
    • Suppression de reset inutiles de l'état de la session SMTP.
    • Résolution d'un problème potentiel de synchronisation dans la méthode WiserMessage.getData() qui a de plus été marquée @deprecated car c'est une mauvaise idée de design.
    • Ajout du SessionContext à l'API MessageListener : cela permet de stocker des attributs privés du code client qui sont disponibles tout au long de la session, et de fournir l'adresse IP ou le les crédits d'authentification du client afin de faciliter l'implémentation du MessageListener.
    • Correction de l'annonce des méthodes d'authentification supportées de la commande EHLO.
    • Correction du code d'erreur retourné quand une exception TooMuchDataException est levée.
    • Suppression de la commande VRFY qui n'était pas implémentée mais présente alors qu'elle n'est pas nécessaire dans l'implémentation du protocole SMTP.
    • Ajout de quelques classes implémentant le design pattern Adapter pour réduire l'écriture de code dans les applications simples.
    • Correction de l'AuthenticationHandler et du LoginValidator pour qu'ils lèvent la bonne exception.
    • Correction d'un bug rare de synchronisation qui permet de réémettre une commande AUTH immédiatement après une authentification réussie.
    • Correction du traitement des erreurs de syntaxe et des messages retournés dans ces cas.

  • L'API MessageListener
  • click the icon to display/hide Exemple 1 - Un serveur basique

    click the icon to display/hide Exemple 2 - Un serveur basique avec le support des authentifications de type LOGIN et PLAIN


  • La nouvelle API DeliveryHandler


  • Cette nouvelle API permet de contrôler plus précisément la façon dont les mails sont remis. Par exemple on peut : ajouter du code pour tester si l'envoyeur ou les receveurs sont autorisés ; ajouter des logs aux méthodes ; remettre chaque message à chaque listener ou bien encore avoir un listener qui recevra toujours une copie de chaque email ; stocker chaque email dans une base de donnée etc ...

    La classe abstraite AbstractDeliveryHandler fournit un certain nombre de méthodes utiles telles que getPrivateInputStream(...) qui permet à chaque listener de lire son stream privé (qui est une instance partagé du stream original) sans bloquer les autres listeners ce qui améliore la parallèlisation du traitement. Vous pouvez aussi examiner l'implémentation par défaut fournie dans le code pour comprendre comment utiliser cette API.

    Exemple 3 - Utilisation d'un handler de remise customisé

    click the icon to display/hide Le serveur

    click the icon to display/hide L'implémentation customisée de la remise de mail

    Copyright De Oliveira Edouard 2006-2013 ©. Tous droits réservés. (maj le 18/01/2012)