package org.jboss.seam.mail.ui; import static org.jboss.seam.util.Strings.isEmpty; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.faces.FacesException; import javax.faces.context.FacesContext; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.jboss.seam.mail.MailSession; import org.jboss.seam.mail.ui.context.MailFacesContextImpl; import org.jboss.seam.ui.util.JSF; /** * JSF component which delimites the start and end of the mail message. */ public class UIMessage extends MailComponent { public static class Importance { public static final String LOW = "low"; public static final String NORMAL = "normal"; public static final String HIGH = "high"; } private MimeMessage mimeMessage; List<MimeBodyPart> attachments = new ArrayList<MimeBodyPart>(); private Session session; private String importance; private String precedence; private Boolean requestReadReceipt; private String urlBase; private String charset; private String messageId; /** * Get the JavaMail Session to use. If not set the default session is used */ public Session getMailSession() { if (session == null) { if (getValue("session") != null) { session = (Session) getValue("session"); } else { session = MailSession.instance(); } } return session; } public void setMailSession(Session session) { this.session = session; } public MimeMessage getMimeMessage() throws MessagingException { if (mimeMessage == null) { if (!isEmpty(getMessageId())) { mimeMessage = new MimeMessage(getMailSession()) { @Override protected void updateMessageID() throws MessagingException { setHeader("Message-ID", getMessageId()); } }; } else { mimeMessage = new MimeMessage(getMailSession()); } Multipart root = new MimeMultipart(); mimeMessage.setContent(root); } return mimeMessage; } @Override public void encodeBegin(FacesContext context) throws IOException { MailFacesContextImpl.start(getUrlBase() == null ? context.getExternalContext().getRequestContextPath() : (getUrlBase() + context.getExternalContext().getRequestContextPath())); mimeMessage = null; try { try { if (Importance.HIGH.equalsIgnoreCase(getImportance())) { // Various mail client's use different headers for indicating // importance // This is a common set, more may need to be added. getMimeMessage().addHeader("X-Priority", "1"); getMimeMessage().addHeader("Priority", "Urgent"); getMimeMessage().addHeader("Importance", "high"); } else if (Importance.LOW.equalsIgnoreCase(getImportance())) { getMimeMessage().addHeader("X-Priority", "5"); getMimeMessage().addHeader("Priority", "Non-urgent"); getMimeMessage().addHeader("Importance", "low"); } if (getPrecedence() != null) { Header header = new Header("Precedence", getPrecedence()); getMimeMessage().addHeader(header.getSanitizedName(), header.getSanitizedValue()); } } catch (MessagingException e) { throw new FacesException(e.getMessage(), e); } } catch (RuntimeException e) { MailFacesContextImpl.stop(); throw e; } } @Override public void encodeEnd(FacesContext ctx) throws IOException { try { if (isRequestReadReceipt() && getMimeMessage().getFrom() != null && getMimeMessage().getFrom().length == 1) { Header header = new Header("Disposition-Notification-To", getMimeMessage().getFrom()[0].toString()); getMimeMessage().addHeader(header.getSanitizedName(), header.getSanitizedValue()); } // Do the send manually, Transport.send gets the wrong transport getMimeMessage().saveChanges(); Transport transport = getMailSession().getTransport(); transport.connect(); transport.sendMessage(getMimeMessage(), getMimeMessage().getAllRecipients()); transport.close(); } catch (MessagingException e) { throw new FacesException(e.getMessage(), e); } finally { MailFacesContextImpl.stop(); } } @Override public boolean getRendersChildren() { return true; } @Override public void encodeChildren(FacesContext context) throws IOException { try { JSF.renderChildren(FacesContext.getCurrentInstance(), this); } catch (RuntimeException e) { MailFacesContextImpl.stop(); throw e; } } public String getImportance() { if (importance == null) { return getString("importance"); } else { return importance; } } public void setImportance(String importance) { this.importance = importance; } public String getPrecedence() { if (precedence == null) { return getString("precedence"); } else { return precedence; } } public void setPrecedence(String precedence) { this.precedence = precedence; } public boolean isRequestReadReceipt() { if (requestReadReceipt == null) { return getBoolean("requestReadReceipt") == null ? false : getBoolean("requestReadReceipt"); } else { return requestReadReceipt; } } public void setRequestReadReceipt(boolean requestReadReceipt) { this.requestReadReceipt = requestReadReceipt; } public String getUrlBase() { if (urlBase == null) { return getString("urlBase"); } else { return urlBase; } } public void setUrlBase(String urlBase) { this.urlBase = urlBase; } public String getCharset() { if (charset != null) { return charset; } else if (getString("charset") != null) { return getString("charset"); } else { return FacesContext.getCurrentInstance().getResponseWriter().getCharacterEncoding(); } } public void setCharset(String charset) { this.charset = charset; } public String getMessageId() { if (messageId == null) { return getString("messageId"); } else { return messageId; } } public void setMessageId(String messageId) { this.messageId = messageId; } public List<MimeBodyPart> getAttachments() { return attachments; } public void setAttachments(List<MimeBodyPart> attachments) { this.attachments = attachments; } }