1
14
15 package com.liferay.portlet.messageboards.messaging;
16
17 import com.liferay.portal.NoSuchUserException;
18 import com.liferay.portal.kernel.json.JSONFactoryUtil;
19 import com.liferay.portal.kernel.log.Log;
20 import com.liferay.portal.kernel.log.LogFactoryUtil;
21 import com.liferay.portal.kernel.mail.Account;
22 import com.liferay.portal.kernel.messaging.MessageListener;
23 import com.liferay.portal.kernel.util.StringPool;
24 import com.liferay.portal.model.User;
25 import com.liferay.portal.security.permission.PermissionCheckerUtil;
26 import com.liferay.portal.service.ServiceContext;
27 import com.liferay.portal.service.UserLocalServiceUtil;
28 import com.liferay.portal.util.PortalUtil;
29 import com.liferay.portal.util.PortletKeys;
30 import com.liferay.portlet.messageboards.NoSuchMessageException;
31 import com.liferay.portlet.messageboards.model.MBMessage;
32 import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
33 import com.liferay.portlet.messageboards.service.MBMessageServiceUtil;
34 import com.liferay.portlet.messageboards.util.MBMailMessage;
35 import com.liferay.portlet.messageboards.util.MBUtil;
36 import com.liferay.portlet.messageboards.util.MailingListThreadLocal;
37 import com.liferay.util.mail.MailEngine;
38
39 import javax.mail.Address;
40 import javax.mail.Flags;
41 import javax.mail.Folder;
42 import javax.mail.Message;
43 import javax.mail.MessagingException;
44 import javax.mail.Session;
45 import javax.mail.Store;
46 import javax.mail.URLName;
47 import javax.mail.internet.InternetAddress;
48
49
54 public class MailingListMessageListener implements MessageListener {
55
56 public void receive(com.liferay.portal.kernel.messaging.Message message) {
57 MailingListRequest mailingListRequest =
58 (MailingListRequest)JSONFactoryUtil.deserialize(
59 (String)message.getPayload());
60
61 Store store = null;
62
63 Folder folder = null;
64
65 Message[] messages = null;
66
67 try {
68 store = getStore(mailingListRequest);
69
70 store.connect();
71
72 folder = getFolder(store);
73
74 messages = folder.getMessages();
75
76 processMessages(mailingListRequest, messages);
77 }
78 catch (Exception e) {
79 _log.error(e, e);
80 }
81 finally {
82 if ((folder != null) && folder.isOpen()) {
83 try {
84 folder.setFlags(
85 messages, new Flags(Flags.Flag.DELETED), true);
86 }
87 catch (Exception e) {
88 }
89
90 try {
91 folder.close(true);
92 }
93 catch (Exception e) {
94 }
95 }
96
97 if ((store != null) && store.isConnected()) {
98 try {
99 store.close();
100 }
101 catch (MessagingException e) {
102 }
103 }
104 }
105 }
106
107 protected Folder getFolder(Store store) throws Exception {
108 Folder defaultFolder = store.getDefaultFolder();
109
110 Folder[] folders = defaultFolder.list();
111
112 if ((folders != null) && (folders.length == 0)) {
113 throw new MessagingException("Inbox not found");
114 }
115
116 Folder folder = folders[0];
117
118 folder.open(Folder.READ_WRITE);
119
120 return folder;
121 }
122
123 protected Store getStore(MailingListRequest mailingListRequest)
124 throws Exception {
125
126 String protocol = mailingListRequest.getInProtocol();
127 String host = mailingListRequest.getInServerName();
128 int port = mailingListRequest.getInServerPort();
129 String user = mailingListRequest.getInUserName();
130 String password = mailingListRequest.getInPassword();
131
132 Account account = Account.getInstance(protocol, port);
133
134 account.setHost(host);
135 account.setPort(port);
136 account.setUser(user);
137 account.setPassword(password);
138
139 Session session = MailEngine.getSession(account);
140
141 URLName urlName = new URLName(
142 protocol, host, port, StringPool.BLANK, user, password);
143
144 Store store = session.getStore(urlName);
145
146 return store;
147 }
148
149 protected void processMessage(
150 MailingListRequest mailingListRequest, Message mailMessage)
151 throws Exception {
152
153 if (MBUtil.hasMailIdHeader(mailMessage)) {
154 return;
155 }
156
157 String from = null;
158
159 Address[] addresses = mailMessage.getFrom();
160
161 if ((addresses != null) && (addresses.length > 0)) {
162 Address address = addresses[0];
163
164 if (address instanceof InternetAddress) {
165 from = ((InternetAddress)address).getAddress();
166 }
167 else {
168 from = address.toString();
169 }
170 }
171
172 long companyId = mailingListRequest.getCompanyId();
173 long groupId = mailingListRequest.getGroupId();
174 long categoryId = mailingListRequest.getCategoryId();
175
176 if (_log.isDebugEnabled()) {
177 _log.debug("Category id " + categoryId);
178 }
179
180 boolean anonymous = false;
181
182 User user = UserLocalServiceUtil.getUserById(
183 companyId, mailingListRequest.getUserId());
184
185 try {
186 user = UserLocalServiceUtil.getUserByEmailAddress(companyId, from);
187 }
188 catch (NoSuchUserException nsue) {
189 anonymous = true;
190 }
191
192 long parentMessageId = MBUtil.getParentMessageId(mailMessage);
193
194 if (_log.isDebugEnabled()) {
195 _log.debug("Parent message id " + parentMessageId);
196 }
197
198 MBMessage parentMessage = null;
199
200 try {
201 if (parentMessageId > 0) {
202 parentMessage = MBMessageLocalServiceUtil.getMessage(
203 parentMessageId);
204 }
205 }
206 catch (NoSuchMessageException nsme) {
207 }
208
209 if (_log.isDebugEnabled()) {
210 _log.debug("Parent message " + parentMessage);
211 }
212
213 MBMailMessage collector = new MBMailMessage();
214
215 MBUtil.collectPartContent(mailMessage, collector);
216
217 PermissionCheckerUtil.setThreadValues(user);
218
219 MailingListThreadLocal.setSourceMailingList(true);
220
221 String subject = MBUtil.getSubjectWithoutMessageId(mailMessage);
222
223 ServiceContext serviceContext = new ServiceContext();
224
225 serviceContext.setAddCommunityPermissions(true);
226 serviceContext.setAddGuestPermissions(true);
227 serviceContext.setLayoutFullURL(
228 PortalUtil.getLayoutFullURL(groupId, PortletKeys.MESSAGE_BOARDS));
229 serviceContext.setScopeGroupId(groupId);
230
231 if (parentMessage == null) {
232 MBMessageServiceUtil.addMessage(
233 categoryId, subject, collector.getBody(), collector.getFiles(),
234 anonymous, 0.0, serviceContext);
235 }
236 else {
237 MBMessageServiceUtil.addMessage(
238 categoryId, parentMessage.getThreadId(),
239 parentMessage.getMessageId(), subject, collector.getBody(),
240 collector.getFiles(), anonymous, 0.0, serviceContext);
241 }
242 }
243
244 protected void processMessages(
245 MailingListRequest mailingListRequest, Message[] messages)
246 throws Exception {
247
248 for (Message message : messages) {
249 try {
250 processMessage(mailingListRequest, message);
251 }
252 finally {
253 PermissionCheckerUtil.setThreadValues(null);
254 }
255 }
256 }
257
258 private static Log _log = LogFactoryUtil.getLog(
259 MailingListMessageListener.class);
260
261 }