1
2
3
4
5
6
7
8
9
10
11 package org.mule.providers.email;
12
13 import org.mule.config.i18n.CoreMessages;
14 import org.mule.providers.AbstractMessageDispatcher;
15 import org.mule.umo.UMOEvent;
16 import org.mule.umo.UMOMessage;
17 import org.mule.umo.endpoint.EndpointException;
18 import org.mule.umo.endpoint.UMOEndpointURI;
19 import org.mule.umo.endpoint.UMOImmutableEndpoint;
20 import org.mule.umo.provider.DispatchException;
21
22 import java.util.Calendar;
23
24 import javax.mail.Message;
25 import javax.mail.MessagingException;
26 import javax.mail.Transport;
27
28
29
30
31
32
33
34 public class SmtpMessageDispatcher extends AbstractMessageDispatcher
35 {
36 private volatile Transport transport;
37
38 public SmtpMessageDispatcher(UMOImmutableEndpoint endpoint)
39 {
40 super(endpoint);
41 }
42
43 private SmtpConnector castConnector()
44 {
45 return (SmtpConnector) getConnector();
46 }
47
48 protected void doConnect() throws Exception
49 {
50 if (transport == null)
51 {
52 try
53 {
54 transport = castConnector().getSessionDetails(endpoint).newTransport();
55 UMOEndpointURI uri = endpoint.getEndpointURI();
56 transport.connect(uri.getHost(), uri.getPort(), uri.getUsername(), uri.getPassword());
57 }
58 catch (Exception e)
59 {
60 throw new EndpointException(
61 org.mule.config.i18n.MessageFactory.createStaticMessage("Unable to connect to mail transport."),
62 e);
63 }
64 }
65 }
66
67 protected void doDisconnect() throws Exception
68 {
69 if (null != transport)
70 {
71 try
72 {
73 transport.close();
74 }
75 finally
76 {
77 transport = null;
78 }
79 }
80 }
81
82 protected void doDispatch(UMOEvent event)
83 {
84 try
85 {
86 Object data = event.getTransformedMessage();
87
88 if (!(data instanceof Message))
89 {
90 throw new DispatchException(
91 CoreMessages.transformUnexpectedType(data.getClass(), Message.class),
92 event.getMessage(), event.getEndpoint());
93 }
94 else
95 {
96
97 sendMailMessage((Message) data);
98 }
99 }
100 catch (Exception e)
101 {
102 connector.handleException(e);
103 }
104 }
105
106
107
108
109
110
111
112
113
114
115
116
117 protected UMOMessage doReceive(long timeout) throws Exception
118 {
119 throw new UnsupportedOperationException("doReceive");
120 }
121
122 protected UMOMessage doSend(UMOEvent event) throws Exception
123 {
124 doDispatch(event);
125 return null;
126 }
127
128 protected void sendMailMessage(Message message) throws MessagingException
129 {
130
131 message.setSentDate(Calendar.getInstance().getTime());
132
133
134
135
136
137 if (!transport.isConnected())
138 {
139 UMOEndpointURI uri = endpoint.getEndpointURI();
140 if (logger.isInfoEnabled())
141 {
142 logger.info("Connection closed by remote server. Reconnecting.");
143 }
144 transport.connect(uri.getHost(), uri.getPort(), uri.getUsername(), uri.getPassword());
145 }
146
147 transport.sendMessage(message, message.getAllRecipients());
148
149 if (logger.isDebugEnabled())
150 {
151 StringBuffer msg = new StringBuffer();
152 msg.append("Email message sent with subject'").append(message.getSubject()).append("' sent- ");
153 msg.append(", From: ").append(MailUtils.mailAddressesToString(message.getFrom())).append(" ");
154 msg.append(", To: ").append(
155 MailUtils.mailAddressesToString(message.getRecipients(Message.RecipientType.TO))).append(" ");
156 msg.append(", Cc: ").append(
157 MailUtils.mailAddressesToString(message.getRecipients(Message.RecipientType.CC))).append(" ");
158 msg.append(", Bcc: ")
159 .append(MailUtils.mailAddressesToString(message.getRecipients(Message.RecipientType.BCC)))
160 .append(" ");
161 msg.append(", ReplyTo: ").append(MailUtils.mailAddressesToString(message.getReplyTo()));
162
163 logger.debug(msg.toString());
164 }
165
166 }
167
168 protected void doDispose()
169 {
170
171 }
172
173 }