The JavaMail add-on integrates JavaMail API (JSR 919) with SeedStack.

Dependency

<dependency>
    <groupId>org.seedstack.addons.javamail</groupId>
    <artifactId>javamail</artifactId>
</dependency>
Show version
dependencies {
    compile("org.seedstack.addons.javamail:javamail:3.0.0")
}

You also need to add the JavaMail API itself:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.8</version>
</dependency>
dependencies {
    compile("javax.mail:mail:1.4.8")
}

Note that you need to specify the scope as provided if your runtime environment already provides the JavaMail API (such as JEE servers).

Configuration

Configuration is done by declaring one or more mail providers:

javamail:
  # Configured mail providers with the name of the cache as key
  providers:
    provider1:
      # Providers are fully configured with JavaMail session properties
      property1: value1

To dump the javamail configuration options:

mvn -q -Dargs="javamail" seedstack:config

Note that providers are fully configured by specifying JavaMail session properties.

SMTP

To configure an SMTP provider, use the following configuration:

javamail:
  providers:
    smtpProvider:
      mail.transport.protocol: smtp
      mail.smtp.host: ...
      mail.smtp.port: ...

IMAP

To configure an IMAP provider, use the following configuration:

javamail:
  providers:
    imapProvider:
      mail.store.protocol: imap
      mail.imap.user: ...
      mail.imap.host: ...
      mail.imap.port: ...

POP3

To configure a POP3 provider, use the following configuration:

javamail:
  providers:
    imapProvider:
      mail.store.protocol: pop3
      mail.pop3.user: ...
      mail.pop3.host: ...
      mail.pop3.port: ...

Usage

The configured providers will be injectable as a fully-configured JavaMail session:

public class SomeClass {
    @Inject
    @Named("provider1")
    private Session session;
}

Use the JavaMail API documentation to know more about usage.

Testing

JavaMail add-on provides testing fixtures which enable to emulate an SMTP server and easily assert that your sent mails are valid. Consider the following test configuration:

javamail:
  providers:
    smtpTest:
      mail.transport.protocol: smtp
      mail.smtp.host: localhost
      mail.smtp.port: 6457        

You can then use the @WithMailServer annotation and the MessageRetriever class in your tests:

@WithMailServer(host = "localhost", port = 6457)
public class SmtpSendingIT extends AbstractSeedIT {
    @Inject
    @Named("smtpTest")
    private Session smtpSession;

    @Inject
    private MessageRetriever retriever;

    @Test
    public void testSend() throws MessagingException {
        Transport transport = null;
        try {
            Message message = new MimeMessage(smtpSession);
            message.setRecipient(Message.RecipientType.TO, new InternetAddress("..."));
            message.setFrom(new InternetAddress("..."));
            message.setSubject("...");
            message.setText("...");
            message.setSentDate(new Date());

            transport = smtpSession.getTransport();
            transport.connect();
            transport.sendMessage(message, message.getAllRecipients());
        } finally {
            if (transport != null) {
                transport.close();
            }
        }

        for (Message message : retriever.getSentMessages()) {
            MockMailServerAssertions.assertThat(message)
                .hasRecipients(Message.RecipientType.TO);
            MockMailServerAssertions.assertThat(message)
                .recipientEqualsTo(Message.RecipientType.TO,
                        InternetAddress.parse(TestConstantsValues.DEFAULT_RECIPIENT));
        }
    }
}