MailNotification.java

  1. package org.itracker.web.scheduler.tasks;

  2. import org.apache.log4j.Logger;
  3. import org.itracker.services.NotificationService;

  4. import javax.mail.*;
  5. import javax.mail.search.FlagTerm;
  6. import java.util.Properties;

  7. /**
  8.  * @author rui (rui.silva@emation.pt)
  9.  */
  10. public class MailNotification extends BaseJob {

  11.     private static final Logger logger = Logger.getLogger(MailNotification.class);
  12.     private String projectId;
  13.     private String mailHost;
  14.     private String user;
  15.     private String password;
  16.     private String folderName;
  17.     private String protocol;
  18.     private NotificationService notificationService;

  19.     public MailNotification() {
  20.     }

  21.     public void setNotificationService(NotificationService notificationService) {
  22.         this.notificationService = notificationService;
  23.     }

  24.     public NotificationService getNotificationService() {
  25.         return notificationService;
  26.     }

  27.     /**
  28.      *
  29.      */
  30.     @SuppressWarnings("unused")
  31.     private String getProjectId() {
  32.         return projectId;
  33.     }

  34.     private void setProjectId(String id) {
  35.         projectId = id;
  36.     }

  37.     /*
  38.      * (non-Javadoc)
  39.      *
  40.      * @see org.itracker.web.scheduler.SchedulableTask#performTask(java.lang.String[])
  41.      */
  42.     public void performTask(String[] args) {

  43.         mailHost = args[0];
  44.         user = args[1];
  45.         password = args[2];
  46.         folderName = args[3];

  47.         setProjectId(args[4]);

  48.         protocol = args[5];

  49.         try {
  50.             process();
  51.         } catch (MessagingException ex) {
  52.             logger.error("performTask: failed with messaging exception", ex);
  53.         } catch (NotificationException ex) {
  54.             logger.error("performTask: failed with notification exception", ex);
  55.         }
  56.     }

  57.     /**
  58.      * process() checks for new messages and calls processMsg() for every new
  59.      * message
  60.      */
  61.     public void process() throws MessagingException, NotificationException {

  62.         // Get a Session object
  63.         //
  64.         Session session = Session.getDefaultInstance(new Properties(), null);

  65.         // Connect to host
  66.         //
  67.         Store store = session.getStore(protocol);
  68.         store.connect(mailHost, -1, user, password);

  69.         // Open the default folder
  70.         //
  71.         Folder src_folder = store.getFolder(folderName);

  72.         if (src_folder == null) {
  73.             throw new NotificationException("Unable to get folder: null");
  74.         }
  75.         // Get message count
  76.         //
  77.         src_folder.open(Folder.READ_WRITE);

  78.         // TODO: never used, commented, task added:
  79.         // int totalMessages = src_folder.getMessageCount();

  80.         // Get attributes & flags for all messages
  81.         //
  82.         Message[] messages = src_folder.getMessages();
  83.         FetchProfile fp = new FetchProfile();
  84.         fp.add(FetchProfile.Item.ENVELOPE);
  85.         fp.add(FetchProfile.Item.FLAGS);
  86.         fp.add("From");
  87.         src_folder.fetch(messages, fp);

  88.         // Process each message
  89.         //

  90.         FlagTerm search = new FlagTerm(new Flags(Flags.Flag.SEEN), false);

  91.         for (int i = 0; i < messages.length; i++) {
  92.             Message message = messages[i];
  93.             if (search.match(message)) {
  94.                 try {

  95.                     // TODO: process message

  96.                     message.setFlag(Flags.Flag.SEEN, true);
  97.                     logger.info("Processed Message: " + message.getSubject() + " From: " + message.getFrom()[0]);
  98.                 } catch (Exception e) {
  99.                     logger.error("Couldn't process Message: " + message.getSubject() + " From: "
  100.                             + message.getFrom()[0], e);
  101.                     try {
  102.                         message.setFlag(Flags.Flag.SEEN, false);
  103.                     } catch (Exception exception) {
  104.                         logger.error(exception.getMessage(), exception);
  105.                     }
  106.                 }
  107.             } else {
  108.                 logger.info("Didn't process Message: " + message.getSubject() + " From: " + message.getFrom()[0]
  109.                         + ". Message already read.");
  110.             }

  111.         }
  112.         src_folder.close(true);
  113.         store.close();
  114.     }

  115. }