Search code examples
javaemailapache-commons-email

How to send multiple emails in one session?


I want to send thousands of different emails to different recipients and would like to open the connection to my SMTP and hold it. I hope this is faster then reopen the connection for ervy mail. I would like to use Apache Commons Email for that, but could fall back to the Java Mail API if necessary.

Right now I'am doing this, what opens a closes the connection every time:

HtmlEmail email = new HtmlEmail();
email.setHostName(server.getHostName());
email.setSmtpPort(server.getPort());
email.setAuthenticator(new DefaultAuthenticator(server.getUsername(), server.getPassword()));
email.setTLS(true);
email.setFrom("[email protected]");
email.addTo(to);
email.setSubject(subject);
email.setHtmlMsg(htmlMsg);
email.send();

Solution

  • Here is my performance test class. Sending the mails using one connection is 4 times faster then reopen the connection every time (what happens when you use commons mail). The performance can be pushed further by using multiple threads.

        Properties properties = System.getProperties();
        properties.put("mail.smtp.host", server);
        properties.put("mail.smtp.port", "" + port);
    
        Session session = Session.getInstance(properties);
        Transport transport = session.getTransport("smtp");
    
        transport.connect(server, username, password);
    
        for (int i = 0; i < count; i++) {
    
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            message.setRecipients(Message.RecipientType.TO, address);
    
            message.setSubject(subject + "JavaMail API");
            message.setSentDate(new Date());
    
            setHTMLContent(message);
            message.saveChanges();
            transport.sendMessage(message, address);
    
        }
    
        transport.close();