View Javadoc

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   * @author rui (rui.silva@emation.pt)
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       * (non-Javadoc)
56       * 
57       * @see org.itracker.web.scheduler.SchedulableTask#performTask(java.lang.String[])
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       * process() checks for new messages and calls processMsg() for every new
81       * message
82       * @throws MessagingException
83       * @throws NotificationException
84       */
85      public void process() throws MessagingException, NotificationException {
86  
87          // Get a Session object
88          //
89          Session session = Session.getDefaultInstance(new Properties(), null);
90  
91          // Connect to host
92          //
93          Store store = session.getStore(protocol);
94          store.connect(mailHost, -1, user, password);
95  
96          // Open the default folder
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         // Get message count
104         //
105         src_folder.open(Folder.READ_WRITE);
106 
107         // TODO: never used, commented, task added:
108         // int totalMessages = src_folder.getMessageCount();
109 
110         // Get attributes & flags for all messages
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         // Process each message
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                     // TODO: process message
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