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 !