search.java
上传用户:dinglihq
上传日期:2013-02-04
资源大小:99958k
文件大小:8k
源码类别:

Java编程

开发平台:

Java

  1. /*
  2.  * @(#)search.java 1.14 03/04/22
  3.  *
  4.  * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in the
  15.  *   documentation and/or other materials provided with the distribution.
  16.  * 
  17.  * Neither the name of Sun Microsystems, Inc. or the names of contributors
  18.  * may be used to endorse or promote products derived from this software
  19.  * without specific prior written permission.
  20.  * 
  21.  * This software is provided "AS IS," without a warranty of any kind. ALL
  22.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
  23.  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
  24.  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
  25.  * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
  26.  * SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
  27.  * OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
  28.  * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  29.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
  30.  * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
  31.  * ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
  32.  * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  33.  * 
  34.  * You acknowledge that Software is not designed, licensed or intended
  35.  * for use in the design, construction, operation or maintenance of any
  36.  * nuclear facility.
  37.  */
  38. import java.util.*;
  39. import java.io.*;
  40. import javax.mail.*;
  41. import javax.mail.internet.*;
  42. import javax.mail.search.*;
  43. import javax.activation.*;
  44. /*
  45.  * Search the given folder for messages matching the given
  46.  * criteria.
  47.  *
  48.  * @author John Mani
  49.  */
  50. public class search {
  51.     static String protocol = "imap";
  52.     static String host = null;
  53.     static String user = null;
  54.     static String password = null;
  55.     static String mbox = "INBOX";
  56.     static String url = null;
  57.     static boolean debug = false;
  58.     public static void main(String argv[]) {
  59. int optind;
  60. String subject = null;
  61. String from = null;
  62.      boolean or = false;
  63. boolean today = false;
  64. for (optind = 0; optind < argv.length; optind++) {
  65.     if (argv[optind].equals("-T")) {
  66. protocol = argv[++optind];
  67.     } else if (argv[optind].equals("-H")) {
  68. host = argv[++optind];
  69.     } else if (argv[optind].equals("-U")) {
  70. user = argv[++optind];
  71.     } else if (argv[optind].equals("-P")) {
  72. password = argv[++optind];
  73.     } else if (argv[optind].equals("-or")) {
  74. or = true;
  75.     } else if (argv[optind].equals("-D")) {
  76. debug = true;
  77.     } else if (argv[optind].equals("-f")) {
  78. mbox = argv[++optind];
  79.     } else if (argv[optind].equals("-L")) {
  80. url = argv[++optind];
  81.     } else if (argv[optind].equals("-subject")) {
  82. subject = argv[++optind];
  83.     } else if (argv[optind].equals("-from")) {
  84. from = argv[++optind];
  85.     } else if (argv[optind].equals("-today")) {
  86. today = true;
  87.     } else if (argv[optind].equals("--")) {
  88. optind++;
  89. break;
  90.     } else if (argv[optind].startsWith("-")) {
  91. System.out.println(
  92.  "Usage: search [-D] [-L url] [-T protocol] [-H host] " + 
  93.  "[-U user] [-P password] [-f mailbox] " + 
  94.  "[-subject subject] [-from from] [-or] [-today]");
  95. System.exit(1);
  96.     } else {
  97. break;
  98.     }
  99. }
  100.         try {
  101.     if ((subject == null) && (from == null) && !today) {
  102. System.out.println("Specify either -subject, -from or -today");
  103. System.exit(1);
  104.     }
  105.     // Get a Properties object
  106.     Properties props = System.getProperties();
  107.     // Get a Session object
  108.     Session session = Session.getInstance(props, null);
  109.     session.setDebug(debug);
  110.     // Get a Store object
  111.     Store store = null;
  112.     if (url != null) {
  113. URLName urln = new URLName(url);
  114. store = session.getStore(urln);
  115. store.connect();
  116.     } else {
  117. if (protocol != null)
  118.     store = session.getStore(protocol);
  119. else
  120.     store = session.getStore();
  121. // Connect
  122. if (host != null || user != null || password != null)
  123.     store.connect(host, user, password);
  124. else
  125.     store.connect();
  126.     }
  127.     
  128.     // Open the Folder
  129.     Folder folder = store.getDefaultFolder();
  130.     if (folder == null) {
  131.         System.out.println("Cant find default namespace");
  132.         System.exit(1);
  133.     }
  134.     folder = folder.getFolder(mbox);
  135.     if (folder == null) {
  136.         System.out.println("Invalid folder");
  137.         System.exit(1);
  138.     }
  139.     folder.open(Folder.READ_ONLY);
  140.     SearchTerm term = null;
  141.     if (subject != null)
  142. term = new SubjectTerm(subject);
  143.     if (from != null) {
  144. FromStringTerm fromTerm = new FromStringTerm(from);
  145. if (term != null) {
  146.     if (or)
  147. term = new OrTerm(term, fromTerm);
  148.     else
  149. term = new AndTerm(term, fromTerm);
  150. }
  151. else
  152.     term = fromTerm;
  153.     }
  154.     if (today) {
  155. ReceivedDateTerm dateTerm = 
  156.  new ReceivedDateTerm(ComparisonTerm.EQ, new Date());
  157. if (term != null) {
  158.     if (or)
  159. term = new OrTerm(term, dateTerm);
  160.     else
  161. term = new AndTerm(term, dateTerm);
  162. }
  163. else
  164.     term = dateTerm;
  165.     }
  166.     Message[] msgs = folder.search(term);
  167.     System.out.println("FOUND " + msgs.length + " MESSAGES");
  168.     if (msgs.length == 0) // no match
  169. System.exit(1);
  170.     // Use a suitable FetchProfile
  171.     FetchProfile fp = new FetchProfile();
  172.     fp.add(FetchProfile.Item.ENVELOPE);
  173.     folder.fetch(msgs, fp);
  174.     for (int i = 0; i < msgs.length; i++) {
  175. System.out.println("--------------------------");
  176. System.out.println("MESSAGE #" + (i + 1) + ":");
  177. dumpPart(msgs[i]);
  178.     }
  179.     folder.close(false);
  180.     store.close();
  181. } catch (Exception ex) {
  182.     System.out.println("Oops, got exception! " + ex.getMessage());
  183.     ex.printStackTrace();
  184. }
  185. System.exit(1);
  186.     }
  187.     public static void dumpPart(Part p) throws Exception {
  188. if (p instanceof Message) {
  189.     Message m = (Message)p;
  190.     Address[] a;
  191.     // FROM 
  192.     if ((a = m.getFrom()) != null) {
  193. for (int j = 0; j < a.length; j++)
  194.     System.out.println("FROM: " + a[j].toString());
  195.     }
  196.     // TO
  197.     if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
  198. for (int j = 0; j < a.length; j++)
  199.     System.out.println("TO: " + a[j].toString());
  200.     }
  201.     // SUBJECT
  202.     System.out.println("SUBJECT: " + m.getSubject());
  203.     // DATE
  204.     Date d = m.getSentDate();
  205.     System.out.println("SendDate: " +
  206. (d != null ? d.toLocaleString() : "UNKNOWN"));
  207.     // FLAGS:
  208.     Flags flags = m.getFlags();
  209.     StringBuffer sb = new StringBuffer();
  210.     Flags.Flag[] sf = flags.getSystemFlags(); // get the system flags
  211.     boolean first = true;
  212.     for (int i = 0; i < sf.length; i++) {
  213. String s;
  214. Flags.Flag f = sf[i];
  215. if (f == Flags.Flag.ANSWERED)
  216.     s = "\Answered";
  217. else if (f == Flags.Flag.DELETED)
  218.     s = "\Deleted";
  219. else if (f == Flags.Flag.DRAFT)
  220.     s = "\Draft";
  221. else if (f == Flags.Flag.FLAGGED)
  222.     s = "\Flagged";
  223. else if (f == Flags.Flag.RECENT)
  224.     s = "\Recent";
  225. else if (f == Flags.Flag.SEEN)
  226.     s = "\Seen";
  227. else
  228.     continue; // skip it
  229. if (first)
  230.     first = false;
  231. else
  232.     sb.append(' ');
  233. sb.append(s);
  234.     }
  235.     String[] uf = flags.getUserFlags(); // get the user flag strings
  236.     for (int i = 0; i < uf.length; i++) {
  237. if (first)
  238.     first = false;
  239. else
  240.     sb.append(' ');
  241. sb.append(uf[i]);
  242.     }
  243.     System.out.println("FLAGS = " + sb.toString());
  244. }
  245. System.out.println("CONTENT-TYPE: " + p.getContentType());
  246. /* Dump input stream
  247. InputStream is = ((MimeMessage)m).getInputStream();
  248. int c;
  249. while ((c = is.read()) != -1)
  250.     System.out.write(c);
  251. */
  252. Object o = p.getContent();
  253. if (o instanceof String) {
  254.     System.out.println("This is a String");
  255.     System.out.println((String)o);
  256. } else if (o instanceof Multipart) {
  257.     System.out.println("This is a Multipart");
  258.     Multipart mp = (Multipart)o;
  259.     int count = mp.getCount();
  260.     for (int i = 0; i < count; i++)
  261. dumpPart(mp.getBodyPart(i));
  262. } else if (o instanceof InputStream) {
  263.     System.out.println("This is just an input stream");
  264.     InputStream is = (InputStream)o;
  265.     int c;
  266.     while ((c = is.read()) != -1)
  267. System.out.write(c);
  268. }
  269.     }
  270. }