nithril / smtp-connection-pool

SMTP Connection Pool
Apache License 2.0
47 stars 19 forks source link

SMTP Connection Pool

This library implements a SMTP connection pool using Jakarta Mail formerly known as Java Mail for the SMTP code and the Apache Commons Pool for the pool code.

The pool, thanks to the Apache library, supports most common pool features:

Requirements

Java 1.8

Maven dependency

Search for the latest version on Maven central:

eg.:

<dependency>
    <groupId>com.github.nithril</groupId>
    <artifactId>smtp-connection-pool</artifactId>
    <version>1.4.0</version>
</dependency>

How to use the connection pool?

The SmtpConnectionPool creates a JavaMail Transport using a SmtpConnectionFactory.

Smtp Connection Factory

The SmtpConnectionFactory can be created using different ways.

If you already have a configured Session

SmtpConnectionFactory factory = SmtpConnectionFactories.newSmtpFactory(aSession);

JavaMail will retrieve the protocol, host, username... from the Session.

You can build the factory using a builder

SmtpConnectionFactory factory = SmtpConnectionFactoryBuilder.newSmtpBuilder()
                .session(aSession)
                .protocol("smtp") 
                .host("mailer")
                .port(2525)
                .username("foo")
                .password("bar").build();

All builder parameters are optionals. JavaMail will fallback to the default configuration (smtp, port 25...)

You can instanciate directly the factory

new SmtpConnectionFactory(aSession, aTransportStrategy, aConnectionStrategy);

Where:

Smtp Connection Pool

Java code:


//Declare the factory and the connection pool, usually at the application startup
SmtpConnectionPool smtpConnectionPool = new SmtpConnectionPool(SmtpConnectionFactoryBuilder.newSmtpBuilder().build());

//borrow an object in a try-with-resource statement or call `close` by yourself
try (ClosableSmtpConnection transport = smtpConnectionPool.borrowObject()) {
    MimeMessage mimeMessage = new MimeMessage(transport.getSession());
    mimeMessage.addRecipients(Message.RecipientType.TO, to);
    mimeMessage.setFrom("from@example.com");
    mimeMessage.setSubject("Hi!");
    mimeMessage.setText("Hello World!");
    transport.sendMessage(mimeMessage);
}

//Close the pool, usually when the application shutdown
smtpConnectionPool.close();

How to configure the pool?

Configuration is held by the Pool code, see the Commons Pool Javadoc.

Example:


//Create the configuration
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(2);

//Declare the factory and the connection pool, usually at application startup
SmtpConnectionPool smtpConnectionPool = new SmtpConnectionPool(SmtpConnectionFactoryBuilder.newSmtpBuilder().build(), config);