package org.entermedia.email; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openedit.Data; import org.openedit.data.Searcher; import org.openedit.entermedia.MediaArchive; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.page.Page; import com.openedit.page.PageRequestKeys; import com.openedit.users.User; import com.openedit.util.PathUtilities; public abstract class WebEmail { private static final Log log = LogFactory.getLog(WebEmail.class); public static final String EMAIL_TEMPLATE_REQUEST_PARAMETER = "emaillayout"; public static final String OLDEMAIL_TEMPLATE_REQUEST_PARAMETER = "e-mail_layout"; protected List<InternetAddress> fieldRecipients; protected List<InternetAddress> fieldBCCRecipients; protected String fieldFrom; protected String fieldFromName; protected Map fieldProperties; protected String fieldSubject; protected String fieldWebServerName; protected WebPageRequest fieldWebPageContext; protected String fieldId; protected User fieldUser; protected String fieldMessage; protected String fieldAlternativeMessage; protected PostMail fieldPostMail; public List<InternetAddress> getBCCRecipients() { return fieldBCCRecipients; } public void setBCCRecipients(List<InternetAddress> inBCCRecipients) { fieldBCCRecipients = inBCCRecipients; } public User getUser() { return fieldUser; } public void setUser(User inUser) { fieldUser = inUser; } public String getId() { return fieldId; } public void setId(String inId) { fieldId = inId; } public String getFromName() { return fieldFromName; } public void setFromName(String inFromName) { fieldFromName = inFromName; } public Map getProperties() { if (fieldProperties == null) { fieldProperties = new HashMap(); } return fieldProperties; } public void setProperty(String inKey, String inValue) { getProperties().put(inKey, inValue); } public void setProperties(Map inProperties) { fieldProperties = inProperties; } public String getProperty(String inKey) { if ("from".equals(inKey)) { return getFrom(); } if ("to".equals(inKey)) { StringBuffer prop = new StringBuffer(); for (int i = 0; i < getTo().length; i++) { String to = getTo()[i]; prop.append(to); prop.append(" "); } } if ("fromname".equals(inKey)) { return getFromName(); } if ("subject".equals(inKey)) { return getSubject(); } if ("user".equals(inKey)) { return getUser().getUserName(); } return (String) getProperties().get(inKey); } public PostMail getPostMail() { return fieldPostMail; } public void setPostMail(PostMail postMail) { this.fieldPostMail = postMail; } protected WebEmail() { } public WebPageRequest getWebPageContext() { return fieldWebPageContext; } public void loadSettings(WebPageRequest inContext) throws OpenEditException { String templatePath = inContext.findValue(EMAIL_TEMPLATE_REQUEST_PARAMETER); if (templatePath == null) { templatePath = inContext.findValue(OLDEMAIL_TEMPLATE_REQUEST_PARAMETER); } if (templatePath != null) { templatePath = PathUtilities.buildRelative(templatePath, inContext.getPath()); } if (templatePath != null) { loadSettingsFromTemplate(inContext, templatePath); } if (getFrom() == null) { String from = inContext.findValue("from"); setFrom(from); } if (getFrom() == null) { setFrom(inContext.getContentProperty("systemfromemail")); setFromName(inContext.getContentProperty("systemfromemailname")); } if (getSubject() == null) { String subject = inContext.findValue("subject"); if (subject == null) { subject = (String) inContext.getPageValue("subject"); } setSubject(subject); } if (getRecipients() == null || getRecipients().size() == 0) { String to = inContext.findValue("to"); // If you set the property sendCustomerCopy to true, then the form // will also be emailed to the value of property email String copy = inContext.findValue("sendCustomerCopy"); if (Boolean.parseBoolean(copy) && inContext.findValue("email") != null) { to = to + ", " + inContext.findValue("email"); } setTo(to); } // TODO: remove this since you can get it from url_utils if (getWebServerName() == null) { setWebServerName((String) inContext.getPageValue(PageRequestKeys.WEB_SERVER_PATH)); } if (getWebPageContext() == null) { setWebPageContext(inContext); } } protected void loadSettingsFromTemplate(WebPageRequest inContext, String inTemplatePath) { MediaArchive archive = (MediaArchive) inContext.getPageValue("mediaarchive"); Page pg = archive.getPageManager().getPage(inTemplatePath); if (pg == null) { return; } String templateid = pg.getProperty("emailtemplateid"); if (templateid == null || templateid.isEmpty()) { return; } //load the template Searcher emailtemplateSearcher = archive.getSearcherManager().getSearcher(archive.getCatalogId(), "emailtemplate"); Searcher emailrecipientSearcher = archive.getSearcherManager().getSearcher(archive.getCatalogId(), "emailrecipient"); Data template = (Data) emailtemplateSearcher.searchById(templateid); String to = template.get("to"); if (to != null && !to.isEmpty()) { setTo(to); } String bcc = template.get("bcc"); if (bcc != null && !bcc.isEmpty()) { ArrayList<InternetAddress> recipients = new ArrayList<InternetAddress>(); String[] list = bcc.split(" | "); for (String ls : list) { if (ls.isEmpty() || ls.trim().equals("|")) { continue; } Data recipient = (Data) emailrecipientSearcher.searchById(ls.trim()); if (recipient == null) { continue; } String email = recipient.getName(); InternetAddress inet = parseRecipient(email); recipients.add(inet); } setBCCRecipients(recipients); } String from = template.get("from"); if (from != null && !from.isEmpty()) { setFrom(from); } String subject = template.get("subject"); if (subject != null && !subject.isEmpty()) { setSubject(subject); } } public List<InternetAddress> getRecipients() { return fieldRecipients; } public String[] getTo() { if (getRecipients() == null) { return null; } String[] tos = new String[getRecipients().size()]; for (int i = 0; i < getRecipients().size(); i++) { InternetAddress rec = (InternetAddress) getRecipients().get(i); tos[i] = rec.getAddress(); } return tos; } public void setTo(String inTo) { if (inTo == null) { return; } List recipients = new ArrayList(); String[] emails = inTo.split(","); for (int i = 0; i < emails.length; i++) { String value = emails[i].trim(); InternetAddress recipient = parseRecipient(value); recipients.add(recipient); } setRecipients(recipients); } protected InternetAddress parseRecipient(String inValue) { //Recipient rec = new Recipient(); //inValue = inValue.trim(); //get the name out? //rec.setEmailAddress(inValue); return getPostMail().parseEmail(inValue); } public String getWebServerName() { return fieldWebServerName; } public void setWebServerName(String inWebServerName) { fieldWebServerName = inWebServerName; } public String getFrom() { return fieldFrom; } public void setFrom(String inFrom) { fieldFrom = inFrom; } public String getSubject() { return fieldSubject; } public void setSubject(String inSubject) { fieldSubject = inSubject; } public void setWebPageContext(WebPageRequest inWebPageContext) { fieldWebPageContext = inWebPageContext; } public void setRecipients(List<InternetAddress> inList) { fieldRecipients = inList; } public List setRecipientsFromUnknown(String inAddresses) { String[] splitaddresses = null; //check if the string contains a semicolon if so split on the semicolon if (inAddresses.indexOf(";") > -1) { splitaddresses = inAddresses.split(";"); } //no semicolons treat as all comma seperated list if (splitaddresses == null) { return setRecipientsFromCommas(inAddresses); } else //check each split section for commas if so add split results to results { ArrayList<InternetAddress> results = new ArrayList<InternetAddress>(); for (int i = 0; i < splitaddresses.length; i++) { String addresses = splitaddresses[i].trim(); if (addresses.indexOf(",") > -1) { results.addAll(createRecipientsFromSplit(addresses, ",")); } else if (addresses.length() > 0) { InternetAddress one = parseRecipient(addresses); results.add(one); } } setRecipients(results); return results; } } public List setRecipientsFromCommas(String inAddresses) { List recipients = createRecipientsFromSplit(inAddresses, ","); setRecipients(recipients); return recipients; } public List setRecipientsFromSemicolon(String inAddresses) { List recipients = createRecipientsFromSplit(inAddresses, ";"); setRecipients(recipients); return recipients; } public List<InternetAddress> createRecipientsFromSplit(String inAddresses, String inSplit) { ArrayList<InternetAddress> list = new ArrayList<InternetAddress>(); String[] all = inAddresses.split(inSplit); for (int i = 0; i < all.length; i++) { if (all[i].length() > 0) { InternetAddress one = parseRecipient(all[i]); list.add(one); } } return list; } public void setRecipientsFromStrings(List<String> inToAddresses) { List all = new ArrayList(); for (Iterator iter = inToAddresses.iterator(); iter.hasNext();) { String email = (String) iter.next(); InternetAddress inet = getPostMail().parseEmail(email); all.add(inet); } setRecipients(all); } public void setRecipientsFrom(InternetAddress[] recipients) { List tos = Arrays.asList(recipients); setRecipients(tos); } /* * @deprecated use InternetAddress */ public void setRecipient(Recipient inRecipient) { List one = new ArrayList(1); InternetAddress inet = getPostMail().parseEmail(inRecipient.toString()); one.add(inet); setRecipients(one); } public void setRecipient(InternetAddress inRecipient) { List one = new ArrayList(1); one.add(inRecipient); setRecipients(one); } public String getMessage() { return fieldMessage; } public void setMessage(String inMessage) { fieldMessage = inMessage; } public String getAlternativeMessage() { return fieldAlternativeMessage; } public void setAlternativeMessage(String inAlternativeMessage) { fieldAlternativeMessage = inAlternativeMessage; } public abstract void send() throws OpenEditException, MessagingException; public PostMailStatus sendAndCollectStatus() { PostMailStatus result = new PostMailStatus(); try { send(); result.setSent(true); result.setStatus("complete"); if (getProperties() != null && getProperties().containsKey(PostMailStatus.ID)) { result.setId((String) getProperties().get(PostMailStatus.ID)); } } catch (Exception e) { e.printStackTrace(); result.setSent(false); result.setId("unknown"); result.setStatus(e.getLocalizedMessage()); } return result; } }