/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.mail; /* * #%L * Mail * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.mail.MailService; import com.intuit.tank.vm.settings.MailConfig; import com.intuit.tank.vm.settings.MailMessage; import com.intuit.tank.vm.settings.TankConfig; /** * TankMailer * * @author dangleton * */ public class TankMailer implements MailService, Serializable { private static final long serialVersionUID = 1L; private static final Logger LOG = LogManager.getLogger(TankMailer.class); /** * @{inheritDoc */ @Override public void sendMail(MailMessage message, String... emailAddresses) { MailConfig mailConfig = new TankConfig().getMailConfig(); Properties props = new Properties(); props.put("mail.smtp.host", mailConfig.getSmtpHost()); props.put("mail.smtp.port", mailConfig.getSmtpPort()); Session mailSession = Session.getDefaultInstance(props); Message simpleMessage = new MimeMessage(mailSession); InternetAddress fromAddress = null; InternetAddress toAddress = null; try { fromAddress = new InternetAddress(mailConfig.getMailFrom()); simpleMessage.setFrom(fromAddress); for (String email : emailAddresses) { try { toAddress = new InternetAddress(email); simpleMessage.addRecipient(RecipientType.TO, toAddress); } catch (AddressException e) { LOG.warn("Error with recipient " + email + ": " + e.toString()); } } simpleMessage.setSubject(message.getSubject()); final MimeBodyPart textPart = new MimeBodyPart(); textPart.setContent(message.getPlainTextBody(), "text/plain"); textPart.setHeader("MIME-Version", "1.0"); textPart.setHeader("Content-Type", textPart.getContentType()); // HTML version final MimeBodyPart htmlPart = new MimeBodyPart(); // htmlPart.setContent(message.getHtmlBody(), "text/html"); htmlPart.setDataHandler(new DataHandler(new HTMLDataSource(message.getHtmlBody()))); htmlPart.setHeader("MIME-Version", "1.0"); htmlPart.setHeader("Content-Type", "text/html"); // Create the Multipart. Add BodyParts to it. final Multipart mp = new MimeMultipart("alternative"); mp.addBodyPart(textPart); mp.addBodyPart(htmlPart); // Set Multipart as the message's content simpleMessage.setContent(mp); simpleMessage.setHeader("MIME-Version", "1.0"); simpleMessage.setHeader("Content-Type", mp.getContentType()); logMsg(mailConfig.getSmtpHost(), simpleMessage); if (simpleMessage.getRecipients(RecipientType.TO) != null && simpleMessage.getRecipients(RecipientType.TO).length > 0) { Transport.send(simpleMessage); } } catch (MessagingException e) { throw new RuntimeException(e); } } private void logMsg(String host, Message m) { try { StringBuilder sb = new StringBuilder(); sb.append("To: ").append(StringUtils.join(m.getAllRecipients(), ',')).append('\n'); sb.append("From: ").append(StringUtils.join(m.getFrom(), ',')).append('\n'); sb.append("Subject: ").append(m.getSubject()).append('\n'); sb.append("Body: ").append(m.getContent()).append('\n'); LOG.info("Sending email to server (" + host + "):\n" + sb.toString()); } catch (Exception e) { LOG.error("Error generating log msg: " + e); } } /* * Inner class to act as a JAF datasource to send HTML e-mail content */ static class HTMLDataSource implements DataSource { private String html; public HTMLDataSource(String htmlString) { html = htmlString; } // Return html string in an InputStream. // A new stream must be returned each time. public InputStream getInputStream() throws IOException { if (html == null) throw new IOException("Null HTML"); return new ByteArrayInputStream(html.getBytes()); } public OutputStream getOutputStream() throws IOException { throw new IOException("This DataHandler cannot write HTML"); } public String getContentType() { return "text/html"; } public String getName() { return "text/html dataSource to send e-mail only"; } } }