En java, comment tester en simulant l’envoi de mail?

L'objet de ce billet est de répondre à la question posée dans le titre. Précisément, en mode non connecté, comment simuler l'envoi de mail?
Ici, on ne traite pas la notion d'envoi en masse.

C'est un problème récurrent qui s'impose avant ou durant les tests/recettes des programmes java envoyant des mails (surtout en masse).

L'utilisation du serveur mail de l'entreprise (ou de gmail) peut être pénalisant surtout lorsqu'il s'agit d'envoi en masse ou encore durant les mises au point.
En six actes, nous donnons la démarche accompagnée d'une démo.
La démo s'appuie sur Spring bien qu'il n'est pas nécessaire ici (mais difficile de s'en passer).

En effet avec Spring, nous écrivons beaucoup moins de plomberie de l'API mail java.
La démo est un projet Java standard.
Toutes les indications de configuration des jar nécessaires ou de Spring sont détaillées.

La démo est réalisée sous windows mais le principe est le même pour les machines linux.

Passons à la pratique...

Acte 1: Télécharger smtp.jar

Acte 2: Déposer ce jar dans un répertoire de votre choix, nommons-le SMTP_REP

Acte 3: Avec la console, se déplacer dans le répertoire SMTP_JAR puis lancer la commande: java -jar smtp.jar

                    Laisser la console ouverte.

Acte 4: Configurer le classpath du projet java

Créer sous eclipse un projet java standard. Ajouter les jars suivants:
 spring-2.5.6.jar, spring-test-2.5.6.jar
 mail-1.4.2.jar, activation-1.1.jar
JUnit-4.4.jar ( éviter de prendre JUnit 4.5 bugué?)
jsr250-api-1.0.jar commons-logging-1.1.1.jar

Acte 5: Créer un fichier de configuration de Spring nommé spring-mail.xml dont voici son contenu:

 [code xml]

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<!-- component-scan necessaire pour l'injection autowiring -->
  <context:component-scan base-package=
      "fr.netapsys.blog.simulatemail" />
	
<bean id="mailSender" 
       class="org.springframework.mail.javamail.JavaMailSenderImpl">
	<property name="host" value="localhost" /> 
	<property name="javaMailProperties">
			<props>
				<prop key="mail.debug">false</prop>
			</props>
	</property>
</bean></beans>

La seule chose à signaler est que nous allons utiliser la classe de Spring nommée JavaMailSenderImpl.
La propriété "host" pointe vers "localhost". C'est ce que nous désirons et que nous expliquons plus loin.
Le reste des propriétés ne sont pas utiles pour notre démo.
Eventuellement, lorsque mail.debug est à true, les logs du serveur mail sont verbeux.

Les commentaires insérés dans le fichier sont utiles.

Acte 6: Ecrivons un peu de code java , une seule classe nommée fr.netapsys.blog.simulatemail.MailSenderSpring

 [code JAVA]

package fr.netapsys.blog.simulatemail;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.*;
@Service
public class MailSenderSpring {
   private JavaMailSender mailSender;						
   public void send(final String mailTo, final String from,  final String subject,
        final String bodyMail) throws MailSendException, MailException {
    // classe anonyme Preparator
    MimeMessagePreparator preparator=new MimeMessagePreparator() {
	public void prepare(MimeMessage mimeMessage) 
               throws MessagingException {
    MimeMessageHelper helper=null;
    // use the true flag to indicate a multipart message
    helper = new MimeMessageHelper(mimeMessage, false);
    helper.setTo(mailTo);
    helper.setFrom(from);
    helper.setSubject(subject);
    helper.setText(bodyMail, true);
    }
    };
   this.mailSender.send(preparator);
}
@Resource(name="mailSender")
  public void setMailSender(JavaMailSender mailSender) {
    this.mailSender = mailSender;
  }
}

Acte 7: Un test unitaire avec Junit: Ajouter dans eclipse une classe Junit test case nommée "TestSenderMail"

 [code java]

package fr.netapsys.blog.tests;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import fr.netapsys.blog.simulatemail.MailSenderSpring;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (locations = {"classpath*:spring-mail.xml" }) 
public class TestSenderMail {
 @Resource
 protected  MailSenderSpring mailSenderSpring;
	
 @Test public void testSendMail() {
  mailSenderSpring.send( "toto@g.fr","from@m.fr","sujet tst mail"," body ....");
	//no Assert !
 }
}

Dans eclipse, clique droit sur la classe Junit puis run as Junit Test.

On obtient sur la console Dos laissé ouverte quelques messages utiles sur l'ouverture d'une session smtp.
Et dans le répertoire SMTP_REP, des fichiers logs et un .mht qui récapitulent les éléments liés à l'envoi de mail.
Je vous laissent les découvrir.

Conclusion:

C'est simple!.

En résumé, lancer smtp.jar et configurer votre mailSession ou les propriétés de votre serveur mail pointant vers localhost et le tour est joué.


Enjoy!

Billet inspiré de la lecture de tririga

3 commentaires

  1. Attention a l’inversion de t et de p dans la dernière phrase de ce billet « En résumé, lancer smpt.jar « .

    Article utile merci bien Abderrazek.

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.