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

Java编程

开发平台:

Java

  1. /*
  2.  * @(#)msgshow.java 1.30 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.event.*;
  42. import javax.mail.internet.*;
  43. import javax.activation.*;
  44. /*
  45.  * Demo app that exercises the Message interfaces.
  46.  * Show information about and contents of messages.
  47.  *
  48.  * @author John Mani
  49.  * @author Bill Shannon
  50.  */
  51. public class msgshow {
  52.     static String protocol;
  53.     static String host = null;
  54.     static String user = null;
  55.     static String password = null;
  56.     static String mbox = "INBOX";
  57.     static String url = null;
  58.     static int port = -1;
  59.     static boolean verbose = false;
  60.     static boolean debug = false;
  61.     static boolean showStructure = false;
  62.     static boolean showMessage = false;
  63.     static boolean showAlert = false;
  64.     static boolean saveAttachments = false;
  65.     static int attnum = 1;
  66.     public static void main(String argv[]) {
  67. int msgnum = -1;
  68. int optind;
  69. InputStream msgStream = System.in;
  70. for (optind = 0; optind < argv.length; optind++) {
  71.     if (argv[optind].equals("-T")) {
  72. protocol = argv[++optind];
  73.     } else if (argv[optind].equals("-H")) {
  74. host = argv[++optind];
  75.     } else if (argv[optind].equals("-U")) {
  76. user = argv[++optind];
  77.     } else if (argv[optind].equals("-P")) {
  78. password = argv[++optind];
  79.     } else if (argv[optind].equals("-v")) {
  80. verbose = true;
  81.     } else if (argv[optind].equals("-D")) {
  82. debug = true;
  83.     } else if (argv[optind].equals("-f")) {
  84. mbox = argv[++optind];
  85.     } else if (argv[optind].equals("-L")) {
  86. url = argv[++optind];
  87.     } else if (argv[optind].equals("-p")) {
  88. port = Integer.parseInt(argv[++optind]);
  89.     } else if (argv[optind].equals("-s")) {
  90. showStructure = true;
  91.     } else if (argv[optind].equals("-S")) {
  92. saveAttachments = true;
  93.     } else if (argv[optind].equals("-m")) {
  94. showMessage = true;
  95.     } else if (argv[optind].equals("-a")) {
  96. showAlert = true;
  97.     } else if (argv[optind].equals("--")) {
  98. optind++;
  99. break;
  100.     } else if (argv[optind].startsWith("-")) {
  101. System.out.println(
  102. "Usage: msgshow [-L url] [-T protocol] [-H host] [-p port] [-U user]");
  103. System.out.println(
  104. "t[-P password] [-f mailbox] [msgnum] [-v] [-D] [-s] [-S] [-a]");
  105. System.out.println(
  106. "or     msgshow -m [-v] [-D] [-s] [-S] < msg");
  107. System.exit(1);
  108.     } else {
  109. break;
  110.     }
  111. }
  112.         try {
  113.     if (optind < argv.length)
  114.          msgnum = Integer.parseInt(argv[optind]);
  115.     // Get a Properties object
  116.     Properties props = System.getProperties();
  117.     // Get a Session object
  118.     Session session = Session.getInstance(props, null);
  119.     session.setDebug(debug);
  120.     if (showMessage) {
  121. MimeMessage msg = new MimeMessage(session, msgStream);
  122. dumpPart(msg);
  123. System.exit(0);
  124.     }
  125.     // Get a Store object
  126.     Store store = null;
  127.     if (url != null) {
  128. URLName urln = new URLName(url);
  129. store = session.getStore(urln);
  130. if (showAlert) {
  131.     store.addStoreListener(new StoreListener() {
  132. public void notification(StoreEvent e) {
  133.     String s;
  134.     if (e.getMessageType() == StoreEvent.ALERT)
  135. s = "ALERT: ";
  136.     else
  137. s = "NOTICE: ";
  138.     System.out.println(s + e.getMessage());
  139. }
  140.     });
  141. }
  142. store.connect();
  143.     } else {
  144. if (protocol != null)
  145.     store = session.getStore(protocol);
  146. else
  147.     store = session.getStore();
  148. // Connect
  149. if (host != null || user != null || password != null)
  150.     store.connect(host, port, user, password);
  151. else
  152.     store.connect();
  153.     }
  154.     
  155.     // Open the Folder
  156.     Folder folder = store.getDefaultFolder();
  157.     if (folder == null) {
  158.         System.out.println("No default folder");
  159.         System.exit(1);
  160.     }
  161.     folder = folder.getFolder(mbox);
  162.     if (folder == null) {
  163.         System.out.println("Invalid folder");
  164.         System.exit(1);
  165.     }
  166.     // try to open read/write and if that fails try read-only
  167.     try {
  168. folder.open(Folder.READ_WRITE);
  169.     } catch (MessagingException ex) {
  170. folder.open(Folder.READ_ONLY);
  171.     }
  172.     int totalMessages = folder.getMessageCount();
  173.     if (totalMessages == 0) {
  174. System.out.println("Empty folder");
  175. folder.close(false);
  176. store.close();
  177. System.exit(1);
  178.     }
  179.     if (verbose) {
  180. int newMessages = folder.getNewMessageCount();
  181. System.out.println("Total messages = " + totalMessages);
  182. System.out.println("New messages = " + newMessages);
  183. System.out.println("-------------------------------");
  184.     }
  185.     if (msgnum == -1) {
  186. // Attributes & Flags for all messages ..
  187. Message[] msgs = folder.getMessages();
  188. // Use a suitable FetchProfile
  189. FetchProfile fp = new FetchProfile();
  190. fp.add(FetchProfile.Item.ENVELOPE);
  191. fp.add(FetchProfile.Item.FLAGS);
  192. fp.add("X-Mailer");
  193. folder.fetch(msgs, fp);
  194. for (int i = 0; i < msgs.length; i++) {
  195.     System.out.println("--------------------------");
  196.     System.out.println("MESSAGE #" + (i + 1) + ":");
  197.     dumpEnvelope(msgs[i]);
  198.     // dumpPart(msgs[i]);
  199. }
  200.     } else {
  201. System.out.println("Getting message number: " + msgnum);
  202. Message m = null;
  203. try {
  204.     m = folder.getMessage(msgnum);
  205.     dumpPart(m);
  206. } catch (IndexOutOfBoundsException iex) {
  207.     System.out.println("Message number out of range");
  208. }
  209.     }
  210.     folder.close(false);
  211.     store.close();
  212. } catch (Exception ex) {
  213.     System.out.println("Oops, got exception! " + ex.getMessage());
  214.     ex.printStackTrace();
  215.     System.exit(1);
  216. }
  217. System.exit(0);
  218.     }
  219.     public static void dumpPart(Part p) throws Exception {
  220. if (p instanceof Message)
  221.     dumpEnvelope((Message)p);
  222. /** Dump input stream .. 
  223. InputStream is = p.getInputStream();
  224. // If "is" is not already buffered, wrap a BufferedInputStream
  225. // around it.
  226. if (!(is instanceof BufferedInputStream))
  227.     is = new BufferedInputStream(is);
  228. int c;
  229. while ((c = is.read()) != -1)
  230.     System.out.write(c);
  231. **/
  232. String ct = p.getContentType();
  233. try {
  234.     pr("CONTENT-TYPE: " + (new ContentType(ct)).toString());
  235. } catch (ParseException pex) {
  236.     pr("BAD CONTENT-TYPE: " + ct);
  237. }
  238. String filename = p.getFileName();
  239. if (filename != null)
  240.     pr("FILENAME: " + filename);
  241. /*
  242.  * Using isMimeType to determine the content type avoids
  243.  * fetching the actual content data until we need it.
  244.  */
  245. if (p.isMimeType("text/plain")) {
  246.     pr("This is plain text");
  247.     pr("---------------------------");
  248.     if (!showStructure && !saveAttachments)
  249. System.out.println((String)p.getContent());
  250. } else if (p.isMimeType("multipart/*")) {
  251.     pr("This is a Multipart");
  252.     pr("---------------------------");
  253.     Multipart mp = (Multipart)p.getContent();
  254.     level++;
  255.     int count = mp.getCount();
  256.     for (int i = 0; i < count; i++)
  257. dumpPart(mp.getBodyPart(i));
  258.     level--;
  259. } else if (p.isMimeType("message/rfc822")) {
  260.     pr("This is a Nested Message");
  261.     pr("---------------------------");
  262.     level++;
  263.     dumpPart((Part)p.getContent());
  264.     level--;
  265. } else {
  266.     if (!showStructure && !saveAttachments) {
  267. /*
  268.  * If we actually want to see the data, and it's not a
  269.  * MIME type we know, fetch it and check its Java type.
  270.  */
  271. Object o = p.getContent();
  272. if (o instanceof String) {
  273.     pr("This is a string");
  274.     pr("---------------------------");
  275.     System.out.println((String)o);
  276. } else if (o instanceof InputStream) {
  277.     pr("This is just an input stream");
  278.     pr("---------------------------");
  279.     InputStream is = (InputStream)o;
  280.     int c;
  281.     while ((c = is.read()) != -1)
  282. System.out.write(c);
  283. } else {
  284.     pr("This is an unknown type");
  285.     pr("---------------------------");
  286.     pr(o.toString());
  287. }
  288.     } else {
  289. // just a separator
  290. pr("---------------------------");
  291.     }
  292. }
  293. /*
  294.  * If we're saving attachments, write out anything that
  295.  * looks like an attachment into an appropriately named
  296.  * file.  Don't overwrite existing files to prevent
  297.  * mistakes.
  298.  */
  299. if (saveAttachments && level != 0 && !p.isMimeType("multipart/*")) {
  300.     String disp = p.getDisposition();
  301.     // many mailers don't include a Content-Disposition
  302.     if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)) {
  303. if (filename == null)
  304.     filename = "Attachment" + attnum++;
  305. pr("Saving attachment to file " + filename);
  306. try {
  307.     File f = new File(filename);
  308.     if (f.exists())
  309. // XXX - could try a series of names
  310. throw new IOException("file exists");
  311.     OutputStream os =
  312. new BufferedOutputStream(new FileOutputStream(f));
  313.     InputStream is = p.getInputStream();
  314.     int c;
  315.     while ((c = is.read()) != -1)
  316. os.write(c);
  317.     os.close();
  318. } catch (IOException ex) {
  319.     pr("Failed to save attachment: " + ex);
  320. }
  321. pr("---------------------------");
  322.     }
  323. }
  324.     }
  325.     public static void dumpEnvelope(Message m) throws Exception {
  326. pr("This is the message envelope");
  327. pr("---------------------------");
  328. Address[] a;
  329. // FROM 
  330. if ((a = m.getFrom()) != null) {
  331.     for (int j = 0; j < a.length; j++)
  332. pr("FROM: " + a[j].toString());
  333. }
  334. // TO
  335. if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
  336.     for (int j = 0; j < a.length; j++)
  337. pr("TO: " + a[j].toString());
  338. }
  339. // SUBJECT
  340. pr("SUBJECT: " + m.getSubject());
  341. // DATE
  342. Date d = m.getSentDate();
  343. pr("SendDate: " +
  344.     (d != null ? d.toString() : "UNKNOWN"));
  345. // FLAGS
  346. Flags flags = m.getFlags();
  347. StringBuffer sb = new StringBuffer();
  348. Flags.Flag[] sf = flags.getSystemFlags(); // get the system flags
  349. boolean first = true;
  350. for (int i = 0; i < sf.length; i++) {
  351.     String s;
  352.     Flags.Flag f = sf[i];
  353.     if (f == Flags.Flag.ANSWERED)
  354. s = "\Answered";
  355.     else if (f == Flags.Flag.DELETED)
  356. s = "\Deleted";
  357.     else if (f == Flags.Flag.DRAFT)
  358. s = "\Draft";
  359.     else if (f == Flags.Flag.FLAGGED)
  360. s = "\Flagged";
  361.     else if (f == Flags.Flag.RECENT)
  362. s = "\Recent";
  363.     else if (f == Flags.Flag.SEEN)
  364. s = "\Seen";
  365.     else
  366. continue; // skip it
  367.     if (first)
  368. first = false;
  369.     else
  370. sb.append(' ');
  371.     sb.append(s);
  372. }
  373. String[] uf = flags.getUserFlags(); // get the user flag strings
  374. for (int i = 0; i < uf.length; i++) {
  375.     if (first)
  376. first = false;
  377.     else
  378. sb.append(' ');
  379.     sb.append(uf[i]);
  380. }
  381. pr("FLAGS: " + sb.toString());
  382. // X-MAILER
  383. String[] hdrs = m.getHeader("X-Mailer");
  384. if (hdrs != null)
  385.     pr("X-Mailer: " + hdrs[0]);
  386. else
  387.     pr("X-Mailer NOT available");
  388.     }
  389.     static String indentStr = "                                               ";
  390.     static int level = 0;
  391.     /**
  392.      * Print a, possibly indented, string.
  393.      */
  394.     public static void pr(String s) {
  395. if (showStructure)
  396.     System.out.print(indentStr.substring(0, level * 2));
  397. System.out.println(s);
  398.     }
  399. }