View Javadoc

1   /*
2    * $Id: StringToEmailMessage.java 7963 2007-08-21 08:53:15Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.providers.email.transformers;
12  
13  import org.mule.MuleManager;
14  import org.mule.providers.email.MailProperties;
15  import org.mule.providers.email.MailUtils;
16  import org.mule.providers.email.SmtpConnector;
17  import org.mule.transformers.AbstractEventAwareTransformer;
18  import org.mule.umo.UMOEventContext;
19  import org.mule.umo.UMOMessage;
20  import org.mule.umo.transformer.TransformerException;
21  import org.mule.util.MapUtils;
22  import org.mule.util.StringUtils;
23  import org.mule.util.TemplateParser;
24  
25  import java.util.Calendar;
26  import java.util.HashMap;
27  import java.util.Iterator;
28  import java.util.Map;
29  import java.util.Properties;
30  
31  import javax.mail.Message;
32  import javax.mail.internet.MimeMessage;
33  
34  import org.apache.commons.logging.Log;
35  import org.apache.commons.logging.LogFactory;
36  
37  /**
38   * <code>StringToEmailMessage</code> will convert a String to a JavaMail Message,
39   * using the String as the contents. This implementation uses properties on the
40   * transformer to determine the To: and Subject: fields.
41   */
42  public class StringToEmailMessage extends AbstractEventAwareTransformer
43  {
44      /**
45       * logger used by this class
46       */
47      private final Log logger = LogFactory.getLog(getClass());
48  
49      private TemplateParser templateParser = TemplateParser.createAntStyleParser();
50  
51      public StringToEmailMessage()
52      {
53          this.registerSourceType(String.class);
54          this.setReturnClass(Message.class);
55      }
56  
57      /*
58       * (non-Javadoc)
59       * 
60       * @see org.mule.transformers.AbstractTransformer#doTransform(java.lang.Object)
61       */
62      public Object transform(Object src, String encoding, UMOEventContext context) throws TransformerException
63      {
64          String endpointAddress = endpoint.getEndpointURI().getAddress();
65          SmtpConnector connector = (SmtpConnector) endpoint.getConnector();
66          UMOMessage eventMsg = context.getMessage();
67          String to = eventMsg.getStringProperty(MailProperties.TO_ADDRESSES_PROPERTY, endpointAddress);
68          String cc = eventMsg.getStringProperty(MailProperties.CC_ADDRESSES_PROPERTY,
69              connector.getCcAddresses());
70          String bcc = eventMsg.getStringProperty(MailProperties.BCC_ADDRESSES_PROPERTY,
71              connector.getBccAddresses());
72          String from = eventMsg.getStringProperty(MailProperties.FROM_ADDRESS_PROPERTY,
73              connector.getFromAddress());
74          String replyTo = eventMsg.getStringProperty(MailProperties.REPLY_TO_ADDRESSES_PROPERTY,
75              connector.getReplyToAddresses());
76          String subject = eventMsg.getStringProperty(MailProperties.SUBJECT_PROPERTY, connector.getSubject());
77          String contentType = eventMsg.getStringProperty(MailProperties.CONTENT_TYPE_PROPERTY,
78              connector.getContentType());
79  
80          Properties headers = new Properties();
81          Properties customHeaders = connector.getCustomHeaders();
82  
83          if (customHeaders != null && !customHeaders.isEmpty())
84          {
85              headers.putAll(customHeaders);
86          }
87  
88          Properties otherHeaders = (Properties) eventMsg.getProperty(MailProperties.CUSTOM_HEADERS_MAP_PROPERTY);
89          if (otherHeaders != null && !otherHeaders.isEmpty())
90          {
91              Map props = new HashMap(MuleManager.getInstance().getProperties());
92              for (Iterator iterator = eventMsg.getPropertyNames().iterator(); iterator.hasNext();)
93              {
94                  String propertyKey = (String) iterator.next();
95                  props.put(propertyKey, eventMsg.getProperty(propertyKey));
96              }
97              headers.putAll(templateParser.parse(props, otherHeaders));
98          }
99  
100         if (logger.isDebugEnabled())
101         {
102             StringBuffer buf = new StringBuffer();
103             buf.append("Constructing email using:\n");
104             buf.append("To: ").append(to);
105             buf.append("From: ").append(from);
106             buf.append("CC: ").append(cc);
107             buf.append("BCC: ").append(bcc);
108             buf.append("Subject: ").append(subject);
109             buf.append("ReplyTo: ").append(replyTo);
110             buf.append("Content type: ").append(contentType);
111             buf.append("Payload type: ").append(src.getClass().getName());
112             buf.append("Custom Headers: ").append(MapUtils.toString(headers, false));
113             logger.debug(buf.toString());
114         }
115 
116         try
117         {
118             Message email = new MimeMessage(((SmtpConnector) endpoint.getConnector()).getSessionDetails(endpoint).getSession());
119 
120             email.setRecipients(Message.RecipientType.TO, MailUtils.stringToInternetAddresses(to));
121 
122             // sent date
123             email.setSentDate(Calendar.getInstance().getTime());
124 
125             if (StringUtils.isNotBlank(from))
126             {
127                 email.setFrom(MailUtils.stringToInternetAddresses(from)[0]);
128             }
129 
130             if (StringUtils.isNotBlank(cc))
131             {
132                 email.setRecipients(Message.RecipientType.CC, MailUtils.stringToInternetAddresses(cc));
133             }
134 
135             if (StringUtils.isNotBlank(bcc))
136             {
137                 email.setRecipients(Message.RecipientType.BCC, MailUtils.stringToInternetAddresses(bcc));
138             }
139 
140             if (StringUtils.isNotBlank(replyTo))
141             {
142                 email.setReplyTo(MailUtils.stringToInternetAddresses(replyTo));
143             }
144 
145             email.setSubject(subject);
146 
147             for (Iterator iterator = headers.entrySet().iterator(); iterator.hasNext();)
148             {
149                 Map.Entry entry = (Map.Entry) iterator.next();
150                 email.setHeader(entry.getKey().toString(), entry.getValue().toString());
151             }
152 
153             setContent(src, email, contentType, context);
154 
155             return email;
156         }
157         catch (Exception e)
158         {
159             throw new TransformerException(this, e);
160         }
161     }
162 
163     protected void setContent(Object payload, Message msg, String contentType, UMOEventContext context)
164         throws Exception
165     {
166         msg.setContent(payload, contentType);
167     }
168 
169 }