View Javadoc

1   /*
2    * $Id: MailMuleMessageFactory.java 21610 2011-03-28 09:52:05Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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;
12  
13  import org.mule.DefaultMuleMessage;
14  import org.mule.api.MuleContext;
15  import org.mule.api.MuleMessage;
16  import org.mule.transport.AbstractMuleMessageFactory;
17  import org.mule.util.StringUtils;
18  
19  import java.util.Date;
20  import java.util.Enumeration;
21  import java.util.HashMap;
22  import java.util.LinkedList;
23  import java.util.List;
24  import java.util.Map;
25  import java.util.TreeMap;
26  
27  import javax.mail.Address;
28  import javax.mail.Header;
29  import javax.mail.Message;
30  import javax.mail.Message.RecipientType;
31  import javax.mail.MessagingException;
32  import javax.mail.Multipart;
33  import javax.mail.Part;
34  import javax.mail.internet.MimeMessage;
35  
36  import org.apache.commons.logging.Log;
37  import org.apache.commons.logging.LogFactory;
38  
39  public class MailMuleMessageFactory extends AbstractMuleMessageFactory
40  {
41      public static final String HEADER_LIST_PREFIX = "List:";
42  
43      private static Log log = LogFactory.getLog(MailMuleMessageFactory.class);
44  
45      public MailMuleMessageFactory(MuleContext context)
46      {
47          super(context);
48      }
49  
50      @Override
51      protected Class<?>[] getSupportedTransportMessageTypes()
52      {
53          return new Class[]{Message.class};
54      }
55  
56      @Override
57      protected Object extractPayload(Object transportMessage, String encoding) throws Exception
58      {
59          return transportMessage;
60      }
61  
62      @Override
63      protected void addProperties(DefaultMuleMessage muleMessage, Object transportMessage) throws Exception
64      {
65          super.addProperties(muleMessage, transportMessage);
66  
67          Message mailMessage = (Message) transportMessage;
68  
69          addRecipientProperty(muleMessage, mailMessage, RecipientType.TO, MailProperties.INBOUND_TO_ADDRESSES_PROPERTY);
70          addRecipientProperty(muleMessage, mailMessage, RecipientType.CC, MailProperties.INBOUND_CC_ADDRESSES_PROPERTY);
71          addRecipientProperty(muleMessage, mailMessage, RecipientType.BCC, MailProperties.INBOUND_BCC_ADDRESSES_PROPERTY);
72  
73          addReplyToProperty(muleMessage, mailMessage);
74          addFromProperty(muleMessage, mailMessage);
75  
76          muleMessage.setOutboundProperty(MailProperties.INBOUND_SUBJECT_PROPERTY,
77                                          StringUtils.defaultIfEmpty(mailMessage.getSubject(), "(no subject)"));
78          muleMessage.setOutboundProperty(MailProperties.INBOUND_CONTENT_TYPE_PROPERTY,
79                                          StringUtils.defaultIfEmpty(mailMessage.getContentType(), "text/plain"));
80  
81          addSentDateProperty(muleMessage, mailMessage);
82          addMailHeadersToMessageProperties(mailMessage, muleMessage);
83      }
84  
85      protected void addRecipientProperty(MuleMessage muleMessage, Message mailMessage,
86          RecipientType recipientType, String property) throws MessagingException
87      {
88          MimeMessage mimeMessage = null;
89          if (mailMessage instanceof MimeMessage)
90          {
91              mimeMessage = (MimeMessage) mailMessage;
92          }
93  
94          try
95          {
96              Address[] recipients = mailMessage.getRecipients(recipientType);
97              muleMessage.setOutboundProperty(property, MailUtils.mailAddressesToString(recipients));
98          }
99          catch (MessagingException e)
100         {
101             if (mimeMessage != null)
102             {
103                 String[] header = mimeMessage.getHeader(recipientType.toString());
104                 String recipients = StringUtils.join(header, ", ");
105                 muleMessage.setOutboundProperty(property, recipients);
106             }
107         }
108     }
109 
110     protected void addReplyToProperty(DefaultMuleMessage muleMessage, Message mailMessage)
111     {
112         try
113         {
114             muleMessage.setOutboundProperty(MailProperties.INBOUND_REPLY_TO_ADDRESSES_PROPERTY,
115                                             MailUtils.mailAddressesToString(mailMessage.getReplyTo()));
116         }
117         catch (MessagingException me)
118         {
119             log.warn("Invalid address found in ReplyTo header:", me);
120         }
121     }
122 
123     protected void addFromProperty(DefaultMuleMessage muleMessage, Message mailMessage)
124     {
125         try
126         {
127             muleMessage.setOutboundProperty(MailProperties.INBOUND_FROM_ADDRESS_PROPERTY,
128                                             MailUtils.mailAddressesToString(mailMessage.getFrom()));
129         }
130         catch (javax.mail.MessagingException me)
131         {
132             log.warn("Invalid address found in From header:", me);
133         }
134     }
135 
136     protected void addSentDateProperty(DefaultMuleMessage muleMessage, Message mailMessage)
137         throws MessagingException
138     {
139         Date sentDate = mailMessage.getSentDate();
140         if (sentDate == null)
141         {
142             sentDate = new Date();
143         }
144         muleMessage.setOutboundProperty(MailProperties.SENT_DATE_PROPERTY, sentDate);
145     }
146 
147     @SuppressWarnings({ "unchecked", "rawtypes" })
148     protected void addMailHeadersToMessageProperties(Message mailMessage, DefaultMuleMessage muleMessage)
149         throws MessagingException
150     {
151         for (Enumeration<?> e = mailMessage.getAllHeaders(); e.hasMoreElements();)
152         {
153             Header header = (Header) e.nextElement();
154 
155             String name = header.getName();
156             String listName = MailUtils.toListHeader(name);
157             String value = header.getValue();
158 
159             if (null == muleMessage.getOutboundProperty(name))
160             {
161                 muleMessage.setOutboundProperty(name, value);
162             }
163 
164             Object listPropertyValue = muleMessage.getOutboundProperty(listName);
165             if (null == listPropertyValue)
166             {
167                 listPropertyValue = new LinkedList<Object>();
168                 muleMessage.setOutboundProperty(listName, listPropertyValue);
169             }
170             if (listPropertyValue instanceof List<?>)
171             {
172                 ((List) listPropertyValue).add(header.getValue());
173             }
174         }
175     }
176 
177     @Override
178     protected void addAttachments(DefaultMuleMessage muleMessage, Object transportMessage) throws Exception
179     {
180         super.addAttachments(muleMessage, transportMessage);
181 
182         Object content = ((Message) transportMessage).getContent();
183         if (content instanceof Multipart)
184         {
185             Multipart multipart = (Multipart) content;
186 
187             TreeMap<String, Part> attachments = new TreeMap<String, Part>();
188             MailUtils.getAttachments(multipart, attachments);
189 
190             log.debug("Received Multipart message. Adding attachments");
191             for (Map.Entry<String, Part> entry : attachments.entrySet())
192             {
193                 Part part = entry.getValue();
194                 String name = entry.getKey();
195 
196                 muleMessage.addInboundAttachment(name, part.getDataHandler());
197                 addAttachmentHeaders(name, part, muleMessage);
198             }
199         }
200     }
201 
202     protected void addAttachmentHeaders(String name, Part part, MuleMessage muleMessage) throws javax.mail.MessagingException
203     {
204         Map<String, String> headers = new HashMap<String, String>();
205         for (Enumeration<?> e = part.getAllHeaders(); e.hasMoreElements();)
206         {
207             Header h = (Header) e.nextElement();
208             headers.put(h.getName(), h.getValue());
209         }
210 
211         if (headers.size() > 0)
212         {
213             muleMessage.setOutboundProperty(name + AbstractMailConnector.ATTACHMENT_HEADERS_PROPERTY_POSTFIX,
214                                             headers);
215         }
216     }
217 }