1 package org.itracker.web.scheduler.tasks;
2
3 import java.util.Properties;
4
5 import javax.mail.FetchProfile;
6 import javax.mail.Flags;
7 import javax.mail.Folder;
8 import javax.mail.Message;
9 import javax.mail.MessagingException;
10 import javax.mail.Session;
11 import javax.mail.Store;
12 import javax.mail.search.FlagTerm;
13
14 import org.apache.log4j.Logger;
15 import org.itracker.services.NotificationService;
16
17
18
19
20
21 public class MailNotification extends BaseJob {
22
23 private static final Logger logger = Logger.getLogger(MailNotification.class);
24 private String projectId;
25 private String mailHost;
26 private String user;
27 private String password;
28 private String folderName;
29 private String protocol;
30 private NotificationService notificationService;
31
32 public MailNotification() {
33 }
34
35 public void setNotificationService(NotificationService notificationService) {
36 this.notificationService = notificationService;
37 }
38 public NotificationService getNotificationService() {
39 return notificationService;
40 }
41
42
43
44
45 @SuppressWarnings("unused")
46 private String getProjectId() {
47 return projectId;
48 }
49
50 private void setProjectId(String id) {
51 projectId= id;
52 }
53
54
55
56
57
58
59 public void performTask(String[] args) {
60
61 mailHost = args[0];
62 user = args[1];
63 password = args[2];
64 folderName = args[3];
65
66 setProjectId(args[4]);
67
68 protocol = args[5];
69
70 try {
71 process();
72 } catch (MessagingException ex) {
73 logger.error("performTask: failed with messaging exception", ex);
74 } catch (NotificationException ex) {
75 logger.error("performTask: failed with notification exception", ex);
76 }
77 }
78
79
80
81
82
83
84
85 public void process() throws MessagingException, NotificationException {
86
87
88
89 Session session = Session.getDefaultInstance(new Properties(), null);
90
91
92
93 Store store = session.getStore(protocol);
94 store.connect(mailHost, -1, user, password);
95
96
97
98 Folder src_folder = store.getFolder(folderName);
99
100 if (src_folder == null) {
101 throw new NotificationException("Unable to get folder: null");
102 }
103
104
105 src_folder.open(Folder.READ_WRITE);
106
107
108
109
110
111
112 Message[] messages = src_folder.getMessages();
113 FetchProfile fp = new FetchProfile();
114 fp.add(FetchProfile.Item.ENVELOPE);
115 fp.add(FetchProfile.Item.FLAGS);
116 fp.add("From");
117 src_folder.fetch(messages, fp);
118
119
120
121
122 FlagTerm search = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
123
124 for (int i = 0; i < messages.length; i++) {
125 Message message = messages[i];
126 if (search.match(message)) {
127 try {
128
129
130
131 message.setFlag(Flags.Flag.SEEN, true);
132 logger.info("Processed Message: " + message.getSubject() + " From: " + message.getFrom()[0]);
133 } catch (Exception e) {
134 logger.error("Couldn't process Message: " + message.getSubject() + " From: "
135 + message.getFrom()[0], e);
136 try {
137 message.setFlag(Flags.Flag.SEEN, false);
138 } catch (Exception exception) {
139 logger.error(exception.getMessage(), exception);
140 }
141 }
142 } else {
143 logger.info("Didn't process Message: " + message.getSubject() + " From: " + message.getFrom()[0]
144 + ". Message already read.");
145 }
146
147 }
148 src_folder.close(true);
149 store.close();
150 }
151
152 }
153