1
22
23 package com.liferay.portal.pop;
24
25 import com.liferay.portal.job.IntervalJob;
26 import com.liferay.portal.kernel.pop.MessageListener;
27 import com.liferay.portal.kernel.util.GetterUtil;
28 import com.liferay.portal.kernel.util.StringPool;
29 import com.liferay.portal.util.PropsUtil;
30 import com.liferay.util.Time;
31 import com.liferay.util.mail.MailEngine;
32
33 import java.util.Iterator;
34 import java.util.List;
35
36 import javax.mail.Address;
37 import javax.mail.Flags;
38 import javax.mail.Folder;
39 import javax.mail.Message.RecipientType;
40 import javax.mail.Message;
41 import javax.mail.MessagingException;
42 import javax.mail.Session;
43 import javax.mail.Store;
44 import javax.mail.internet.InternetAddress;
45
46 import org.apache.commons.logging.Log;
47 import org.apache.commons.logging.LogFactory;
48
49 import org.quartz.JobExecutionContext;
50 import org.quartz.JobExecutionException;
51
52
58 public class POPNotificationsJob implements IntervalJob {
59
60 public static final long INTERVAL = GetterUtil.getLong(PropsUtil.get(
61 PropsUtil.POP_SERVER_NOTIFICATIONS_INTERVAL)) * Time.MINUTE;
62
63 public long getInterval() {
64 return INTERVAL;
65 }
66
67 public void execute(JobExecutionContext context)
68 throws JobExecutionException {
69
70 if (!_executing) {
71 try {
72 _executing = true;
73
74 if (_log.isDebugEnabled()) {
75 _log.debug("Executing");
76
77 pollPopServer();
78 }
79 }
80 catch (Exception e) {
81 _log.error(e, e);
82 }
83 finally {
84 _executing = false;
85 }
86 }
87 else {
88 if (_log.isDebugEnabled()) {
89 _log.debug("Not executing");
90 }
91 }
92 }
93
94 protected String getEmailAddress(Address[] addresses) {
95 if ((addresses == null) || (addresses.length == 0)) {
96 return StringPool.BLANK;
97 }
98
99 InternetAddress internetAddress = (InternetAddress)addresses[0];
100
101 return internetAddress.getAddress();
102 }
103
104 protected void initInboxFolder() throws Exception {
105 if ((_inboxFolder == null) || !_inboxFolder.isOpen()) {
106 initStore();
107
108 Folder defaultFolder = _store.getDefaultFolder();
109
110 Folder[] folders = defaultFolder.list();
111
112 if (folders.length == 0) {
113 throw new MessagingException("Inbox not found");
114 }
115 else {
116 _inboxFolder = folders[0];
117
118 _inboxFolder.open(Folder.READ_WRITE);
119 }
120 }
121 }
122
123 protected void initStore() throws Exception {
124 if ((_store == null) || !_store.isConnected()) {
125 Session session = MailEngine.getSession();
126
127 _store = session.getStore("pop3");
128
129 String popHost = session.getProperty("mail.pop3.host");
130 String smtpUser = session.getProperty("mail.smtp.user");
131 String smtpPassword = session.getProperty("mail.smtp.password");
132
133 _store.connect(popHost, smtpUser, smtpPassword);
134 }
135 }
136
137 protected void nostifyListeners(List listeners, Message message)
138 throws Exception {
139
140 String from = getEmailAddress(message.getFrom());
141 String recipient = getEmailAddress(
142 message.getRecipients(RecipientType.TO));
143
144 if (_log.isDebugEnabled()) {
145 _log.debug("From " + from);
146 _log.debug("Recipient " + recipient);
147 }
148
149 Iterator itr = listeners.iterator();
150
151 while (itr.hasNext()) {
152 MessageListener messageListener = (MessageListener)itr.next();
153
154 try {
155 if (messageListener.accept(from, recipient)) {
156 messageListener.deliver(from, recipient, message);
157 }
158 }
159 catch (Exception e) {
160 _log.error(e, e);
161 }
162 }
163 }
164
165 protected void nostifyListeners(Message[] messages) throws Exception {
166 if (_log.isDebugEnabled()) {
167 _log.debug("Messages " + messages.length);
168 }
169
170 List listeners = POPServerUtil.getListeners();
171
172 for (int i = 0; i < messages.length; i++) {
173 Message message = messages[i];
174
175 if (_log.isDebugEnabled()) {
176 _log.debug("Message " + message);
177 }
178
179 nostifyListeners(listeners, message);
180 }
181 }
182
183 protected void pollPopServer() throws Exception {
184 initInboxFolder();
185
186 Message[] messages = _inboxFolder.getMessages();
187
188 try {
189 nostifyListeners(messages);
190 }
191 finally {
192 if (_log.isDebugEnabled()) {
193 _log.debug("Deleting messages");
194 }
195
196 _inboxFolder.setFlags(
197 messages, new Flags(Flags.Flag.DELETED), true);
198
199 _inboxFolder.close(true);
200 }
201 }
202
203 private static Log _log = LogFactory.getLog(POPNotificationsJob.class);
204
205 private boolean _executing;
206 private Store _store;
207 private Folder _inboxFolder;
208
209 }