View Javadoc

1   /*
2    * $Id: MailMuleMessageFactory.java 19337 2010-09-03 14:33:07Z rossmason $
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.Header;
28  import javax.mail.Message;
29  import javax.mail.MessagingException;
30  import javax.mail.Multipart;
31  import javax.mail.Part;
32  
33  import org.apache.commons.logging.Log;
34  import org.apache.commons.logging.LogFactory;
35  
36  public class MailMuleMessageFactory extends AbstractMuleMessageFactory
37  {
38      public static final String HEADER_LIST_PREFIX = "List:";
39  
40      private static Log log = LogFactory.getLog(MailMuleMessageFactory.class);
41      
42      public MailMuleMessageFactory(MuleContext context)
43      {
44          super(context);
45      }
46  
47      @Override
48      protected Class<?>[] getSupportedTransportMessageTypes()
49      {
50          return new Class[]{Message.class};
51      }
52  
53      @Override
54      protected Object extractPayload(Object transportMessage, String encoding) throws Exception
55      {
56          return transportMessage;
57      }
58      
59      @Override
60      protected void addProperties(DefaultMuleMessage muleMessage, Object transportMessage) throws Exception
61      {
62          super.addProperties(muleMessage, transportMessage);
63  
64          Message mailMessage = (Message) transportMessage;
65  
66          muleMessage.setOutboundProperty(MailProperties.INBOUND_TO_ADDRESSES_PROPERTY,
67                                          MailUtils.mailAddressesToString(mailMessage.getRecipients(Message.RecipientType.TO)));
68          muleMessage.setOutboundProperty(MailProperties.INBOUND_CC_ADDRESSES_PROPERTY,
69                                          MailUtils.mailAddressesToString(mailMessage.getRecipients(Message.RecipientType.CC)));
70          muleMessage.setOutboundProperty(MailProperties.INBOUND_BCC_ADDRESSES_PROPERTY,
71                                          MailUtils.mailAddressesToString(mailMessage.getRecipients(Message.RecipientType.BCC)));
72          try
73          {
74              muleMessage.setOutboundProperty(MailProperties.INBOUND_REPLY_TO_ADDRESSES_PROPERTY,
75                                              MailUtils.mailAddressesToString(mailMessage.getReplyTo()));
76          }
77          catch (MessagingException me)
78          {
79              log.warn("Invalid address found in ReplyTo header:", me);
80          }
81  
82          try
83          {
84              muleMessage.setOutboundProperty(MailProperties.INBOUND_FROM_ADDRESS_PROPERTY,
85                                              MailUtils.mailAddressesToString(mailMessage.getFrom()));
86          }
87          catch (javax.mail.MessagingException me)
88          {
89              log.warn("Invalid address found in From header:", me);
90          }
91  
92          muleMessage.setOutboundProperty(MailProperties.INBOUND_SUBJECT_PROPERTY,
93                                          StringUtils.defaultIfEmpty(mailMessage.getSubject(), "(no subject)"));
94          muleMessage.setOutboundProperty(MailProperties.INBOUND_CONTENT_TYPE_PROPERTY,
95                                          StringUtils.defaultIfEmpty(mailMessage.getContentType(), "text/plain"));
96  
97          Date sentDate = mailMessage.getSentDate();
98          if (sentDate == null)
99          {
100             sentDate = new Date();
101         }
102         muleMessage.setOutboundProperty(MailProperties.SENT_DATE_PROPERTY, sentDate);
103 
104         for (Enumeration<?> e = mailMessage.getAllHeaders(); e.hasMoreElements();)
105         {
106             Header header = (Header) e.nextElement();
107             
108             String name = header.getName();
109             String listName = MailUtils.toListHeader(name);
110             String value = header.getValue();
111 
112             if (null == muleMessage.getOutboundProperty(name))
113             {
114                 muleMessage.setOutboundProperty(name, value);
115             }
116 
117             Object listPropertyValue = muleMessage.getOutboundProperty(listName);
118             if (null == listPropertyValue)
119             {
120                 listPropertyValue = new LinkedList<Object>();
121                 muleMessage.setOutboundProperty(listName, listPropertyValue);
122             }
123             if (listPropertyValue instanceof List<?>)
124             {
125                 ((List) listPropertyValue).add(header.getValue());
126             }
127         }
128     }
129 
130     @Override
131     protected void addAttachments(DefaultMuleMessage muleMessage, Object transportMessage) throws Exception
132     {
133         super.addAttachments(muleMessage, transportMessage);
134 
135         Object content = ((Message) transportMessage).getContent();
136         if (content instanceof Multipart)
137         {
138             Multipart multipart = (Multipart) content;
139             
140             TreeMap<String, Part> attachments = new TreeMap<String, Part>();
141             MailUtils.getAttachments(multipart, attachments);
142 
143             log.debug("Received Multipart message. Adding attachments");
144             for (Map.Entry<String, Part> entry : attachments.entrySet())
145             {
146                 Part part = entry.getValue();
147                 String name = entry.getKey();
148 
149                 muleMessage.addInboundAttachment(name, part.getDataHandler());
150                 addAttachmentHeaders(name, part, muleMessage);
151             }
152         }
153     }
154     
155     protected void addAttachmentHeaders(String name, Part part, MuleMessage muleMessage) throws javax.mail.MessagingException
156     {
157         Map<String, String> headers = new HashMap<String, String>();
158         for (Enumeration<?> e = part.getAllHeaders(); e.hasMoreElements();)
159         {
160             Header h = (Header) e.nextElement();
161             headers.put(h.getName(), h.getValue());
162         }
163         
164         if (headers.size() > 0)
165         {
166             muleMessage.setOutboundProperty(name + AbstractMailConnector.ATTACHMENT_HEADERS_PROPERTY_POSTFIX,
167                                             headers);
168         }
169     }
170 }