package cc.blynk.server.notifications.mail; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.activation.DataHandler; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.*; import javax.mail.util.ByteArrayDataSource; import java.util.Properties; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 14.09.16. */ public class SparkPostMailClient implements MailClient { private static final Logger log = LogManager.getLogger(SparkPostMailClient.class); private final Session session; private final InternetAddress from; private final String host; private final String username; private final String password; public SparkPostMailClient(Properties mailProperties) { this.username = mailProperties.getProperty("mail.smtp.username"); this.password = mailProperties.getProperty("mail.smtp.password"); this.host = mailProperties.getProperty("mail.smtp.host"); log.info("Initializing SparkPost smtp mail transport. Username : {}. SMTP host : {}:{}", username, host, mailProperties.getProperty("mail.smtp.port")); this.session = Session.getInstance(mailProperties); try { this.from = new InternetAddress(mailProperties.getProperty("mail.from")); } catch (AddressException e) { throw new RuntimeException("Error initializing MailWrapper."); } } @Override public void sendText(String to, String subj, String body) throws Exception { send(to, subj, body, "text/plain; charset=UTF-8"); } @Override public void sendHtml(String to, String subj, String body) throws Exception { send(to, subj, body, "text/html; charset=UTF-8"); } private void send(String to, String subj, String body, String contentType) throws Exception { MimeMessage message = new MimeMessage(session); message.setFrom(from); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subj, "UTF-8"); message.setContent(body, contentType); Transport transport = session.getTransport(); try { transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); } finally { transport.close(); } log.trace("Mail to {} was sent. Subj : {}, body : {}", to, subj, body); } @Override public void sendHtmlWithAttachment(String to, String subj, String body, QrHolder[] attachments) throws Exception { MimeMessage message = new MimeMessage(session); message.setFrom(from); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subj, "UTF-8"); Multipart multipart = new MimeMultipart(); MimeBodyPart bodyMessagePart = new MimeBodyPart(); bodyMessagePart.setContent(body, "text/html; charset=UTF-8"); multipart.addBodyPart(bodyMessagePart); for (QrHolder qrHolder : attachments) { MimeBodyPart attachmentsPart = new MimeBodyPart(); attachmentsPart.setDataHandler(new DataHandler(new ByteArrayDataSource(qrHolder.data, "image/jpeg"))); attachmentsPart.setFileName(qrHolder.makeQRFilename()); multipart.addBodyPart(attachmentsPart); } message.setContent(multipart); Transport transport = session.getTransport(); try { transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); } finally { transport.close(); } log.trace("Mail to {} was sent. Subj : {}, body : {}", to, subj, body); } }