1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.email.transformers;
12
13 import org.mule.api.MuleMessage;
14 import org.mule.api.transformer.TransformerException;
15 import org.mule.transformer.AbstractMessageTransformer;
16 import org.mule.transformer.types.DataTypeFactory;
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
37
38
39
40 public class StringToEmailMessage extends AbstractMessageTransformer
41 {
42
43
44
45 private final Log logger = LogFactory.getLog(getClass());
46
47 private TemplateParser templateParser = TemplateParser.createMuleStyleParser();
48
49 public StringToEmailMessage()
50 {
51 this.registerSourceType(DataTypeFactory.STRING);
52 this.setReturnDataType(DataTypeFactory.create(Message.class));
53 }
54
55
56 @Override
57 public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException
58 {
59 String endpointAddress = endpoint.getEndpointURI().getAddress();
60 SmtpConnector connector = (SmtpConnector) endpoint.getConnector();
61 String to = lookupProperty(message, MailProperties.TO_ADDRESSES_PROPERTY, endpointAddress);
62 String cc = lookupProperty(message, MailProperties.CC_ADDRESSES_PROPERTY, connector.getCcAddresses());
63 String bcc = lookupProperty(message, MailProperties.BCC_ADDRESSES_PROPERTY, connector.getBccAddresses());
64 String from = lookupProperty(message, MailProperties.FROM_ADDRESS_PROPERTY, connector.getFromAddress());
65 String replyTo = lookupProperty(message, MailProperties.REPLY_TO_ADDRESSES_PROPERTY, connector.getReplyToAddresses());
66 String subject = lookupProperty(message, MailProperties.SUBJECT_PROPERTY, connector.getSubject());
67 String contentType = lookupProperty(message, MailProperties.CONTENT_TYPE_PROPERTY, connector.getContentType());
68
69 Properties headers = new Properties();
70 Properties customHeaders = connector.getCustomHeaders();
71
72 if (customHeaders != null && !customHeaders.isEmpty())
73 {
74 headers.putAll(customHeaders);
75 }
76
77 Properties otherHeaders = message.getOutboundProperty(MailProperties.CUSTOM_HEADERS_MAP_PROPERTY);
78 if (otherHeaders != null && !otherHeaders.isEmpty())
79 {
80
81
82
83
84
85
86
87 headers.putAll(templateParser.parse(new TemplateParser.TemplateCallback()
88 {
89 public Object match(String token)
90 {
91 return muleContext.getRegistry().lookupObject(token);
92 }
93 }, otherHeaders));
94
95 }
96
97 if (logger.isDebugEnabled())
98 {
99 StringBuffer buf = new StringBuffer();
100 buf.append("Constructing email using:\n");
101 buf.append("To: ").append(to);
102 buf.append(", From: ").append(from);
103 buf.append(", CC: ").append(cc);
104 buf.append(", BCC: ").append(bcc);
105 buf.append(", Subject: ").append(subject);
106 buf.append(", ReplyTo: ").append(replyTo);
107 buf.append(", Content type: ").append(contentType);
108 buf.append(", Payload type: ").append(message.getPayload().getClass().getName());
109 buf.append(", Custom Headers: ").append(MapUtils.toString(headers, false));
110 logger.debug(buf.toString());
111 }
112
113 try
114 {
115 Message email = new MimeMessage(((SmtpConnector) endpoint.getConnector()).getSessionDetails(endpoint).getSession());
116
117 email.setRecipients(Message.RecipientType.TO, MailUtils.stringToInternetAddresses(to));
118
119
120 email.setSentDate(Calendar.getInstance().getTime());
121
122 if (StringUtils.isNotBlank(from))
123 {
124 email.setFrom(MailUtils.stringToInternetAddresses(from)[0]);
125 }
126
127 if (StringUtils.isNotBlank(cc))
128 {
129 email.setRecipients(Message.RecipientType.CC, MailUtils.stringToInternetAddresses(cc));
130 }
131
132 if (StringUtils.isNotBlank(bcc))
133 {
134 email.setRecipients(Message.RecipientType.BCC, MailUtils.stringToInternetAddresses(bcc));
135 }
136
137 if (StringUtils.isNotBlank(replyTo))
138 {
139 email.setReplyTo(MailUtils.stringToInternetAddresses(replyTo));
140 }
141
142 email.setSubject(subject);
143
144 for (Iterator iterator = headers.entrySet().iterator(); iterator.hasNext();)
145 {
146 Map.Entry entry = (Map.Entry) iterator.next();
147 email.setHeader(entry.getKey().toString(), entry.getValue().toString());
148 }
149
150 setContent(message.getPayload(), email, contentType, message);
151
152 return email;
153 }
154 catch (Exception e)
155 {
156 throw new TransformerException(this, e);
157 }
158 }
159
160
161
162
163 protected String lookupProperty(MuleMessage message, String propName, String defaultValue)
164 {
165 String value = message.getOutboundProperty(propName);
166 if (value == null)
167 {
168 value = message.getInvocationProperty(propName, defaultValue);
169 }
170 return value;
171 }
172
173 protected void setContent(Object payload, Message msg, String contentType, MuleMessage message)
174 throws Exception
175 {
176 msg.setContent(payload, contentType);
177 }
178
179 }