// Released under the Canoo Webtest license. package com.canoo.webtest.plugins.emailtest; import java.util.Properties; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.NoSuchProviderException; import org.apache.log4j.Logger; import com.canoo.webtest.util.ConversionUtil; /** * Helper class for processing email messages. * * @author Paul King * @author Luca Scheuring * @author lofi@mountproc.org */ public class EmailHelper { private static final Logger LOG = Logger.getLogger(EmailHelper.class); /** * log into Email server and fetch mails (only headers) * * @return message array */ Message[] getMessages(final Folder folder) throws MessagingException { // Get the message wrappers final Message[] msgs = folder.getMessages(); LOG.debug("Login to Email server successful, " + msgs.length + " message(s) on server"); return msgs; } Message getMessage(final int id, final Folder folder) throws MessagingException { // Get the message wrappers final Message[] msgs = getMessages(folder); for (int i = 0; i < msgs.length; i++) { if (msgs[i].getMessageNumber() == id) { return msgs[i]; } } return null; } /** * Mark a message for deletion (message gets deleted when closing inbox) * * @param m message to be deleted */ void markForDelete(final Message m) throws MessagingException { m.setFlag(Flags.Flag.DELETED, true); LOG.debug("Message " + m.getMessageNumber() + " marked for delete"); } Folder getInboxFolder(final EmailConfigInfo info) throws MessagingException { int port = -1; String server = info.getServer(); final int colonPosn = server.indexOf(":"); if (colonPosn != -1) { port = extractPort(server, colonPosn); server = server.substring(0, colonPosn); } processDelayIfNeeded(info.getDelay()); // Get the default session final Session session = getSessionInstance(System.getProperties()); // Get an email message store, and connect to it final Store store = getStore(session, info.getType()); store.connect(server, port, info.getUsername(), info.getPassword()); // Try to get the default folder Folder folder = store.getDefaultFolder(); if (folder == null) { throw new MessagingException("No default folder"); } // ...and its INBOX folder = folder.getFolder("INBOX"); if (folder == null) { throw new MessagingException("No INBOX"); } // Open the folder with r/w-access folder.open(Folder.READ_WRITE); return folder; } private static int extractPort(final String server, final int colonPosn) throws MessagingException { final String portStr = server.substring(colonPosn + 1); try { return Integer.parseInt(portStr); } catch (NumberFormatException e) { throw new MessagingException("Port must be numeric, illegal value: " + portStr); } } private static void processDelayIfNeeded(final String delayStr) throws MessagingException { if (delayStr != null) { try { final int delay = ConversionUtil.convertToInt(delayStr, 0); Thread.sleep(delay * 1000); } catch (NumberFormatException nfe) { throw new MessagingException("Delay must be numeric, illegal value: " + delayStr); } catch (InterruptedException ie) {/* ignore */ } } } protected Store getStore(final Session session, final String type) throws NoSuchProviderException { return session.getStore(type); } protected Session getSessionInstance(final Properties properties) { return Session.getInstance(properties); } /** * log out of email server. expunge if deleteOnServer is true */ void logout(final Folder folder, final boolean deleteOnServer) { try { if (folder != null) { LOG.debug("closing INBOX..."); folder.close(deleteOnServer); } } catch (MessagingException e) { LOG.warn("Failed to close INBOX folder.", e); } } }