Configuration d’une session JavaMail JNDI

Tout à commencé à cause d'un port de serveur mail mal configuré. Le serveur client était ralentit voir bloqué lors d’envoi de mails depuis l'application ou de mails d'erreur via mon api de log.

Une fois la configuration corrigée, j'ai poussé le zèle jusqu'à vouloir que mon application soit résiliente aux erreurs de configuration du serveur mail client. Solution, mettre un timeout pour empêcher les logs de s'enliser dans un accès impossible vers le serveur de mail et géré les exception côté métier pour les envoie de mails depuis l'application.

Problème, autant sur la partie applicative ayant la main sur le service d'envoi de mail j'ai pu rajouter aisément mes paramètres de timeout, autant côté logs l'API ne me facilitait pas la tache.
Solution, centraliser la configuration de la session de mail pour ces deux service différents. Et c'est là que JNDI intervient.

La suite de ce poste indique les étapes à suivre pour configurer une session JavaMail en JNDI puis son branchement au Sender de JavaMail et à mon api de log en l’occurrence logback.

L’exemple a été testé avec la configuration suivante :

  • tomcat 6
  • mail 1.4.1
  • activation 1.1
  • logback 1.0.9
  • spring-context-support 3.0.5

Configuration de la session Mail JNDI

Etape 1 : configuration du tomcat

Installation des jar mail.jar et activation.jar dans les common/lib de tomcat
ATTENTION ne pas oublier d'exclure ces dépendances de vos wars pour ne pas avoir de doublon des jars entre tomcat et votre application.

Etape 2 : configuration de la session JNDI

Dans scr/main/webapp/META-INF/context.xml

<!-- JavaMail session factory : cf. doc package com.sun.mail.smtp -->
<!-- 
  Cet exemple peut être placé dans le repertoire scr/main/webapp/META-INF/context.xml 
  ou directement dans le fichier context.xml du tomcat 6.
  cf. http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JavaMail_Sessions
-->
<!-- 	
  IMPORTANT : mettre un timeout/connectiontimeout (ex: 5000) pour éviter les bloquage
  lors d'envoie de mails avec une mauvaise configuration (ex: mauvais port)
-->
<Resource name="mail/Session" 
  auth="Container"
  type="javax.mail.Session" 
  username="xxx@gmail.com"
  password="********" 
  mail.debug="false"
  mail.user="xxx@gmail.com" 
  mail.password="********"
  mail.transport.protocol="smtp" 
  mail.smtp.host="smtp.gmail.com"
  mail.smtp.port="587" 
  mail.smtp.auth="true"
  mail.smtp.starttls.enable="true"
  mail.smtp.timeout="5000"
  mail.smtp.connectiontimeout="5000" />

Etape optionnelle : déclaration dans l'application d'une ressource JNDI

Dans le scr/main/webapp/WEB-INF/web.xml :

<!-- Déclaration d'une session d'envoi de mail accessible en JNDI pour les logs cf. scr/main/webapp/META-INF/context.xml -->
<resource-ref>
  <description>Session d'envoie de mail</description>
  <res-ref-name>${filter.email.jndi.session.name}</res-ref-name>
  <res-type>javax.mail.Session</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

Configuration des services utilisant la session JNDI.

Attention ne pas oublier que l'adresse JNDI de la session correspond au nom préfixé de 'java:comp/env/'

Etape 3 : Configuration de l'envoi d'email via logback

<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender" >
  <SessionViaJNDI>true</SessionViaJNDI>
  <JndiLocation>java:comp/env/mail/Session</JndiLocation>
  <AsynchronousSending>false</AsynchronousSending>
  <To>to@netapsys.fr</To>
  <From>from@netapsys.fr</From>
  <Subject>[ERROR] monAppli: %m</Subject>
  <layout class="ch.qos.logback.classic.html.HTMLLayout">
    <pattern>%date%level%logger%msg</pattern>
  </layout>
</appender>

Etape 4 : Configuration de l'envoi d'email via l'api JavaMail et spring

Dans le fichier de contexte spring :

<bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName">
    <value>java:comp/env/mail/Session</value>
  </property>
</bean>
<bean id="emailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  <property name="session" ref="mailSession" />
</bean>

Liens :

  • http://logback.qos.ch/manual/appenders.html
  • http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JavaMail_Sessions
  • http://mail-archives.apache.org/mod_mbox/tomcat-users/200611.mbox/%3C456F8124.2030101@ceti.pl%3E

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.