package edu.ucsf.mousedatabase.objects; import java.io.OutputStream; import java.sql.Date; import java.sql.Timestamp; import java.util.HashMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.mail.ByteArrayDataSource; import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail.EmailAttachment; import org.apache.commons.mail.HtmlEmail; import org.jsoup.Jsoup; import edu.ucsf.mousedatabase.DBConnect; import edu.ucsf.mousedatabase.Log; //syncrhonously send email public class MouseMail { private static String SMTP_SERVER; private static String SMTP_USER; private static String SMTP_PW; private static int SMTP_PORT; private static boolean SMTP_SSL_ENABLED; public static void intitialize(String server, String user, String pw, int port, boolean sslEnabled){ SMTP_SERVER = server; SMTP_USER = user; SMTP_PW = pw; SMTP_PORT = port; SMTP_SSL_ENABLED = sslEnabled; } public static String PlainEmailType = "plain"; public static String HTMLEmailType = "html"; public static String MultipartEmailType = "multipart"; public static String SentStatus = "sent"; public static String ErrorStatus = "error"; public static String DraftStatus = "draft"; public int id; public String recipient; public String ccs; public String bccs; public String subject; public String body; public String emailType; public String status; public String category; public String templateName; public Timestamp dateCreated; public String errorMessage; public String attachmentNames; private HashMap<String,byte[]> attachments; public MouseMail(String recipient, String ccs, String bccs, String subject, String body, String category, String templateName, String attachmentNames) { super(); this.recipient = recipient; this.ccs = ccs; this.bccs = bccs; this.subject = subject; this.body = body; this.emailType = HTMLEmailType; this.category = category; this.templateName = templateName; this.attachmentNames = attachmentNames; } public static MouseMail send(String recipient, String cc, String bcc, String subject, String body, String category, int templateID, int draftId, HashMap<String,byte[]> attachments) { String templateName = null; if (templateID > 0) { EmailTemplate template = DBConnect.loadEmailTemplate(templateID); templateName = template.name; } String attachmentNames = ""; if (attachments != null) { attachmentNames = StringUtils.join(attachments.keySet(),", "); } MouseMail mail = new MouseMail(recipient, cc, bcc, subject, body, category, templateName,attachmentNames); mail.attachments = attachments; mail.trySend(); mail.save(); if (mail.status != ErrorStatus && draftId > 0) { DBConnect.deleteEmail(draftId); } return mail; } private void trySend(){ //TODO check type, support plain and multipart? try { HtmlEmail email = new HtmlEmail(); email.setHostName(SMTP_SERVER); email.setSmtpPort(SMTP_PORT); email.setAuthenticator(new DefaultAuthenticator(SMTP_USER, SMTP_PW)); if (SMTP_SSL_ENABLED){ email.setSSL(true); } email.setFrom(DBConnect.loadSetting("admin_info_email").value); email.setSubject(subject); email.setHtmlMsg(body); email.setTextMsg(stripHtml(body)); for (String rec : StringUtils.split(recipient,", ")) { email.addTo(rec); } if (ccs != null && !ccs.isEmpty()){ for (String cc : StringUtils.split(ccs,", ")) { email.addCc(cc); } } if (bccs != null && !bccs.isEmpty()){ for (String bcc : StringUtils.split(bccs,", ")) { email.addBcc(bcc); } } if (attachments != null) { for(String attachmentName : attachments.keySet()) { email.attach(new ByteArrayDataSource(attachments.get(attachmentName),null),attachmentName,attachmentName); } } Log.Info("Sending mail " + subject + " to " + recipient + " + " + ccs); email.send(); status = SentStatus; } catch(Exception e){ Log.Error("Error sending email",e); status = ErrorStatus; errorMessage = e.getMessage(); } } private void save(){ id = DBConnect.insertEmail(this); } public int saveAsDraft(){ status = DraftStatus; id = DBConnect.insertEmail(this); return id; } private String stripHtml(String text){ return Jsoup.parse(text).text(); } }