001
014
015 package com.liferay.portlet.messageboards.messaging;
016
017 import com.liferay.portal.NoSuchUserException;
018 import com.liferay.portal.kernel.log.Log;
019 import com.liferay.portal.kernel.log.LogFactoryUtil;
020 import com.liferay.portal.kernel.mail.Account;
021 import com.liferay.portal.kernel.messaging.MessageListener;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.model.User;
024 import com.liferay.portal.security.permission.PermissionCheckerUtil;
025 import com.liferay.portal.service.ServiceContext;
026 import com.liferay.portal.service.UserLocalServiceUtil;
027 import com.liferay.portal.util.PortalUtil;
028 import com.liferay.portal.util.PortletKeys;
029 import com.liferay.portlet.messageboards.NoSuchMessageException;
030 import com.liferay.portlet.messageboards.model.MBMessage;
031 import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
032 import com.liferay.portlet.messageboards.service.MBMessageServiceUtil;
033 import com.liferay.portlet.messageboards.util.MBMailMessage;
034 import com.liferay.portlet.messageboards.util.MBUtil;
035 import com.liferay.portlet.messageboards.util.MailingListThreadLocal;
036 import com.liferay.util.mail.MailEngine;
037
038 import javax.mail.Address;
039 import javax.mail.Flags;
040 import javax.mail.Folder;
041 import javax.mail.Message;
042 import javax.mail.MessagingException;
043 import javax.mail.Session;
044 import javax.mail.Store;
045 import javax.mail.URLName;
046 import javax.mail.internet.InternetAddress;
047
048
051 public class MailingListMessageListener implements MessageListener {
052
053 public void receive(com.liferay.portal.kernel.messaging.Message message) {
054 MailingListRequest mailingListRequest =
055 (MailingListRequest)message.getPayload();
056
057 Folder folder = null;
058
059 Message[] messages = null;
060
061 try {
062 folder = getFolder(mailingListRequest);
063
064 messages = folder.getMessages();
065
066 processMessages(mailingListRequest, messages);
067 }
068 catch (Exception e) {
069 _log.error(e, e);
070 }
071 finally {
072 if ((folder != null) && folder.isOpen()) {
073 try {
074 folder.setFlags(
075 messages, new Flags(Flags.Flag.DELETED), true);
076 }
077 catch (Exception e) {
078 }
079
080 try {
081 folder.close(true);
082 }
083 catch (Exception e) {
084 }
085 }
086 }
087 }
088
089 protected Folder getFolder(MailingListRequest mailingListRequest)
090 throws Exception {
091
092 String protocol = mailingListRequest.getInProtocol();
093 String host = mailingListRequest.getInServerName();
094 int port = mailingListRequest.getInServerPort();
095 String user = mailingListRequest.getInUserName();
096 String password = mailingListRequest.getInPassword();
097
098 Account account = Account.getInstance(protocol, port);
099
100 account.setHost(host);
101 account.setPort(port);
102 account.setUser(user);
103 account.setPassword(password);
104
105 Session session = MailEngine.getSession(account);
106
107 URLName urlName = new URLName(
108 protocol, host, port, StringPool.BLANK, user, password);
109
110 Store store = session.getStore(urlName);
111
112 store.connect();
113
114 Folder defaultFolder = store.getDefaultFolder();
115
116 Folder[] folders = defaultFolder.list();
117
118 if ((folders != null) && (folders.length == 0)) {
119 throw new MessagingException("Inbox not found");
120 }
121
122 Folder folder = folders[0];
123
124 folder.open(Folder.READ_WRITE);
125
126 return folder;
127 }
128
129 protected void processMessage(
130 MailingListRequest mailingListRequest, Message mailMessage)
131 throws Exception {
132
133 if (MBUtil.hasMailIdHeader(mailMessage)) {
134 return;
135 }
136
137 String from = null;
138
139 Address[] addresses = mailMessage.getFrom();
140
141 if ((addresses != null) && (addresses.length > 0)) {
142 Address address = addresses[0];
143
144 if (address instanceof InternetAddress) {
145 from = ((InternetAddress)address).getAddress();
146 }
147 else {
148 from = address.toString();
149 }
150 }
151
152 long companyId = mailingListRequest.getCompanyId();
153 long groupId = mailingListRequest.getGroupId();
154 long categoryId = mailingListRequest.getCategoryId();
155
156 if (_log.isDebugEnabled()) {
157 _log.debug("Category id " + categoryId);
158 }
159
160 boolean anonymous = false;
161
162 User user = UserLocalServiceUtil.getUserById(
163 companyId, mailingListRequest.getUserId());
164
165 try {
166 user = UserLocalServiceUtil.getUserByEmailAddress(companyId, from);
167 }
168 catch (NoSuchUserException nsue) {
169 anonymous = true;
170 }
171
172 long parentMessageId = MBUtil.getParentMessageId(mailMessage);
173
174 if (_log.isDebugEnabled()) {
175 _log.debug("Parent message id " + parentMessageId);
176 }
177
178 MBMessage parentMessage = null;
179
180 try {
181 if (parentMessageId > 0) {
182 parentMessage = MBMessageLocalServiceUtil.getMessage(
183 parentMessageId);
184 }
185 }
186 catch (NoSuchMessageException nsme) {
187 }
188
189 if (_log.isDebugEnabled()) {
190 _log.debug("Parent message " + parentMessage);
191 }
192
193 MBMailMessage collector = new MBMailMessage();
194
195 MBUtil.collectPartContent(mailMessage, collector);
196
197 PermissionCheckerUtil.setThreadValues(user);
198
199 MailingListThreadLocal.setSourceMailingList(true);
200
201 String subject = MBUtil.getSubjectWithoutMessageId(mailMessage);
202
203 ServiceContext serviceContext = new ServiceContext();
204
205 serviceContext.setAddCommunityPermissions(true);
206 serviceContext.setAddGuestPermissions(true);
207 serviceContext.setLayoutFullURL(
208 PortalUtil.getLayoutFullURL(groupId, PortletKeys.MESSAGE_BOARDS));
209 serviceContext.setScopeGroupId(groupId);
210
211 if (parentMessage == null) {
212 MBMessageServiceUtil.addMessage(
213 groupId, categoryId, subject, collector.getBody(),
214 collector.getFiles(), anonymous, 0.0, true, serviceContext);
215 }
216 else {
217 MBMessageServiceUtil.addMessage(
218 groupId, categoryId, parentMessage.getThreadId(),
219 parentMessage.getMessageId(), subject, collector.getBody(),
220 collector.getFiles(), anonymous, 0.0, true, serviceContext);
221 }
222 }
223
224 protected void processMessages(
225 MailingListRequest mailingListRequest, Message[] messages)
226 throws Exception {
227
228 for (Message message : messages) {
229 try {
230 processMessage(mailingListRequest, message);
231 }
232 finally {
233 PermissionCheckerUtil.setThreadValues(null);
234 }
235 }
236 }
237
238 private static Log _log = LogFactoryUtil.getLog(
239 MailingListMessageListener.class);
240
241 }