JavaMail

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));
}
}
}

On this page


Edit this page