MailNotification.java
package org.itracker.web.scheduler.tasks;
import org.apache.log4j.Logger;
import org.itracker.services.NotificationService;
import javax.mail.*;
import javax.mail.search.FlagTerm;
import java.util.Properties;
/**
 * @author rui (rui.silva@emation.pt)
 */
public class MailNotification extends BaseJob {
    private static final Logger logger = Logger.getLogger(MailNotification.class);
    private String projectId;
    private String mailHost;
    private String user;
    private String password;
    private String folderName;
    private String protocol;
    private NotificationService notificationService;
    public MailNotification() {
    }
    public void setNotificationService(NotificationService notificationService) {
        this.notificationService = notificationService;
    }
    public NotificationService getNotificationService() {
        return notificationService;
    }
    /**
     *
     */
    @SuppressWarnings("unused")
    private String getProjectId() {
        return projectId;
    }
    private void setProjectId(String id) {
        projectId = id;
    }
    /*
     * (non-Javadoc)
     * 
     * @see org.itracker.web.scheduler.SchedulableTask#performTask(java.lang.String[])
     */
    public void performTask(String[] args) {
        mailHost = args[0];
        user = args[1];
        password = args[2];
        folderName = args[3];
        setProjectId(args[4]);
        protocol = args[5];
        try {
            process();
        } catch (MessagingException ex) {
            logger.error("performTask: failed with messaging exception", ex);
        } catch (NotificationException ex) {
            logger.error("performTask: failed with notification exception", ex);
        }
    }
    /**
     * process() checks for new messages and calls processMsg() for every new
     * message
     */
    public void process() throws MessagingException, NotificationException {
        // Get a Session object
        //
        Session session = Session.getDefaultInstance(new Properties(), null);
        // Connect to host
        //
        Store store = session.getStore(protocol);
        store.connect(mailHost, -1, user, password);
        // Open the default folder
        //
        Folder src_folder = store.getFolder(folderName);
        if (src_folder == null) {
            throw new NotificationException("Unable to get folder: null");
        }
        // Get message count
        //
        src_folder.open(Folder.READ_WRITE);
        // TODO: never used, commented, task added:
        // int totalMessages = src_folder.getMessageCount();
        // Get attributes & flags for all messages
        //
        Message[] messages = src_folder.getMessages();
        FetchProfile fp = new FetchProfile();
        fp.add(FetchProfile.Item.ENVELOPE);
        fp.add(FetchProfile.Item.FLAGS);
        fp.add("From");
        src_folder.fetch(messages, fp);
        // Process each message
        //
        FlagTerm search = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
        for (int i = 0; i < messages.length; i++) {
            Message message = messages[i];
            if (search.match(message)) {
                try {
                    // TODO: process message
                    message.setFlag(Flags.Flag.SEEN, true);
                    logger.info("Processed Message: " + message.getSubject() + " From: " + message.getFrom()[0]);
                } catch (Exception e) {
                    logger.error("Couldn't process Message: " + message.getSubject() + " From: "
                            + message.getFrom()[0], e);
                    try {
                        message.setFlag(Flags.Flag.SEEN, false);
                    } catch (Exception exception) {
                        logger.error(exception.getMessage(), exception);
                    }
                }
            } else {
                logger.info("Didn't process Message: " + message.getSubject() + " From: " + message.getFrom()[0]
                        + ". Message already read.");
            }
        }
        src_folder.close(true);
        store.close();
    }
}