smtp4j
Par Cédric Tabin le vendredi 21.05.2021, 22:00 - Java - Lien permanent
Afin d'effectuer des tests unitaires d'envoi de mail dans notre application Java, j'ai eu besoin d'une API pouvant simuler un serveur SMTP afin de pouvoir vérifier les messages envoyés.
La seule API Java simple d'utilisation sur laquelle je suis tombé est dumbster. Cette API permet de facilement effectuer des vérifications basiques, mais cela devient vite problématique dès que les messages contiennent des caractères accentués. Étant également assez vieille et non maintenue, j'ai pris la décision d'en implémenter une nouvelle basée sur le même fonctionnement.
Voici donc smtp4j ! Elle garde les mêmes concepts de base:
- implémentation basique d'un serveur SMTP
- les messages sont stockés en mémoire
- facile à utiliser
Toutefois, j'y ai ajouté mon grain de sel pour corriger/améliorer les points suivants:
- support des accents
- support complet des messages MIME Multipart (avec pièces jointes)
- accès aux données source du protocole SMTP
- utilitaire pour facilement générer un Message (coté client)
Voici un exemple d'utilisation:
//création du serveur SMTP local sur le port 1025 SmtpServerBuilder builder = new SmtpServerBuilder(); try(SmtpServer server = builder.withPort(1025).start()) { /* envoi/attente du message */ //récupération des messages reçus List<SmtpMessage> messages = server.getReceivedMessages(); //accès au contenu du message SmtpMessage receivedMessage = messages.get(0); String from = receivedMessage.getFrom(); String subject = receivedMessage.getSubject(); String body = receivedMessage.getBody(); Date sentDate = receivedMessage.getSentDate(); List<String> recipientsTo = receivedMessage.getRecipients(RecipientType.TO); List<SmtpAttachment> attachments = receivedMessage.getAttachments(); //suppression des messages reçus server.clearReceivedMessages(); }
Afin de pouvoir facilement générer un message (ou mail) coté client, l'API fournit également un petit utilitaire:
Session session = Session.getInstance(props); MimeMessageBuilder messageBuilder = new MimeMessageBuilder(session); messageBuilder.from("source@smtp4j.local"). to("target1@smtp4j.local", "John Doe <john@smtp4j.local>"). cc("target3@smtp4j.local"). subject("Hello, world !"). body("Hello\r\nGreetings from smtp4j !\r\n\r\nBye."); messageBuilder.send();
Cette classe peut être utilisée pour créer des messages à destination de n'importe quel serveur SMTP et peut donc être utilisée également en production.
Pour les autres fonctionnalités, la javadoc est assez complète ainsi que la documentation directement sur GitHub. Enjoy !