View Javadoc

1   /*
2    * $Id: StringToEmailMessage.java 10489 2008-01-23 17:53:38Z dfeist $
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.transport.email.transformers;
12  
13  import org.mule.RegistryContext;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.transformer.TransformerException;
16  import org.mule.transformer.AbstractMessageAwareTransformer;
17  import org.mule.transport.email.MailProperties;
18  import org.mule.transport.email.MailUtils;
19  import org.mule.transport.email.SmtpConnector;
20  import org.mule.util.MapUtils;
21  import org.mule.util.StringUtils;
22  import org.mule.util.TemplateParser;
23  
24  import java.util.Calendar;
25  import java.util.Iterator;
26  import java.util.Map;
27  import java.util.Properties;
28  
29  import javax.mail.Message;
30  import javax.mail.internet.MimeMessage;
31  
32  import org.apache.commons.logging.Log;
33  import org.apache.commons.logging.LogFactory;
34  
35  /**
36   * <code>StringToEmailMessage</code> will convert a String to a JavaMail Message,
37   * using the String as the contents. This implementation uses properties on the
38   * transformer to determine the To: and Subject: fields.
39   */
40  public class StringToEmailMessage extends AbstractMessageAwareTransformer
41  {
42      /**
43       * logger used by this class
44       */
45      private final Log logger = LogFactory.getLog(getClass());
46  
47      private TemplateParser templateParser = TemplateParser.createAntStyleParser();
48  
49      public StringToEmailMessage()
50      {
51          this.registerSourceType(String.class);
52          this.setReturnClass(Message.class);
53      }
54  
55  
56      public Object transform(MuleMessage message, String outputEncoding) throws TransformerException
57      {
58          String endpointAddress = endpoint.getEndpointURI().getAddress();
59          SmtpConnector connector = (SmtpConnector) endpoint.getConnector();
60          String to = message.getStringProperty(MailProperties.TO_ADDRESSES_PROPERTY, endpointAddress);
61          String cc = message.getStringProperty(MailProperties.CC_ADDRESSES_PROPERTY,
62              connector.getCcAddresses());
63          String bcc = message.getStringProperty(MailProperties.BCC_ADDRESSES_PROPERTY,
64              connector.getBccAddresses());
65          String from = message.getStringProperty(MailProperties.FROM_ADDRESS_PROPERTY,
66              connector.getFromAddress());
67          String replyTo = message.getStringProperty(MailProperties.REPLY_TO_ADDRESSES_PROPERTY,
68              connector.getReplyToAddresses());
69          String subject = message.getStringProperty(MailProperties.SUBJECT_PROPERTY, connector.getSubject());
70          String contentType = message.getStringProperty(MailProperties.CONTENT_TYPE_PROPERTY,
71              connector.getContentType());
72  
73          Properties headers = new Properties();
74          Properties customHeaders = connector.getCustomHeaders();
75  
76          if (customHeaders != null && !customHeaders.isEmpty())
77          {
78              headers.putAll(customHeaders);
79          }
80  
81          Properties otherHeaders = (Properties) message.getProperty(MailProperties.CUSTOM_HEADERS_MAP_PROPERTY);
82          if (otherHeaders != null && !otherHeaders.isEmpty())
83          {
84                  //TODO Whats going on here?
85  //                final MuleContext mc = context.getMuleContext();
86  //                for (Iterator iterator = message.getPropertyNames().iterator(); iterator.hasNext();)
87  //                {
88  //                    String propertyKey = (String) iterator.next();
89  //                    mc.getRegistry().registerObject(propertyKey, message.getProperty(propertyKey), mc);
90  //                }
91                  headers.putAll(templateParser.parse(new TemplateParser.TemplateCallback()
92                  {
93                      public Object match(String token)
94                      {
95                          return RegistryContext.getRegistry().lookupObject(token);
96                      }
97                  }, otherHeaders));
98  
99          }
100 
101         if (logger.isDebugEnabled())
102         {
103             StringBuffer buf = new StringBuffer();
104             buf.append("Constructing email using:\n");
105             buf.append("To: ").append(to);
106             buf.append("From: ").append(from);
107             buf.append("CC: ").append(cc);
108             buf.append("BCC: ").append(bcc);
109             buf.append("Subject: ").append(subject);
110             buf.append("ReplyTo: ").append(replyTo);
111             buf.append("Content type: ").append(contentType);
112             buf.append("Payload type: ").append(message.getPayload().getClass().getName());
113             buf.append("Custom Headers: ").append(MapUtils.toString(headers, false));
114             logger.debug(buf.toString());
115         }
116 
117         try
118         {
119             Message email = new MimeMessage(((SmtpConnector) endpoint.getConnector()).getSessionDetails(endpoint).getSession());
120 
121             email.setRecipients(Message.RecipientType.TO, MailUtils.stringToInternetAddresses(to));
122 
123             // sent date
124             email.setSentDate(Calendar.getInstance().getTime());
125 
126             if (StringUtils.isNotBlank(from))
127             {
128                 email.setFrom(MailUtils.stringToInternetAddresses(from)[0]);
129             }
130 
131             if (StringUtils.isNotBlank(cc))
132             {
133                 email.setRecipients(Message.RecipientType.CC, MailUtils.stringToInternetAddresses(cc));
134             }
135 
136             if (StringUtils.isNotBlank(bcc))
137             {
138                 email.setRecipients(Message.RecipientType.BCC, MailUtils.stringToInternetAddresses(bcc));
139             }
140 
141             if (StringUtils.isNotBlank(replyTo))
142             {
143                 email.setReplyTo(MailUtils.stringToInternetAddresses(replyTo));
144             }
145 
146             email.setSubject(subject);
147 
148             for (Iterator iterator = headers.entrySet().iterator(); iterator.hasNext();)
149             {
150                 Map.Entry entry = (Map.Entry) iterator.next();
151                 email.setHeader(entry.getKey().toString(), entry.getValue().toString());
152             }
153 
154             setContent(message.getPayload(), email, contentType, message);
155 
156             return email;
157         }
158         catch (Exception e)
159         {
160             throw new TransformerException(this, e);
161         }
162     }
163 
164     protected void setContent(Object payload, Message msg, String contentType, MuleMessage message)
165         throws Exception
166     {
167         msg.setContent(payload, contentType);
168     }
169 
170 }