When an application provides support for sending and receiving emails we need to be able to write test cases to automate the verification of this functionality. Green mail is a great library for Implementing this functionality. Greenmail provide support for various mail protocols such as smtp, smtps, pop3 , pop3s , imap and imaps.
You can start a Greenmail server to listen with all these protocols enabled and listening on localhost with two lines of code.
GreenMail greenMail = new GreenMail();
greenMail.start();
When the server is started as above, the default ports of the above supported protocols are offset by 3000.
SMTP : 3025 SMTPS : 3465 POP3 : 3110 POP3S : 3995 IMAP : 3143 IMAPS : 3993
However, if you start the server as above, more often than not, there will be a port conflict with some other program resulting in exceptions. Therefore you can configure the GreenMail server with the ServerSetup object with the protocol , binding address and port.
ServerSetup setup = new ServerSetup(3025, "localhost", "smtp");
GreenMail greenMail = new GreenMail(setup);
You can register a user to the server by using setUser method.
greenMail.setUser("user1@mail.com", "user1", "user1");
In order to receive mails from greenmail server object, waitForIncomingEmail method is available.
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
In order to find more details, take a look at the source code at https://github.com/greenmail-mail-test/greenmail
Following is a sample on how to send a mail using java mail and receive it using greenmail with user authentication enabled.
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetup;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Properties;
public class GreenMailTest {
public static void main(String[] args) throws InterruptedException, IOException, MessagingException {
ServerSetup setup = new ServerSetup(3025, "localhost", "smtp");
GreenMail greenMail = new GreenMail(setup);
greenMail.setUser("user1@mail.com", "user1", "user1");
greenMail.start();
final String username = "user1";
final String password = "user1";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", "3025");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
Message message = new MimeMessage(session);
message.setSubject("Mail Subject");
message.setText("Mail content");
message.setFrom(new InternetAddress("user1@mail.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("user1@mail.com"));
Transport.send(message);
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
System.out.println("Message length =>" + messages.length);
System.out.println("Subject => " + messages[0].getSubject());
System.out.println("Content => " + messages[0].getContent().toString());
System.out.println("Done");
greenMail.stop();
}
}
You can start a Greenmail server to listen with all these protocols enabled and listening on localhost with two lines of code.
GreenMail greenMail = new GreenMail();
greenMail.start();
When the server is started as above, the default ports of the above supported protocols are offset by 3000.
SMTP : 3025 SMTPS : 3465 POP3 : 3110 POP3S : 3995 IMAP : 3143 IMAPS : 3993
However, if you start the server as above, more often than not, there will be a port conflict with some other program resulting in exceptions. Therefore you can configure the GreenMail server with the ServerSetup object with the protocol , binding address and port.
ServerSetup setup = new ServerSetup(3025, "localhost", "smtp");
GreenMail greenMail = new GreenMail(setup);
You can register a user to the server by using setUser method.
greenMail.setUser("user1@mail.com", "user1", "user1");
In order to receive mails from greenmail server object, waitForIncomingEmail method is available.
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
In order to find more details, take a look at the source code at https://github.com/greenmail-mail-test/greenmail
Following is a sample on how to send a mail using java mail and receive it using greenmail with user authentication enabled.
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetup;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Properties;
public class GreenMailTest {
public static void main(String[] args) throws InterruptedException, IOException, MessagingException {
ServerSetup setup = new ServerSetup(3025, "localhost", "smtp");
GreenMail greenMail = new GreenMail(setup);
greenMail.setUser("user1@mail.com", "user1", "user1");
greenMail.start();
final String username = "user1";
final String password = "user1";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", "3025");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
Message message = new MimeMessage(session);
message.setSubject("Mail Subject");
message.setText("Mail content");
message.setFrom(new InternetAddress("user1@mail.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("user1@mail.com"));
Transport.send(message);
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
System.out.println("Message length =>" + messages.length);
System.out.println("Subject => " + messages[0].getSubject());
System.out.println("Content => " + messages[0].getContent().toString());
System.out.println("Done");
greenMail.stop();
}
}