/** * @return * @throws Exception */ public synchronized Folder getFolder() throws Exception { String folder = Constants.FOLDER_INBOX(profile); Folder fold = (Folder) pop3Folders.get(auth.getUsername()); if (fold != null && fold.isOpen()) { return fold; } else { if (folder != null && handler != null) { Store store = handler.getStore(); if (store == null || !store.isConnected()) { System.out.println("Connection is closed. Restoring it..."); handler = connect(Constants.CONNECTION_READ_WRITE); System.out.println("Connection re-established"); } fold = handler.getStore().getFolder(folder); if (!fold.isOpen()) { System.out.println("Folder :" + folder + " is closed. Opening again."); fold.open(Constants.CONNECTION_READ_WRITE); System.out.println("Folder is open again."); pop3Folders.put(auth.getUsername(), fold); } } } return fold; }
/** * @param auth * @param msg * @param request * @throws Exception */ private void saveDraft(AuthProfile auth, MimeMessage msg, HttpServletRequest request) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); msg.writeTo(bos); byte bMsg[] = bos.toByteArray(); // serialize the message byte array ObjectOutputStream os = new ObjectOutputStream(bos); os.writeObject(bMsg); // create an email db item MsgDbObject item = new MsgDbObject(); item.setEmail(bMsg); String md5Header = new String(MD5.getHashString(bMsg)).toUpperCase(new Locale("en", "US")); ConnectionMetaHandler handler = getConnectionHandler(request); ConnectionProfile profile = getConnectionProfile(request); FolderControllerFactory factory = new FolderControllerFactory(auth, profile, handler); FolderController foldCont = factory.getFolderController(); FolderDbObject fItem = foldCont.getDraftsFolder(); item.setUniqueId(md5Header); item.setFolderId(fItem.getId()); item.setUnread(new Boolean(false)); item.setUsername(auth.getUsername()); item.setMsgSize(new Long(bMsg.length)); // save the email db item. MailControllerFactory mailFact = new MailControllerFactory(auth, profile, handler, fItem.getFolderName()); MailController mailCont = mailFact.getMailController(); mailCont.appendEmail(item); }
/** @param f */ public void closeFolder(Folder f) { if (f != null) { try { if (f.isOpen()) { f.close(true); log.info("Folder: " + f.getName() + " was open and now closed."); HashMap imapUserFolders = (HashMap) imapFolders.get(auth.getUsername()); imapUserFolders.put(folder, null); imapFolders.put(auth.getUsername(), imapUserFolders); } else { log.info("Folder: " + f.getName() + " was already closed."); } } catch (MessagingException e) { log.info("Error while closing folder: " + f.getName(), e); } } }
/** * @return * @throws Exception */ public Folder getImapFolder(boolean useCache) throws Exception { Folder myFold = null; if (folder == null) { folder = Constants.FOLDER_INBOX(profile); } if (folder != null && handler != null) { Store store = handler.getStore(); if (store == null || !store.isConnected()) { log.debug("Connection is closed. Restoring it..."); handler = connect(Constants.CONNECTION_READ_WRITE); log.debug("Connection re-established"); } HashMap imapUserFolders = null; if (useCache) { imapUserFolders = (HashMap) imapFolders.get(auth.getUsername()); myFold = (Folder) imapUserFolders.get(folder); } if (myFold == null) { myFold = handler.getStore().getFolder(folder); } if (!myFold.isOpen()) { try { log.debug("Folder :" + folder + " is closed. Opening."); myFold.open(Constants.CONNECTION_READ_WRITE); log.debug("Folder is open."); } catch (Throwable e) { log.debug("nevermind go on"); // nevermind go on... } } if (useCache) { try { imapUserFolders.put(folder, myFold); imapFolders.put(auth.getUsername(), imapUserFolders); } catch (Exception e) { e.printStackTrace(); } } } return myFold; }
/** @param f */ public void closeFolder(Folder f) { if (f != null) { try { if (f.isOpen()) { f.close(true); } } catch (MessagingException e) { System.out.println("Error while closing folder: " + f.getName()); } } pop3Folders.put(auth.getUsername(), null); }
/** * @param profile * @param auth * @param handler */ ImapProtocolImpl( ConnectionProfile profile, AuthProfile auth, ConnectionMetaHandler handler, String folder) { this.profile = profile; this.auth = auth; this.handler = handler; this.folder = folder; if (imapFolders.get(auth.getUsername()) == null) { HashMap imapUserFolders = new HashMap(); imapFolders.put(auth.getUsername(), imapUserFolders); } if (this.folder == null || this.folder.trim().equals("") || this.folder.toLowerCase(loc).equals(Constants.FOLDER_INBOX(profile).toLowerCase(loc))) { this.folder = Constants.FOLDER_INBOX(profile); } else { if (!this.folder.startsWith(profile.getFolderNameSpace())) { this.folder = profile.getFolderNameSpace() + this.folder; } } }
/** * Disconnects the previously opened data connection if the connection is still alive. * * @param handler */ public void disconnect() { try { Folder fold = (Folder) pop3Folders.get(auth.getUsername()); if (fold != null) { fold.close(true); } try { if (handler.getMbox() != null) { handler.getMbox().close(true); } } catch (Exception e) { } try { if (handler.getStore() != null) { handler.getStore().close(); } } catch (Exception e) { } } catch (Exception e) { } pop3Folders.put(auth.getUsername(), null); }
/** * Disconnects the previously opened data connection if the connection is still alive. * * @param handler */ public void disconnect() { try { HashMap imapUserFolders = (HashMap) imapFolders.get(auth.getUsername()); Iterator iter = imapUserFolders.keySet().iterator(); Folder tmp = null; while (iter.hasNext()) { try { tmp = (Folder) imapUserFolders.get((String) iter.next()); closeFolder(tmp); tmp = null; } catch (Throwable e) { log.debug("Unable to close folder:" + tmp); } } imapFolders.put(auth.getUsername(), new HashMap()); } catch (Throwable e1) { } try { handler.getStore().close(); } catch (Exception e) { e.printStackTrace(); } }
/* (non-Javadoc) * @see org.claros.commons.mail.protocols.FetchProtocol#deleteMessages(int[]) */ public ConnectionMetaHandler deleteMessages(int[] messageIds) throws MailboxActionException, SystemException, ConnectionException { Folder fold = null; try { fold = getFolder(); if (messageIds != null && messageIds.length > 0) { for (int i = 0; i < messageIds.length; i++) { Message msg = fold.getMessage(messageIds[i]); msg.setFlag(Flags.Flag.DELETED, true); } } // fold.expunge(); disconnect(); connect(Constants.CONNECTION_READ_WRITE); return handler; } catch (Exception e) { pop3Folders.put(auth.getUsername(), null); System.out.println("Could not delete message ids: " + messageIds); throw new MailboxActionException(e); } }
/* (non-Javadoc) * @see org.claros.commons.mail.protocols.FetchProtocol#connect(int) */ public ConnectionMetaHandler connect(int connectType) throws SystemException, ConnectionException, ServerDownException { try { try { disconnect(); try { Thread.sleep(2000); } catch (Exception k) { } } catch (Exception k) { } if (handler == null || !handler.getStore().isConnected()) { Properties props = new Properties(); if (profile.getFetchSSL() != null && profile.getFetchSSL().toLowerCase().equals("true")) { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); Security.setProperty( "ssl.SocketFactory.provider", "org.claros.commons.mail.protocols.DummySSLSocketFactory"); props.setProperty("mail.store.protocol", "pop3"); props.setProperty("mail.pop3.host", profile.getFetchServer()); props.setProperty("mail.pop3.port", profile.getFetchPort()); props.setProperty( "mail.pop3.socketFactory.class", "org.claros.commons.mail.protocols.DummySSLSocketFactory"); props.setProperty("mail.pop3.socketFactory.fallback", "false"); props.setProperty("mail.pop3.port", profile.getFetchPort()); props.setProperty("mail.pop3.socketFactory.port", profile.getFetchPort()); } Session session = Session.getInstance(props); handler = new ConnectionMetaHandler(); handler.setStore(session.getStore(profile.getProtocol())); handler .getStore() .connect( profile.getFetchServer(), profile.getIFetchPort(), auth.getUsername(), auth.getPassword()); handler.setMbox(handler.getStore().getDefaultFolder()); handler.setMbox(handler.getMbox().getFolder(Constants.FOLDER_INBOX(profile))); handler.getMbox().open(connectType); // storing the folder in map pop3Folders.put(auth.getUsername(), handler.getMbox()); handler.setTotalMessagesCount(handler.getMbox().getMessageCount()); } } catch (AuthenticationFailedException e) { System.out.println( "Pop3 Mailbox was busy with another session and there is a read write lock. A few minutes later when the lock is released everything will be fine."); } catch (NoSuchProviderException e) { System.out.println(profile.getProtocol() + " provider could not be found."); throw new SystemException(e); } catch (MessagingException e) { System.out.println("Connection could not be established."); throw new ConnectionException(e); } catch (Exception e) { e.printStackTrace(); } return handler; }
/* (non-Javadoc) * @see org.claros.commons.mail.protocols.Protocol#connect(int) */ public ConnectionMetaHandler connect(int connectType) throws SystemException, ConnectionException, ServerDownException { Folder fold = null; try { if (handler == null || handler.getStore() == null || !handler.getStore().isConnected()) { Properties props = new Properties(); // props.setProperty("mail.imap.separatestoreconnection", "true"); // props.setProperty("mail.imap.connectionpoolsize", "0"); // props.setProperty("mail.imap.connectionpooltimeout", "100"); // props.setProperty("mail.debug", "true"); Session session = Session.getDefaultInstance(props); log.debug("session instance initiated"); handler = new ConnectionMetaHandler(); handler.setStore(session.getStore(profile.getProtocol())); log.debug("session store set. protocol is: " + profile.getProtocol()); handler .getStore() .connect( profile.getFetchServer(), profile.getIFetchPort(), auth.getUsername(), auth.getPassword()); if (handler.getStore().isConnected()) { log.debug("Store has been connected... Successful"); } else { log.warn("Connection unsuccessfull...!!"); } } fold = handler.getStore().getFolder(Constants.FOLDER_INBOX(profile)); HashMap imapUserFolders = (HashMap) imapFolders.get(auth.getUsername()); imapUserFolders.put("INBOX", fold); imapFolders.put(auth.getUsername(), imapUserFolders); handler.setMbox(fold); log.debug("Got mailbox folder. Folder is: " + fold.getFullName()); handler.setTotalMessagesCount(fold.getMessageCount()); log.debug("Message Count:" + handler.getTotalMessagesCount()); } catch (FolderNotFoundException e) { log.fatal( profile.getProtocol() + " cannot identify the INBOX folder. Please check your folder-namespace variable at config.xml."); throw new SystemException(e); } catch (NoSuchProviderException e) { log.fatal(profile.getProtocol() + " provider could not be found."); throw new SystemException(e); } catch (MessagingException e) { Exception ne = e.getNextException(); if (ne != null) { if (ne instanceof ConnectException || ne instanceof IOException) { throw new ServerDownException("Server is unreachable."); } } log.error("Connection could not be established." + e.getMessage()); // throw new ConnectionException(e); } catch (Exception e) { log.error("An unknown exception while connect.", e); } return handler; }