Java/Email/Email Server

Материал из Java эксперт
Перейти к: навигация, поиск

Copy a specified number of messages from one folder to another folder

   <source lang="java">

/*

* @(#)copier.java  1.10 06/04/17
*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
* 
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
* 
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* 
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
* SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
* OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* 
* You acknowledge that Software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

/**

*
* @version 1.10, 06/04/17
* @author  Christopher Cotton
*/

import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; /**

* copier will copy a specified number of messages from one folder to another
* folder. it demonstrates how to use the JavaMail APIs to copy messages.
*

* * usage for copier: copier protocol host user * password src folder dest folder start msg # * end msg # * <p> * */ public class MainClass { public static void main(String argv[]) { boolean debug = false;// change to get more errors if (argv.length != 5) { System.out.println("usage: copier <urlname> <src folder>" + "<dest folder> <start msg #> <end msg #>"); return; } try { URLName url = new URLName(argv[0]); String src = argv[1]; // source folder String dest = argv[2]; // dest folder int start = Integer.parseInt(argv[3]); // copy from message # int end = Integer.parseInt(argv[4]); // to message # // Get the default Session object Session session = Session.getInstance(System.getProperties(), null); // session.setDebug(debug); // Get a Store object that implements // the protocol. Store store = session.getStore(url); store.connect(); System.out.println("Connected..."); // Open Source Folder Folder folder = store.getFolder(src); folder.open(Folder.READ_WRITE); System.out.println("Opened source..."); if (folder.getMessageCount() == 0) { System.out.println("Source folder has no messages .."); folder.close(false); store.close(); } // Open destination folder, create if needed Folder dfolder = store.getFolder(dest); if (!dfolder.exists()) // create dfolder.create(Folder.HOLDS_MESSAGES); Message[] msgs = folder.getMessages(start, end); System.out.println("Got messages..."); // Copy messages into destination, folder.copyMessages(msgs, dfolder); System.out.println("Copied messages..."); // Close the folder and store folder.close(false); store.close(); System.out.println("Closed folder and store..."); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } } </source>

Copy folder hierarchies between different Stores

   <source lang="java">

/*

* @(#)populate.java  1.12 06/02/28
*
* Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
* 
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
* 
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* 
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
* SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
* OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* 
* You acknowledge that Software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.internet.MimeMessage; /*

* Copy folder hierarchies between different Stores. This is a useful utility to
* populate new (and possibly empty) mail stores. Specify both the source and
* destination folders as URLs.
* 
* @author John Mani @author Bill Shannon
*/

public class populate {

 static boolean force = false;
 static boolean skipSpecial = false;
 static boolean clear = false;
 static boolean dontPreserveFlags = false;
 public static void main(String argv[]) {
   String srcURL = null;
   String dstURL = null;
   boolean debug = false;
   int optind;
   for (optind = 0; optind < argv.length; optind++) {
     if (argv[optind].equals("-s")) {
       srcURL = argv[++optind];
     } else if (argv[optind].equals("-d")) {
       dstURL = argv[++optind];
     } else if (argv[optind].equals("-D")) {
       debug = true;
     } else if (argv[optind].equals("-f")) {
       force = true;
     } else if (argv[optind].equals("-S")) {
       skipSpecial = true;
     } else if (argv[optind].equals("-c")) {
       clear = true;
     } else if (argv[optind].equals("-P")) {
       dontPreserveFlags = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       printUsage();
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     if (srcURL == null || dstURL == null) {
       printUsage();
       System.exit(1);
     }
     Session session = Session.getInstance(System.getProperties(), null);
     session.setDebug(debug);
     // Get source folder
     URLName srcURLName = new URLName(srcURL);
     Folder srcFolder;
     // Check if the source URL has a folder specified. If
     // not, we use the default folder
     if (srcURLName.getFile() == null) {
       Store s = session.getStore(srcURLName);
       s.connect();
       srcFolder = s.getDefaultFolder();
     } else {
       srcFolder = session.getFolder(new URLName(srcURL));
       if (!srcFolder.exists()) {
         System.out.println("source folder does not exist");
         srcFolder.getStore().close();
         System.exit(1);
       }
     }
     // Set up destination folder
     URLName dstURLName = new URLName(dstURL);
     Folder dstFolder;
     // Check if the destination URL has a folder specified. If
     // not, we use the source folder name
     if (dstURLName.getFile() == null) {
       Store s = session.getStore(dstURLName);
       s.connect();
       dstFolder = s.getFolder(srcFolder.getName());
     } else
       dstFolder = session.getFolder(dstURLName);
     if (clear && dstFolder.exists()) {
       if (!dstFolder.delete(true)) {
         System.out.println("couldn"t delete " + dstFolder.getFullName());
         return;
       }
     }
     copy(srcFolder, dstFolder);
     // Close the respective stores.
     srcFolder.getStore().close();
     dstFolder.getStore().close();
   } catch (MessagingException mex) {
     System.out.println(mex.getMessage());
     mex.printStackTrace();
   }
 }
 private static void copy(Folder src, Folder dst) throws MessagingException {
   System.out.println("Populating " + dst.getFullName());
   Folder ddst = dst;
   Folder[] srcFolders = null;
   if ((src.getType() & Folder.HOLDS_FOLDERS) != 0)
     srcFolders = src.list();
   boolean srcHasChildren = srcFolders != null && srcFolders.length > 0;
   if (!dst.exists()) {
     // Create it.
     boolean dstHoldsOnlyFolders = false;
     try {
       if (!dst.create(src.getType())) {
         System.out.println("couldn"t create " + dst.getFullName());
         return;
       }
     } catch (MessagingException mex) {
       // might not be able to create a folder that holds both
       if (src.getType() != (Folder.HOLDS_MESSAGES | Folder.HOLDS_FOLDERS))
         throw mex;
       if (!dst.create(srcHasChildren ? Folder.HOLDS_FOLDERS : Folder.HOLDS_MESSAGES)) {
         System.out.println("couldn"t create " + dst.getFullName());
         return;
       }
       dstHoldsOnlyFolders = srcHasChildren;
     }
     // Copy over any messges from src to dst
     if ((src.getType() & Folder.HOLDS_MESSAGES) != 0) {
       src.open(Folder.READ_ONLY);
       if (dstHoldsOnlyFolders) {
         if (src.getMessageCount() > 0) {
           System.out.println("Unable to copy messages from " + src.getFullName() + " to "
               + dst.getFullName() + " because destination holds only folders");
         }
       } else
         copyMessages(src, dst);
       src.close(false);
     }
   } else {
     System.out.println(dst.getFullName() + " already exists");
     // Copy over any messges from src to dst
     if (force && (src.getType() & Folder.HOLDS_MESSAGES) != 0) {
       src.open(Folder.READ_ONLY);
       copyMessages(src, dst);
       src.close(false);
     }
   }
   // Copy over subfolders
   if (srcHasChildren) {
     for (int i = 0; i < srcFolders.length; i++) {
       // skip special directories?
       if (skipSpecial) {
         if (srcFolders[i].getName().equals("SCCS") || srcFolders[i].getName().equals("Drafts")
             || srcFolders[i].getName().equals("Trash")
             || srcFolders[i].getName().equals("Shared Folders"))
           continue;
       }
       copy(srcFolders[i], dst.getFolder(srcFolders[i].getName()));
     }
   }
 }
 /**
  * Copy message from src to dst. If dontPreserveFlags is set we first copy the
  * messages to memory, clear all the flags, and then copy to the destination.
  */
 private static void copyMessages(Folder src, Folder dst) throws MessagingException {
   Message[] msgs = src.getMessages();
   if (dontPreserveFlags) {
     for (int i = 0; i < msgs.length; i++) {
       MimeMessage m = new MimeMessage((MimeMessage) msgs[i]);
       m.setFlags(m.getFlags(), false);
       msgs[i] = m;
     }
   }
   src.copyMessages(msgs, dst);
 }
 private static void printUsage() {
   System.out.println("populate [-D] [-f] [-S] [-c] " + "-s source_url -d dest_url");
   System.out.println("URLs are of the form: "
       + "protocol://username:password@hostname/foldername");
   System.out.println("The destination URL does not need a foldername,"
       + " in which case, the source foldername is used");
 }

}


      </source>
   
  
 
  



Get All Message On Server

   <source lang="java">

import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.URLName; public class MainClass {

 public static void main(String[] args) throws Exception {
   URLName server = new URLName("protocol://username:password@host/foldername");
   Session session = Session.getDefaultInstance(new Properties(), null);
   Folder folder = session.getFolder(server);
   if (folder == null) {
     System.out.println("Folder " + server.getFile() + " not found.");
     System.exit(1);
   }
   folder.open(Folder.READ_ONLY);
   // Get the messages from the server
   Message[] messages = folder.getMessages();
   for (int i = 0; i < messages.length; i++) {
     System.out.println("------------ Message " + (i + 1) + " ------------");
     messages[i].writeTo(System.out);
   }
   folder.close(false);
 }

}


      </source>
   
  
 
  



List information about folders

   <source lang="java">

/*

* @(#)folderlist.java  1.30 05/04/10
*
* Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
* 
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
* 
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* 
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
* SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
* OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* 
* You acknowledge that Software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

import java.util.Properties; import javax.mail.Folder; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import com.sun.mail.imap.IMAPFolder; /**

* Demo app that exercises the Message interfaces. List information about
* folders.
* 
* @author John Mani
* @author Bill Shannon
*/

public class MainClass {

 static String protocol = null;
 static String host = null;
 static String user = null;
 static String password = null;
 static String url = null;
 static String root = null;
 static String pattern = "%";
 static boolean recursive = false;
 static boolean verbose = false;
 static boolean debug = false;
 public static void main(String argv[]) throws Exception {
   int optind;
   for (optind = 0; optind < argv.length; optind++) {
     if (argv[optind].equals("-T")) {
       protocol = argv[++optind];
     } else if (argv[optind].equals("-H")) {
       host = argv[++optind];
     } else if (argv[optind].equals("-U")) {
       user = argv[++optind];
     } else if (argv[optind].equals("-P")) {
       password = argv[++optind];
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("-R")) {
       root = argv[++optind];
     } else if (argv[optind].equals("-r")) {
       recursive = true;
     } else if (argv[optind].equals("-v")) {
       verbose = true;
     } else if (argv[optind].equals("-D")) {
       debug = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out
           .println("Usage: folderlist [-T protocol] [-H host] [-U user] [-P password] [-L url]");
       System.out.println("\t[-R root] [-r] [-v] [-D] [pattern]");
       System.exit(1);
     } else {
       break;
     }
   }
   if (optind < argv.length)
     pattern = argv[optind];
   // Get a Properties object
   Properties props = System.getProperties();
   // Get a Session object
   Session session = Session.getInstance(props, null);
   session.setDebug(debug);
   // Get a Store object
   Store store = null;
   Folder rf = null;
   if (url != null) {
     URLName urln = new URLName(url);
     store = session.getStore(urln);
     store.connect();
   } else {
     if (protocol != null)
       store = session.getStore(protocol);
     else
       store = session.getStore();
     // Connect
     if (host != null || user != null || password != null)
       store.connect(host, user, password);
     else
       store.connect();
   }
   // List namespace
   if (root != null)
     rf = store.getFolder(root);
   else
     rf = store.getDefaultFolder();
   dumpFolder(rf, false, "");
   if ((rf.getType() & Folder.HOLDS_FOLDERS) != 0) {
     Folder[] f = rf.list(pattern);
     for (int i = 0; i < f.length; i++)
       dumpFolder(f[i], recursive, "    ");
   }
   store.close();
 }
 static void dumpFolder(Folder folder, boolean recurse, String tab) throws Exception {
   System.out.println(tab + "Name:      " + folder.getName());
   System.out.println(tab + "Full Name: " + folder.getFullName());
   System.out.println(tab + "URL:       " + folder.getURLName());
   if (verbose) {
     if (!folder.isSubscribed())
       System.out.println(tab + "Not Subscribed");
     if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) {
       if (folder.hasNewMessages())
         System.out.println(tab + "Has New Messages");
       System.out.println(tab + "Total Messages:  " + folder.getMessageCount());
       System.out.println(tab + "New Messages:    " + folder.getNewMessageCount());
       System.out.println(tab + "Unread Messages: " + folder.getUnreadMessageCount());
     }
     if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0)
       System.out.println(tab + "Is Directory");
     /*
      * Demonstrate use of IMAP folder attributes returned by the IMAP LIST
      * response.
      */
     if (folder instanceof IMAPFolder) {
       IMAPFolder f = (IMAPFolder) folder;
       String[] attrs = f.getAttributes();
       if (attrs != null && attrs.length > 0) {
         System.out.println(tab + "IMAP Attributes:");
         for (int i = 0; i < attrs.length; i++)
           System.out.println(tab + "    " + attrs[i]);
       }
     }
   }
   System.out.println();
   if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0) {
     if (recurse) {
       Folder[] f = folder.list();
       for (int i = 0; i < f.length; i++)
         dumpFolder(f[i], recurse, tab + "    ");
     }
   }
 }

}

      </source>
   
  
 
  



MOVE messages between mailboxes

   <source lang="java">

/*

* @(#)mover.java 1.9 05/11/17
*
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
* 
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
* 
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* 
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
* SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
* OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* 
* You acknowledge that Software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

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.URLName; /* MOVE messages between mailboxes */ public class MainClass {

 static String protocol = "imap";
 static String host = null;
 static String user = null;
 static String password = null;
 static String src = null;
 static String dest = null;
 static boolean expunge = false;
 static String url = null;
 public static void main(String argv[]) {
   int start = 1;
   int end = -1;
   int optind;
   for (optind = 0; optind < argv.length; optind++) {
     if (argv[optind].equals("-T")) { // protocol
       protocol = argv[++optind];
     } else if (argv[optind].equals("-H")) { // host
       host = argv[++optind];
     } else if (argv[optind].equals("-U")) { // user
       user = argv[++optind];
     } else if (argv[optind].equals("-P")) { // password
       password = argv[++optind];
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("-s")) { // Source mbox
       src = argv[++optind];
     } else if (argv[optind].equals("-d")) { // Destination mbox
       dest = argv[++optind];
     } else if (argv[optind].equals("-x")) { // Expunge ?
       expunge = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out
           .println("Usage: mover [-T protocol] [-H host] [-U user] [-P password] [-L url] [-v]");
       System.out.println("\t[-s source mbox] [-d destination mbox] [-x] [msgnum1] [msgnum2]");
       System.out.println("\t The -x option => EXPUNGE deleted messages");
       System.out.println("\t msgnum1 => start of message-range; msgnum2 => end of message-range");
       System.exit(1);
     } else {
       break;
     }
   }
   if (optind < argv.length)
     start = Integer.parseInt(argv[optind++]); // start msg
   if (optind < argv.length)
     end = Integer.parseInt(argv[optind++]); // end msg
   try {
     // Get a Properties object
     Properties props = System.getProperties();
     // Get a Session object
     Session session = Session.getInstance(props, null);
     // Get a Store object
     Store store = null;
     if (url != null) {
       URLName urln = new URLName(url);
       store = session.getStore(urln);
       store.connect();
     } else {
       if (protocol != null)
         store = session.getStore(protocol);
       else
         store = session.getStore();
       // Connect
       if (host != null || user != null || password != null)
         store.connect(host, user, password);
       else
         store.connect();
     }
     // Open source Folder
     Folder folder = store.getFolder(src);
     if (folder == null || !folder.exists()) {
       System.out.println("Invalid folder: " + folder.getName());
       System.exit(1);
     }
     folder.open(Folder.READ_WRITE);
     int count = folder.getMessageCount();
     if (count == 0) { // No messages in the source folder
       System.out.println(folder.getName() + " is empty");
       // Close folder, store and return
       folder.close(false);
       store.close();
       return;
     }
     // Open destination folder, create if reqd
     Folder dfolder = store.getFolder(dest);
     if (!dfolder.exists())
       dfolder.create(Folder.HOLDS_MESSAGES);
     if (end == -1)
       end = count;
     // Get the message objects to copy
     Message[] msgs = folder.getMessages(start, end);
     System.out.println("Moving " + msgs.length + " messages");
     if (msgs.length != 0) {
       folder.copyMessages(msgs, dfolder);
       folder.setFlags(msgs, new Flags(Flags.Flag.DELETED), true);
       // Dump out the Flags of the moved messages, to insure that
       // all got deleted
       for (int i = 0; i < msgs.length; i++) {
         if (!msgs[i].isSet(Flags.Flag.DELETED))
           System.out.println("Message # " + msgs[i] + " not deleted");
       }
     }
     // Close folders and store
     folder.close(expunge);
     store.close();
   } catch (MessagingException mex) {
     Exception ex = mex;
     do {
       System.out.println(ex.getMessage());
       if (ex instanceof MessagingException)
         ex = ((MessagingException) ex).getNextException();
       else
         ex = null;
     } while (ex != null);
   }
 }

}

      </source>
   
  
 
  



Search the given folder for messages matching the given criteria

   <source lang="java">

/*

* @(#)search.java  1.14 03/04/22
*
* Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
* 
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
* 
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* 
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
* SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
* OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* 
* You acknowledge that Software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

import java.io.InputStream; import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.FetchProfile; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.search.AndTerm; import javax.mail.search.ruparisonTerm; import javax.mail.search.FromStringTerm; import javax.mail.search.OrTerm; import javax.mail.search.ReceivedDateTerm; import javax.mail.search.SearchTerm; import javax.mail.search.SubjectTerm; // import javax.activation.*; /*

* Search the given folder for messages matching the given criteria.
* 
* @author John Mani
*/

public class search {

 static String protocol = "imap";
 static String host = null;
 static String user = null;
 static String password = null;
 static String mbox = "INBOX";
 static String url = null;
 static boolean debug = false;
 public static void main(String argv[]) {
   int optind;
   String subject = null;
   String from = null;
   boolean or = false;
   boolean today = false;
   for (optind = 0; optind < argv.length; optind++) {
     if (argv[optind].equals("-T")) {
       protocol = argv[++optind];
     } else if (argv[optind].equals("-H")) {
       host = argv[++optind];
     } else if (argv[optind].equals("-U")) {
       user = argv[++optind];
     } else if (argv[optind].equals("-P")) {
       password = argv[++optind];
     } else if (argv[optind].equals("-or")) {
       or = true;
     } else if (argv[optind].equals("-D")) {
       debug = true;
     } else if (argv[optind].equals("-f")) {
       mbox = argv[++optind];
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("-subject")) {
       subject = argv[++optind];
     } else if (argv[optind].equals("-from")) {
       from = argv[++optind];
     } else if (argv[optind].equals("-today")) {
       today = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out.println("Usage: search [-D] [-L url] [-T protocol] [-H host] "
           + "[-U user] [-P password] [-f mailbox] "
           + "[-subject subject] [-from from] [-or] [-today]");
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     if ((subject == null) && (from == null) && !today) {
       System.out.println("Specify either -subject, -from or -today");
       System.exit(1);
     }
     // Get a Properties object
     Properties props = System.getProperties();
     // Get a Session object
     Session session = Session.getInstance(props, null);
     session.setDebug(debug);
     // Get a Store object
     Store store = null;
     if (url != null) {
       URLName urln = new URLName(url);
       store = session.getStore(urln);
       store.connect();
     } else {
       if (protocol != null)
         store = session.getStore(protocol);
       else
         store = session.getStore();
       // Connect
       if (host != null || user != null || password != null)
         store.connect(host, user, password);
       else
         store.connect();
     }
     // Open the Folder
     Folder folder = store.getDefaultFolder();
     if (folder == null) {
       System.out.println("Cant find default namespace");
       System.exit(1);
     }
     folder = folder.getFolder(mbox);
     if (folder == null) {
       System.out.println("Invalid folder");
       System.exit(1);
     }
     folder.open(Folder.READ_ONLY);
     SearchTerm term = null;
     if (subject != null)
       term = new SubjectTerm(subject);
     if (from != null) {
       FromStringTerm fromTerm = new FromStringTerm(from);
       if (term != null) {
         if (or)
           term = new OrTerm(term, fromTerm);
         else
           term = new AndTerm(term, fromTerm);
       } else
         term = fromTerm;
     }
     if (today) {
       ReceivedDateTerm dateTerm = new ReceivedDateTerm(ComparisonTerm.EQ, new Date());
       if (term != null) {
         if (or)
           term = new OrTerm(term, dateTerm);
         else
           term = new AndTerm(term, dateTerm);
       } else
         term = dateTerm;
     }
     Message[] msgs = folder.search(term);
     System.out.println("FOUND " + msgs.length + " MESSAGES");
     if (msgs.length == 0) // no match
       System.exit(1);
     // Use a suitable FetchProfile
     FetchProfile fp = new FetchProfile();
     fp.add(FetchProfile.Item.ENVELOPE);
     folder.fetch(msgs, fp);
     for (int i = 0; i < msgs.length; i++) {
       System.out.println("--------------------------");
       System.out.println("MESSAGE #" + (i + 1) + ":");
       dumpPart(msgs[i]);
     }
     folder.close(false);
     store.close();
   } catch (Exception ex) {
     System.out.println("Oops, got exception! " + ex.getMessage());
     ex.printStackTrace();
   }
   System.exit(1);
 }
 public static void dumpPart(Part p) throws Exception {
   if (p instanceof Message) {
     Message m = (Message) p;
     Address[] a;
     // FROM
     if ((a = m.getFrom()) != null) {
       for (int j = 0; j < a.length; j++)
         System.out.println("FROM: " + a[j].toString());
     }
     // TO
     if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
       for (int j = 0; j < a.length; j++)
         System.out.println("TO: " + a[j].toString());
     }
     // SUBJECT
     System.out.println("SUBJECT: " + m.getSubject());
     // DATE
     Date d = m.getSentDate();
     System.out.println("SendDate: " + (d != null ? d.toLocaleString() : "UNKNOWN"));
     // FLAGS:
     Flags flags = m.getFlags();
     StringBuffer sb = new StringBuffer();
     Flags.Flag[] sf = flags.getSystemFlags(); // get the system flags
     boolean first = true;
     for (int i = 0; i < sf.length; i++) {
       String s;
       Flags.Flag f = sf[i];
       if (f == Flags.Flag.ANSWERED)
         s = "\\Answered";
       else if (f == Flags.Flag.DELETED)
         s = "\\Deleted";
       else if (f == Flags.Flag.DRAFT)
         s = "\\Draft";
       else if (f == Flags.Flag.FLAGGED)
         s = "\\Flagged";
       else if (f == Flags.Flag.RECENT)
         s = "\\Recent";
       else if (f == Flags.Flag.SEEN)
         s = "\\Seen";
       else
         continue; // skip it
       if (first)
         first = false;
       else
         sb.append(" ");
       sb.append(s);
     }
     String[] uf = flags.getUserFlags(); // get the user flag strings
     for (int i = 0; i < uf.length; i++) {
       if (first)
         first = false;
       else
         sb.append(" ");
       sb.append(uf[i]);
     }
     System.out.println("FLAGS = " + sb.toString());
   }
   System.out.println("CONTENT-TYPE: " + p.getContentType());
   /*
    * Dump input stream InputStream is = ((MimeMessage)m).getInputStream(); int
    * c; while ((c = is.read()) != -1) System.out.write(c);
    */
   Object o = p.getContent();
   if (o instanceof String) {
     System.out.println("This is a String");
     System.out.println((String) o);
   } else if (o instanceof Multipart) {
     System.out.println("This is a Multipart");
     Multipart mp = (Multipart) o;
     int count = mp.getCount();
     for (int i = 0; i < count; i++)
       dumpPart(mp.getBodyPart(i));
   } else if (o instanceof InputStream) {
     System.out.println("This is just an input stream");
     InputStream is = (InputStream) o;
     int c;
     while ((c = is.read()) != -1)
       System.out.write(c);
   }
 }

}


      </source>
   
  
 
  



Show the namespaces supported by a store

   <source lang="java">

/*

* @(#)namespace.java 1.5 04/02/27
*
* Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
* 
* - Redistribution in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
* 
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* 
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
* SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
* OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* 
* You acknowledge that Software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

import java.util.Properties; import javax.mail.Folder; import javax.mail.FolderNotFoundException; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; /*

* Demo app that exercises the namespace interfaces. Show the namespaces
* supported by a store.
* 
* @author Bill Shannon
*/

public class MainClass {

 static String protocol;
 static String host = null;
 static String user = null;
 static String password = null;
 static String url = null;
 static int port = -1;
 static boolean debug = false;
 static String suser = "other";
 public static void main(String argv[]) {
   int msgnum = -1;
   int optind;
   for (optind = 0; optind < argv.length; optind++) {
     if (argv[optind].equals("-T")) {
       protocol = argv[++optind];
     } else if (argv[optind].equals("-H")) {
       host = argv[++optind];
     } else if (argv[optind].equals("-U")) {
       user = argv[++optind];
     } else if (argv[optind].equals("-P")) {
       password = argv[++optind];
     } else if (argv[optind].equals("-D")) {
       debug = true;
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("-p")) {
       port = Integer.parseInt(argv[++optind]);
     } else if (argv[optind].equals("-u")) {
       suser = argv[++optind];
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out.println("Usage: namespace [-L url] [-T protocol] [-H host] [-p port] [-U user]");
       System.out.println("\t[-P password] [-u other-user] [-D]");
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     // Get a Properties object
     Properties props = System.getProperties();
     // Get a Session object
     Session session = Session.getInstance(props, null);
     session.setDebug(debug);
     // Get a Store object
     Store store = null;
     if (url != null) {
       URLName urln = new URLName(url);
       store = session.getStore(urln);
       store.connect();
     } else {
       if (protocol != null)
         store = session.getStore(protocol);
       else
         store = session.getStore();
       // Connect
       if (host != null || user != null || password != null)
         store.connect(host, port, user, password);
       else
         store.connect();
     }
     printFolders("Personal", store.getPersonalNamespaces());
     printFolders("User \"" + suser + "\"", store.getUserNamespaces(suser));
     printFolders("Shared", store.getSharedNamespaces());
     store.close();
   } catch (Exception ex) {
     System.out.println("Oops, got exception! " + ex.getMessage());
     ex.printStackTrace();
   }
   System.exit(0);
 }
 private static void printFolders(String name, Folder[] folders) throws MessagingException {
   System.out.println(name + " Namespace:");
   if (folders == null || folders.length == 0) {
     System.out.println("  <none>");
     return;
   }
   for (int i = 0; i < folders.length; i++) {
     String fn = folders[i].getFullName();
     if (fn.length() == 0)
       fn = "<default folder>";
     try {
       System.out.println("  " + fn + ", delimiter \"" + folders[i].getSeparator() + "\"");
       Folder[] fl = folders[i].list();
       if (fl.length > 0) {
         System.out.println("  Subfolders:");
         for (int j = 0; j < fl.length; j++)
           System.out.println("    " + fl[j].getFullName());
       }
     } catch (FolderNotFoundException ex) {
     }
   }
 }

}

      </source>