1
2
3
4
5
6
7
8
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 }