Une route Camel v2, Spring & SMTP : Envoi de mail

Apache Camel est un framework open source permettant de faire l'EIP (Entreprise Integration Pattern).
On présente ici une démo concrète un peu avancée sous maven.
On combine Camel v2 et Spring pour réaliser l'envoi de mails.
L'illustration repose sur le protocole SMTP mais d'autres protocoles (POP3,..) peuvent être adaptés.
Spring offre son propre framework d'intégration avec un vocabulaire proche de la littérature EIP.
Prochainement, je présenterai Spring-Integration pour l'envoi de mails via son channel.

Passons à la pratique

Configuration de l'environnement de la démo

Créer le projet sous maven:
Créer, dans le workspace d'eclipse, le projet démo avec la commande maven interactive à lancer dans la console Dos:

mvn archetype:generate  -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-spring 

Saisir les réponses aux questions pour nommer le groupeId, l'artifactId (projet) et la version.
Un projet java standard est créé dans le workspace.

Tester la création du projet:

A ce stade, vous pouvez lancer la commande maven sous Dos:

mvn camel:run

Les résultats du traitement des fichiers xml s'affichent sur la console.

Importer le projet sous eclipse:

Toujours dans la console Dos, se déplacer dans le répertoire du projet puis lancer la commande maven:

mvn eclipse:eclipse

Importer le projet dans eclipse.
Il serait utile de jeter un œil sur le pom.xml
Consulter aussi sous META-INF/spring le fichier Spring camel-context.xml.
Celui-ci définit à l'aide du namespace camel le bean CamelContext qui sera lancé par Spring.

Ajouter l'envoi de mail:

Revenons maintenant au sujet de notre billet : l'envoi de mail.

Etape1. Ajouter des dépendances dans le pom

Compléter les dépendances dans le pom.xml en ajoutant ceci:

    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-mail</artifactId>
      <version>2.9.2</version>
 </dependency>

Etape2. Modifier le fichier Spring

Modifions le fichier camel-context.xml en remplaçant ( ou en ajouter un autre) le bloc <camel:camelContext par ceci:

  <camel:camelContext xmlns="http://camel.apache.org/schema/spring">
    <camel:routeBuilder ref="myMailRouteBuilder"/>
   </camel:camelContext> 
   <bean id="myMailRouteBuilder" class="fr.demo.camel.MyMailRouteBuilder"/>

Il nous reste à écrire la classe MyMailRouteBuilder dans le package fr.demo.camel, ou un autre, sans oublier d'adapter le xml.

Voici son code:

public class MyMailRouteBuilder extends RouteBuilder {
@Override
 public void configure() throws Exception {
	final String HOST_MAIL_OPTIONS = "smtp://localhost"
	+ "?username=achine&password=xxx"
	+ "&from=a.chine&subject=test"
	+ "&to=a.chine@netapsys.fr&debugMode=true";
	final String dateDuJour = 
               new SimpleDateFormat("dd/MM/yy HH:mm:ss")
			.format(Calendar.getInstance().getTime());
	Endpoint ep = endpoint(HOST_MAIL_OPTIONS);
	Exchange exchange = ep.createExchange();
	Message messageIn = exchange.getIn();
	messageIn.setBody("Hello Camel World!, le " + dateDuJour);
        //messageIn.addAttachment("logo.png", 
        // new DataHandler(new FileDataSource(
       //		"spring-mini-logo.png")));		
	ep.createProducer().process(exchange);
  }
}

Modifier les options (username, password, from, to, debugMode) avec les bonnes valeurs.
Facultativement, avant de tester notre démo lancer dans une console Dos séparé la commande:

java -jar smtp.jar 

Pour avoir plus d'explications sur ce point merci de revenir à mon billet.

Exécuter la démo en simulant l'envoi:

Enfin, lancer la commande:

mvn camel:run

Voilà c'est terminé.

Vous verrez sur la console les traces indiquant l'envoi (simulé) des mails comme ceci:

From: a.chine
To: a.chine@netapsys.fr
Message-ID: <....JavaMail.achine@localhost>
Subject: tests
MIME-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Hello Camel World!, le 10/06/12 11:37:40
.
250 OK
QUIT

Exécuter la démo avec envoi effectif des mails:

Pour effectuer l'envoi réel il suffit d'adapter localhost par votre serveur smtp et les options (username, password, from, to).
Vérifier pas que vous indiquez le bon port du serveur mail.

Enfin, optionnellement, vous pouvez dé-commenter les deux lignes de la classe MyMailRouteBuilder pour attacher des pièces jointes au mail.

Enjoy!

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.