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();
}
}