package com.constellio.model.services.emails; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import com.constellio.model.conf.FoldersLocator; import com.constellio.model.entities.records.wrappers.EmailToSend; import com.constellio.model.entities.structures.EmailAddress; import com.constellio.model.entities.structures.EmailAddressFactory; import com.constellio.model.services.configs.SystemConfigurationsManager; import com.sun.mail.smtp.SMTPMessage; public class EmailBuilder { public static final String BACKGROUND_PATH = "back-const-1920x1358_smal.jpg"; public static final String LOGO_PATH = "logo_eim_203x30.png"; EmailTemplatesManager emailTemplatesManager; private SystemConfigurationsManager systemConfigManager; public EmailBuilder(EmailTemplatesManager emailTemplatesManager, SystemConfigurationsManager systemConfigManager) { this.emailTemplatesManager = emailTemplatesManager; this.systemConfigManager = systemConfigManager; } public Message build(EmailToSend messageToSend, Session session, String defaultFrom) throws MessagingException, InvalidBlankEmail { EmailAddressFactory factory = new EmailAddressFactory(); Message message = new SMTPMessage(session); String addressFrom; EmailAddress from = messageToSend.getFrom(); if (from != null) { addressFrom = factory.toAddress(from); } else { if (StringUtils.isBlank(defaultFrom)) { throw new InvalidBlankEmail(); } else { addressFrom = defaultFrom; } } InternetAddress internetAddressFrom = new InternetAddress(addressFrom, true); InternetAddress[] internetAddressesTo = getInternetAddresses(messageToSend, factory, RecipientType.TO); InternetAddress[] internetAddressesBcc = getInternetAddresses(messageToSend, factory, RecipientType.BCC); InternetAddress[] internetAddressesCc = getInternetAddresses(messageToSend, factory, RecipientType.CC); message.setFrom(internetAddressFrom); message.setRecipients(RecipientType.TO, internetAddressesTo); message.setRecipients(RecipientType.BCC, internetAddressesBcc); message.setRecipients(RecipientType.CC, internetAddressesCc); message.setSentDate(messageToSend.getSendOn().toDate()); String html = emailTemplatesManager.getCollectionTemplate(messageToSend.getTemplate(), messageToSend.getCollection()); for (String parameter : messageToSend.getParameters()) { String key = parameter.substring(0, parameter.indexOf(EmailToSend.PARAMETER_SEPARATOR)); String value = parameter.substring(parameter.indexOf(EmailToSend.PARAMETER_SEPARATOR) + 1); html = html.replaceAll("\\$\\{" + key + "\\}", value); /*if (value.contains("'cid:")) { String cid = value.substring(value.indexOf("cid:")); String path = cid.substring(cid.indexOf("cid:") + 4, cid.indexOf("'")); cleanString(path); imgs.add(path); }*/ } if (StringUtils.isBlank(messageToSend.getSubject())) { Pattern pattern = Pattern.compile("<title>(.*?)</title>"); Matcher matcher = pattern.matcher(html); if (matcher.find() == true) { String value = StringEscapeUtils.unescapeHtml(matcher.group(1)); message.setSubject(value); } } else { message.setSubject(messageToSend.getSubject()); } Multipart multipart = new MimeMultipart(); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(html, "text/html"); multipart.addBodyPart(htmlPart); //FIXME see with cis use client logo and other than folders locator? FoldersLocator foldersLocator = new FoldersLocator(); addImagePart(multipart, EmailTemplatesManager.LOGO_ID, new File(foldersLocator.getConstellioThemeImages(), LOGO_PATH)); // addImagePart(multipart, EmailTemplatesManager.BACKGROUND_ID, // new File(foldersLocator.getConstellioThemeImages(), BACKGROUND_PATH)); /*for (String img : imgs) { MimeBodyPart imagePart = new MimeBodyPart(); DataSource fileDataSource = new FileDataSource(img); imagePart.setDataHandler(new DataHandler(fileDataSource)); imagePart.setHeader("Content-ID", "<" + img + ">"); multipart.addBodyPart(imagePart); }*/ message.setContent(multipart); return message; } private void addImagePart(Multipart multipart, String imgID, File imgFile) throws MessagingException { MimeBodyPart imgPart = new MimeBodyPart(); imgPart.setHeader("Content-ID", "<" + imgID + ">");//"<image>" DataSource img = new FileDataSource(imgFile); imgPart.setDataHandler(new DataHandler(img)); multipart.addBodyPart(imgPart); } private InternetAddress[] getInternetAddresses(EmailToSend messageToSend, EmailAddressFactory factory, RecipientType recipientType) throws AddressException { List<EmailAddress> emailAddresses = new ArrayList<>(); if (recipientType == RecipientType.TO) { emailAddresses = messageToSend.getTo(); } else if (recipientType == RecipientType.CC) { emailAddresses = messageToSend.getCC(); } else if (recipientType == RecipientType.BCC) { emailAddresses = messageToSend.getBCC(); } InternetAddress[] internetAddresses = new InternetAddress[emailAddresses.size()]; for (int i = 0; i < emailAddresses.size(); i++) { String address = factory.toAddress(emailAddresses.get(i)); internetAddresses[i] = new InternetAddress(address); } return internetAddresses; } public static class InvalidBlankEmail extends Exception { public InvalidBlankEmail() { super("Invalid blank email address"); } } }