Since I created this library Mailgun has released an official Java library. Please check it. You might want to use it instead of this one, as it has more features and is maintained by the Mailgun team. I haven't used it myself.
This is a small Java library to ease the sending of email messages using the great Mailgun service. It uses the RESTful Java client library Jersey.
What is Mailgun?
An email sending service with a REST API.
What is Jersey?
A RESTful java library. Actually, the reference implementation of JAX-RS, the standard API for RESTful web services for Java.
Version 2.x.x uses jakarta.*
package naming.
If you need the legacy javax.*
package naming, please stick with 1.x.x versions.
Add the dependency to your project:
implementation 'net.sargue:mailgun:2.0.0'
<dependency>
<groupId>net.sargue</groupId>
<artifactId>mailgun</artifactId>
<version>2.0.0</version>
</dependency>
This project depends on the Jersey library (see above). The Jersey library is part of the bigger glassfish/Oracle ecosystem which apparently doesn't have top-notch compatibility very high on its priority list.
Said so, you may encounter problems with dependencies as there are some libraries which are repackaged under different Maven coordinates and will leak duplicates on your classpath.
Please, see issue #1 for details and workarounds. Thanks for your understanding.
The library is pretty straighforward. You just need to remember two classes:
Configuration
: which usually is a singleton you build once and re-useMail
: the entry point to build and send emailsMailContent
: an optional helper to build HTML and text message bodys
That were three classes but the last one is optional although very useful if you want to send some simple messages in HTML.
The library is built to be used as a fluent interface, almost a DSL, so the code is quite self-explanatory.
You can browse the javadocs published thanks to the great javadoc.io service.
The runtime requirement is Java 8 or higher.
Depends on Jersey 2 client.
There is not. Android is not officially supported. I have no experience on Android development, so I won't be able to help much on any issue. There are a number of issues raised which indicate that the library can be used on Android but YMMV.
The main issue about using this library on android is the repackaging of some packages done by Jersey, like javax.inject
. If using gradle you could try to add this:
configurations {
all*.exclude group: 'org.glassfish.hk2.external', module:'javax.inject'
}
Anyway try it and if you find a problem please report it. I will try to help.
First, you need to prepare a Configuration
object used by the library.
Usually you can do this once and keep the same object for all your calls. It is thread safe.
Configuration configuration = new Configuration()
.domain("somedomain.com")
.apiKey("key-xxxxxxxxxxxxxxxxxxxxxxxxx")
.from("Test account", "postmaster@somedomain.com");
The default configuration por the API base URL is the US endpoint. If you are using a different endpoint you should set the base URL manually on the configuration object.
Example to use the EU (European) endpoint:
Configuration configuration = new Configuration()
.domain("somedomain.com")
.apiUrl("https://api.eu.mailgun.net/v3")
.apiKey("key-xxxxxxxxxxxxxxxxxxxxxxxxx")
.from("Test account", "postmaster@somedomain.com");
Mail.using(configuration)
.to("marty@mcfly.com")
.subject("This is the subject")
.text("Hello world!")
.build()
.send();
Mail.using(configuration)
.to("marty@mcfly.com")
.subject("This message has an text attachment")
.text("Please find attached a file.")
.multipart()
.attachment(new File("/path/to/image.jpg"))
.build()
.send();
Some fields (more or less the ones that make sense) can be repeated.
Like to()
to send to multiple recipients, attachment()
to include
more than one attachment and so on.
Mail.using(configuration)
.to("marty@mcfly.com")
.to("george@mcfly.com")
.cc("lorraine@mcfly.com")
.cc("dave@mcfly.com")
.subject("This is the subject")
.text("Hello world!")
.build()
.send();
Mail.using(configuration)
.to("marty@mcfly.com")
.subject("This message has an text attachment")
.text("Please find attached a file.")
.multipart()
.attachment(new File("/path/to/image.jpg"))
.attachment(new File("/path/to/report.pdf"))
.build()
.send();
Mail.using(configuration)
.to("marty@mcfly.com")
.subject("Activate your account")
.template("account_activation")
.parameter("v:name", "Doc Brown")
.build()
.send();
The classes on the package net.sargue.mailgun.content
are designed
to easily build basic HTML
messages. It's not supposed to be used for building cutting edge responsive
modern HTML messages. It's just for simple cases where you need to send a
message with some basic HTML like tables and some formatting.
Some self-explanatory examples:
Mail.using(configuration)
.body()
.h1("This is a heading")
.p("And this some text")
.mail()
.to("marty@mcfly.com")
.subject("This is the subject")
.build()
.send();
Mail.using(configuration)
.body()
.h3("Monthly report")
.p("Report of the number of time travels this month")
.table()
.row("Marty", "5")
.row("Doc", "7")
.row("Einstein", "0")
.end()
.mail()
.to("marty@mcfly.com")
.subject("Monthly Delorean usage")
.build()
.send();
Of course, you can keep the body content and mail building separated.
Body body = Body.builder()
.h1("This is a heading")
.p("And this some text")
.build();
Mail.using(configuration)
.to("marty@mcfly.com")
.subject("This is the subject")
.content(body)
.build()
.send();
There is also a very powerful extension mechanism which are the content converters. Check it out with some more information about the these classes in the wiki.
The changelog is in a separate page.
There is a test suite using WireMock to mock the Mailgun REST API endpoint.
The mail content test suite is a work in progress right now.
All contributions are welcome. Use the issues' section to send feature requests. Pull requests are also welcome, just try to stick with the overall code style and provide some tests if possible.