Java/Email/Email Message

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

Access message given its UID and Show information about and contents of messages

   <source lang="java">


/*

* @(#)uidmsgshow.java  1.6 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.UIDFolder; import javax.mail.URLName; /*

* Demo app that exercises the Message interfaces. Access message given its UID.
* Show information about and contents of messages.
* 
* @author John Mani @author Bill Shannon
*/

public class uidmsgshow {

 static String protocol;
 static String host = null;
 static String user = null;
 static String password = null;
 static String mbox = "INBOX";
 static String url = null;
 static boolean verbose = false;
 public static void main(String argv[]) {
   long uid = -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("-v")) {
       verbose = true;
     } else if (argv[optind].equals("-f")) {
       mbox = argv[++optind];
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out
           .println("Usage: uidmsgshow [-L url] [-T protocol] [-H host] [-U user] [-P password] [-f mailbox] [uid] [-v]");
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     if (optind < argv.length)
       uid = Long.parseLong(argv[optind]);
     // Get a Properties object
     Properties props = System.getProperties();
     // Get a Session object
     Session session = Session.getInstance(props, null);
     // session.setDebug(true);
     // 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("No default folder");
       System.exit(1);
     }
     folder = folder.getFolder(mbox);
     if (!folder.exists()) {
       System.out.println(mbox + "  does not exist");
       System.exit(1);
     }
     if (!(folder instanceof UIDFolder)) {
       System.out.println("This Provider or this folder does not support UIDs");
       System.exit(1);
     }
     UIDFolder ufolder = (UIDFolder) folder;
     folder.open(Folder.READ_WRITE);
     int totalMessages = folder.getMessageCount();
     if (totalMessages == 0) {
       System.out.println("Empty folder");
       folder.close(false);
       store.close();
       System.exit(1);
     }
     if (verbose) {
       int newMessages = folder.getNewMessageCount();
       System.out.println("Total messages = " + totalMessages);
       System.out.println("New messages = " + newMessages);
       System.out.println("-------------------------------");
     }
     if (uid == -1) {
       // Attributes & Flags for ALL messages ..
       Message[] msgs = ufolder.getMessagesByUID(1, UIDFolder.LASTUID);
       // Use a suitable FetchProfile
       FetchProfile fp = new FetchProfile();
       fp.add(FetchProfile.Item.ENVELOPE);
       fp.add(FetchProfile.Item.FLAGS);
       fp.add("X-Mailer");
       folder.fetch(msgs, fp);
       for (int i = 0; i < msgs.length; i++) {
         System.out.println("--------------------------");
         System.out.println("MESSAGE UID #" + ufolder.getUID(msgs[i]) + ":");
         dumpEnvelope(msgs[i]);
         // dumpPart(msgs[i]);
       }
     } else {
       System.out.println("Getting message UID: " + uid);
       Message m = ufolder.getMessageByUID(uid);
       if (m != null)
         dumpPart(m);
       else
         System.out.println("This Message does not exist on this folder");
     }
     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)
     dumpEnvelope((Message) p);
   /*
    * Dump input stream InputStream is = new
    * BufferedInputStream(p.getInputStream()); int c; while ((c = is.read()) !=
    * -1) System.out.write(c);
    */
   System.out.println("CONTENT-TYPE: " + p.getContentType());
   Object o = p.getContent();
   if (o instanceof String) {
     System.out.println("This is a String");
     System.out.println("---------------------------");
     System.out.println((String) o);
   } else if (o instanceof Multipart) {
     System.out.println("This is a Multipart");
     System.out.println("---------------------------");
     Multipart mp = (Multipart) o;
     int count = mp.getCount();
     for (int i = 0; i < count; i++)
       dumpPart(mp.getBodyPart(i));
   } else if (o instanceof Message) {
     System.out.println("This is a Nested Message");
     System.out.println("---------------------------");
     dumpPart((Part) o);
   } else if (o instanceof InputStream) {
     System.out.println("This is just an input stream");
     System.out.println("---------------------------");
     InputStream is = (InputStream) o;
     int c;
     while ((c = is.read()) != -1)
       System.out.write(c);
   }
 }
 public static void dumpEnvelope(Message m) throws Exception {
   System.out.println("This is the message envelope");
   System.out.println("---------------------------");
   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.toString() : "UNKNOWN"));
   // SIZE
   System.out.println("Size: " + m.getSize());
   // 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());
   // X-MAILER
   String[] hdrs = m.getHeader("X-Mailer");
   if (hdrs != null)
     System.out.println("X-Mailer: " + hdrs[0]);
   else
     System.out.println("X-Mailer NOT available");
 }

}


 </source>
   
  
 
  



Create a simple multipart/mixed message and sends it

   <source lang="java">

/*

* @(#)msgmultisendsample.java  1.14 03/04/22
*
* 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.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; // import javax.activation.*; /**

* msgmultisendsample creates a simple multipart/mixed message and sends it.
* Both body parts are text/plain.
*

* usage: java msgmultisendsample to from smtp true|false * where to and from are the destination and origin email * addresses, respectively, and smtp is the hostname of the machine that * has smtp server running. The last parameter either turns on or turns off * debugging during sending. * * @author Max Spivak */ public class MainClass { static String msgText1 = "This is a message body.\nHere"s line two."; static String msgText2 = "This is the text in the message attachment."; public static void main(String[] args) { if (args.length != 4) { System.out.println("usage: java msgmultisend <to> <from> <smtp> true|false"); return; } String to = args[0]; String from = args[1]; String host = args[2]; boolean debug = Boolean.valueOf(args[3]).booleanValue(); // create some properties and get the default Session Properties props = new Properties(); props.put("mail.smtp.host", host); Session session = Session.getInstance(props, null); session.setDebug(debug); try { // create a message MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = { new InternetAddress(to) }; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject("JavaMail APIs Multipart Test"); msg.setSentDate(new Date()); // create and fill the first message part MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText(msgText1); // create and fill the second message part MimeBodyPart mbp2 = new MimeBodyPart(); // Use setText(text, charset), to show it off ! mbp2.setText(msgText2, "us-ascii"); // create the Multipart and its parts to it Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); // add the Multipart to the message msg.setContent(mp); // send the message Transport.send(msg); } catch (MessagingException mex) { mex.printStackTrace(); Exception ex = null; if ((ex = mex.getNextException()) != null) { ex.printStackTrace(); } } } } </source>

Create a very simple text/plain message and sends it

   <source lang="java">

/*

* @(#)msgsendsample.java 1.19 03/04/22
*
* 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.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.SendFailedException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; // import javax.activation.*; /**

* msgsendsample creates a very simple text/plain message and sends it.
* <p>
* usage: java msgsendsample to from smtphost true|false
* where to and from are the destination and origin email
* addresses, respectively, and smtphost is the hostname of the machine
* that has the smtp server running. The last parameter either turns on or turns
* off debugging during sending.
* 
* @author Max Spivak
*/

public class MainClass {

 static String msgText = "This is a message body.\nHere"s the second line.";
 public static void main(String[] args) {
   if (args.length != 4) {
     usage();
     System.exit(1);
   }
   System.out.println();
   String to = args[0];
   String from = args[1];
   String host = args[2];
   boolean debug = Boolean.valueOf(args[3]).booleanValue();
   // create some properties and get the default Session
   Properties props = new Properties();
   props.put("mail.smtp.host", host);
   if (debug)
     props.put("mail.debug", args[3]);
   Session session = Session.getInstance(props, null);
   session.setDebug(debug);
   try {
     // create a message
     Message msg = new MimeMessage(session);
     msg.setFrom(new InternetAddress(from));
     InternetAddress[] address = { new InternetAddress(args[0]) };
     msg.setRecipients(Message.RecipientType.TO, address);
     msg.setSubject("JavaMail APIs Test");
     msg.setSentDate(new Date());
     // If the desired charset is known, you can use
     // setText(text, charset)
     msg.setText(msgText);
     Transport.send(msg);
   } catch (MessagingException mex) {
     System.out.println("\n--Exception handling in msgsendsample.java");
     mex.printStackTrace();
     System.out.println();
     Exception ex = mex;
     do {
       if (ex instanceof SendFailedException) {
         SendFailedException sfex = (SendFailedException) ex;
         Address[] invalid = sfex.getInvalidAddresses();
         if (invalid != null) {
           System.out.println("    ** Invalid Addresses");
           if (invalid != null) {
             for (int i = 0; i < invalid.length; i++)
               System.out.println("         " + invalid[i]);
           }
         }
         Address[] validUnsent = sfex.getValidUnsentAddresses();
         if (validUnsent != null) {
           System.out.println("    ** ValidUnsent Addresses");
           if (validUnsent != null) {
             for (int i = 0; i < validUnsent.length; i++)
               System.out.println("         " + validUnsent[i]);
           }
         }
         Address[] validSent = sfex.getValidSentAddresses();
         if (validSent != null) {
           System.out.println("    ** ValidSent Addresses");
           if (validSent != null) {
             for (int i = 0; i < validSent.length; i++)
               System.out.println("         " + validSent[i]);
           }
         }
       }
       System.out.println();
       if (ex instanceof MessagingException)
         ex = ((MessagingException) ex).getNextException();
       else
         ex = null;
     } while (ex != null);
   }
 }
 private static void usage() {
   System.out.println("usage: java msgsendsample <to> <from> <smtp> true|false");
 }

}


 </source>
   
  
 
  



Creates a message, retrieves a Transport from the session based on the type of the address and sends the message

   <source lang="java">

/*

* @(#)transport.java 1.13 06/04/17
*
* 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 java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.SendFailedException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.event.ConnectionEvent; import javax.mail.event.ConnectionListener; import javax.mail.event.TransportEvent; import javax.mail.event.TransportListener; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; // import javax.activation.*; /**

* transport is a simple program that creates a message, explicitly retrieves a
* Transport from the session based on the type of the address (it"s
* InternetAddress, so SMTP will be used) and sends the message.
* 
* usage: java transport "toaddr1[, toaddr2]*"  from smtphost 
* true|false
* where to and from are the destination and origin email * addresses, respectively, and smtphost is the hostname of the machine * that has the smtp server running. The to addresses can be either a * single email address or a comma-separated list of email addresses in quotes, * i.e. "joe@machine, jane, max@server.ru" The last parameter either turns on * or turns off debugging during sending. * * @author Max Spivak */

public class transport implements ConnectionListener, TransportListener {

 static String msgText = "This is a message body.\nHere"s the second line.";
 static String msgText2 = "\nThis was sent by transport.java demo program.";
 public static void main(String[] args) {
   Properties props = new Properties();
   // parse the arguments
   InternetAddress[] addrs = null;
   InternetAddress from;
   boolean debug = false;
   if (args.length != 4) {
     usage();
     return;
   } else {
     props.put("mail.smtp.host", args[2]);
     if (args[3].equals("true")) {
       debug = true;
     } else if (args[3].equals("false")) {
       debug = false;
     } else {
       usage();
       return;
     }
     // parse the destination addresses
     try {
       addrs = InternetAddress.parse(args[0], false);
       from = new InternetAddress(args[1]);
     } catch (AddressException aex) {
       System.out.println("Invalid Address");
       aex.printStackTrace();
       return;
     }
   }
   // create some properties and get a Session
   Session session = Session.getInstance(props, null);
   session.setDebug(debug);
   transport t = new transport();
   t.go(session, addrs, from);
 }
 public transport() {
 }
 public void go(Session session, InternetAddress[] toAddr, InternetAddress from) {
   Transport trans = null;
   try {
     // create a message
     Message msg = new MimeMessage(session);
     msg.setFrom(from);
     msg.setRecipients(Message.RecipientType.TO, toAddr);
     msg.setSubject("JavaMail APIs transport.java Test");
     msg.setSentDate(new Date()); // Date: header
     msg.setContent(msgText + msgText2, "text/plain");
     msg.saveChanges();
     // get the smtp transport for the address
     trans = session.getTransport(toAddr[0]);
     // register ourselves as listener for ConnectionEvents
     // and TransportEvents
     trans.addConnectionListener(this);
     trans.addTransportListener(this);
     // connect the transport
     trans.connect();
     // send the message
     trans.sendMessage(msg, toAddr);
     // give the EventQueue enough time to fire its events
     try {
       Thread.sleep(5);
     } catch (InterruptedException e) {
     }
   } catch (MessagingException mex) {
     // give the EventQueue enough time to fire its events
     try {
       Thread.sleep(5);
     } catch (InterruptedException e) {
     }
     mex.printStackTrace();
     System.out.println();
     Exception ex = mex;
     do {
       if (ex instanceof SendFailedException) {
         SendFailedException sfex = (SendFailedException) ex;
         Address[] invalid = sfex.getInvalidAddresses();
         if (invalid != null) {
           System.out.println("    ** Invalid Addresses");
           if (invalid != null) {
             for (int i = 0; i < invalid.length; i++)
               System.out.println("         " + invalid[i]);
           }
         }
         Address[] validUnsent = sfex.getValidUnsentAddresses();
         if (validUnsent != null) {
           System.out.println("    ** ValidUnsent Addresses");
           if (validUnsent != null) {
             for (int i = 0; i < validUnsent.length; i++)
               System.out.println("         " + validUnsent[i]);
           }
         }
         Address[] validSent = sfex.getValidSentAddresses();
         if (validSent != null) {
           System.out.println("    ** ValidSent Addresses");
           if (validSent != null) {
             for (int i = 0; i < validSent.length; i++)
               System.out.println("         " + validSent[i]);
           }
         }
       }
       System.out.println();
       if (ex instanceof MessagingException)
         ex = ((MessagingException) ex).getNextException();
       else
         ex = null;
     } while (ex != null);
   } finally {
     try {
       // close the transport
       trans.close();
     } catch (MessagingException mex) { /* ignore */
     }
   }
 }
 // implement ConnectionListener interface
 public void opened(ConnectionEvent e) {
   System.out.println(">>> ConnectionListener.opened()");
 }
 public void disconnected(ConnectionEvent e) {
 }
 public void closed(ConnectionEvent e) {
   System.out.println(">>> ConnectionListener.closed()");
 }
 // implement TransportListener interface
 public void messageDelivered(TransportEvent e) {
   System.out.print(">>> TransportListener.messageDelivered().");
   System.out.println(" Valid Addresses:");
   Address[] valid = e.getValidSentAddresses();
   if (valid != null) {
     for (int i = 0; i < valid.length; i++)
       System.out.println("    " + valid[i]);
   }
 }
 public void messageNotDelivered(TransportEvent e) {
   System.out.print(">>> TransportListener.messageNotDelivered().");
   System.out.println(" Invalid Addresses:");
   Address[] invalid = e.getInvalidAddresses();
   if (invalid != null) {
     for (int i = 0; i < invalid.length; i++)
       System.out.println("    " + invalid[i]);
   }
 }
 public void messagePartiallyDelivered(TransportEvent e) {
   // SMTPTransport doesn"t partially deliver msgs
 }
 private static void usage() {
   System.out
       .println("usage: java transport \"<to1>[, <to2>]*\" <from> <smtp> true|false\nexample: java transport \"joe@machine, jane\" senderaddr smtphost false");
 }

}


 </source>
   
  
 
  



Get Message Size Line Count

   <source lang="java">

import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Part; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.URLName; import javax.mail.internet.InternetAddress; public class MainClass {

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

} class MailAuthenticator extends Authenticator {

 public MailAuthenticator() {
 }
 public PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication("username", "password");
 }

}


 </source>
   
  
 
  



How to construct and send an RFC822 (singlepart) message

   <source lang="java">

/*

* @(#)smtpsend.java  1.5 05/12/09
*
* Copyright 1997-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.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.SendFailedException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import com.sun.mail.smtp.SMTPAddressFailedException; import com.sun.mail.smtp.SMTPAddressSucceededException; import com.sun.mail.smtp.SMTPSendFailedException; import com.sun.mail.smtp.SMTPTransport; /**

* Demo app that shows how to construct and send an RFC822 (singlepart) message.
* 
* XXX - allow more than one recipient on the command line
* 
* This is just a variant of msgsend.java that demonstrates use of some
* SMTP-specific features.
* 
* @author Max Spivak
* @author Bill Shannon
*/

public class smtpsend {

 public static void main(String[] argv) {
   String to, subject = null, from = null, cc = null, bcc = null, url = null;
   String mailhost = null;
   String mailer = "smtpsend";
   String file = null;
   String protocol = null, host = null, user = null, password = null;
   String record = null; // name of folder in which to record mail
   boolean debug = false;
   boolean verbose = false;
   boolean auth = false;
   boolean ssl = false;
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   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("-M")) {
       mailhost = argv[++optind];
     } else if (argv[optind].equals("-f")) {
       record = argv[++optind];
     } else if (argv[optind].equals("-a")) {
       file = argv[++optind];
     } else if (argv[optind].equals("-s")) {
       subject = argv[++optind];
     } else if (argv[optind].equals("-o")) { // originator
       from = argv[++optind];
     } else if (argv[optind].equals("-c")) {
       cc = argv[++optind];
     } else if (argv[optind].equals("-b")) {
       bcc = argv[++optind];
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("-d")) {
       debug = true;
     } else if (argv[optind].equals("-v")) {
       verbose = true;
     } else if (argv[optind].equals("-A")) {
       auth = true;
     } else if (argv[optind].equals("-S")) {
       ssl = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out
           .println("Usage: smtpsend [[-L store-url] | [-T prot] [-H host] [-U user] [-P passwd]]");
       System.out.println("\t[-s subject] [-o from-address] [-c cc-addresses] [-b bcc-addresses]");
       System.out.println("\t[-f record-mailbox] [-M transport-host] [-d] [-a attach-file]");
       System.out.println("\t[-v] [-A] [-S] [address]");
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     if (optind < argv.length) {
       // XXX - concatenate all remaining arguments
       to = argv[optind];
       System.out.println("To: " + to);
     } else {
       System.out.print("To: ");
       System.out.flush();
       to = in.readLine();
     }
     if (subject == null) {
       System.out.print("Subject: ");
       System.out.flush();
       subject = in.readLine();
     } else {
       System.out.println("Subject: " + subject);
     }
     Properties props = System.getProperties();
     if (mailhost != null)
       props.put("mail.smtp.host", mailhost);
     if (auth)
       props.put("mail.smtp.auth", "true");
     // Get a Session object
     Session session = Session.getInstance(props, null);
     if (debug)
       session.setDebug(true);
     // construct the message
     Message msg = new MimeMessage(session);
     if (from != null)
       msg.setFrom(new InternetAddress(from));
     else
       msg.setFrom();
     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
     if (cc != null)
       msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false));
     if (bcc != null)
       msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc, false));
     msg.setSubject(subject);
     String text = collect(in);
     if (file != null) {
       // Attach the specified file.
       // We need a multipart message to hold the attachment.
       MimeBodyPart mbp1 = new MimeBodyPart();
       mbp1.setText(text);
       MimeBodyPart mbp2 = new MimeBodyPart();
       mbp2.attachFile(file);
       MimeMultipart mp = new MimeMultipart();
       mp.addBodyPart(mbp1);
       mp.addBodyPart(mbp2);
       msg.setContent(mp);
     } else {
       // If the desired charset is known, you can use
       // setText(text, charset)
       msg.setText(text);
     }
     msg.setHeader("X-Mailer", mailer);
     msg.setSentDate(new Date());
     // send the thing off
     /*
      * The simple way to send a message is this:
      * 
      * Transport.send(msg);
      * 
      * But we"re going to use some SMTP-specific features for demonstration
      * purposes so we need to manage the Transport object explicitly.
      */
     SMTPTransport t = (SMTPTransport) session.getTransport(ssl ? "smtps" : "smtp");
     try {
       if (auth)
         t.connect(mailhost, user, password);
       else
         t.connect();
       t.sendMessage(msg, msg.getAllRecipients());
     } finally {
       if (verbose)
         System.out.println("Response: " + t.getLastServerResponse());
       t.close();
     }
     System.out.println("\nMail was sent successfully.");
     // Keep a copy, if requested.
     if (record != 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();
       }
       // Get record Folder. Create if it does not exist.
       Folder folder = store.getFolder(record);
       if (folder == null) {
         System.err.println("Can"t get record folder.");
         System.exit(1);
       }
       if (!folder.exists())
         folder.create(Folder.HOLDS_MESSAGES);
       Message[] msgs = new Message[1];
       msgs[0] = msg;
       folder.appendMessages(msgs);
       System.out.println("Mail was recorded successfully.");
     }
   } catch (Exception e) {
     if (e instanceof SendFailedException) {
       MessagingException sfe = (MessagingException) e;
       if (sfe instanceof SMTPSendFailedException) {
         SMTPSendFailedException ssfe = (SMTPSendFailedException) sfe;
         System.out.println("SMTP SEND FAILED:");
         if (verbose)
           System.out.println(ssfe.toString());
         System.out.println("  Command: " + ssfe.getCommand());
         System.out.println("  RetCode: " + ssfe.getReturnCode());
         System.out.println("  Response: " + ssfe.getMessage());
       } else {
         if (verbose)
           System.out.println("Send failed: " + sfe.toString());
       }
       Exception ne;
       while ((ne = sfe.getNextException()) != null && ne instanceof MessagingException) {
         sfe = (MessagingException) ne;
         if (sfe instanceof SMTPAddressFailedException) {
           SMTPAddressFailedException ssfe = (SMTPAddressFailedException) sfe;
           System.out.println("ADDRESS FAILED:");
           if (verbose)
             System.out.println(ssfe.toString());
           System.out.println("  Address: " + ssfe.getAddress());
           System.out.println("  Command: " + ssfe.getCommand());
           System.out.println("  RetCode: " + ssfe.getReturnCode());
           System.out.println("  Response: " + ssfe.getMessage());
         } else if (sfe instanceof SMTPAddressSucceededException) {
           System.out.println("ADDRESS SUCCEEDED:");
           SMTPAddressSucceededException ssfe = (SMTPAddressSucceededException) sfe;
           if (verbose)
             System.out.println(ssfe.toString());
           System.out.println("  Address: " + ssfe.getAddress());
           System.out.println("  Command: " + ssfe.getCommand());
           System.out.println("  RetCode: " + ssfe.getReturnCode());
           System.out.println("  Response: " + ssfe.getMessage());
         }
       }
     } else {
       System.out.println("Got Exception: " + e);
       if (verbose)
         e.printStackTrace();
     }
   }
 }
 public static String collect(BufferedReader in) throws IOException {
   String line;
   StringBuffer sb = new StringBuffer();
   while ((line = in.readLine()) != null) {
     sb.append(line);
     sb.append("\n");
   }
   return sb.toString();
 }

}


 </source>
   
  
 
  



How to construct and send a single part html message

   <source lang="java">

/*

* @(#)sendhtml.java  1.10 05/08/17
*
* Copyright 1998-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.io.*; import java.util.Properties; import java.util.Date; import javax.mail.*; import javax.activation.*; import javax.mail.internet.*; import javax.mail.util.*; /**

* Demo app that shows how to construct and send a single part html message.
* Note that the same basic technique can be used to send data of any type.
* 
* @author John Mani
* @author Bill Shannon
* @author Max Spivak
*/

public class sendhtml {

 public static void main(String[] argv) {
   new sendhtml(argv);
 }
 public sendhtml(String[] argv) {
   String to, subject = null, from = null, cc = null, bcc = null, url = null;
   String mailhost = null;
   String mailer = "sendhtml";
   String protocol = null, host = null, user = null, password = null;
   String record = null; // name of folder in which to record mail
   boolean debug = false;
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   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("-M")) {
       mailhost = argv[++optind];
     } else if (argv[optind].equals("-f")) {
       record = argv[++optind];
     } else if (argv[optind].equals("-s")) {
       subject = argv[++optind];
     } else if (argv[optind].equals("-o")) { // originator
       from = argv[++optind];
     } else if (argv[optind].equals("-c")) {
       cc = argv[++optind];
     } else if (argv[optind].equals("-b")) {
       bcc = argv[++optind];
     } else if (argv[optind].equals("-L")) {
       url = argv[++optind];
     } else if (argv[optind].equals("-d")) {
       debug = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out
           .println("Usage: sendhtml [[-L store-url] | [-T prot] [-H host] [-U user] [-P passwd]]");
       System.out.println("\t[-s subject] [-o from-address] [-c cc-addresses] [-b bcc-addresses]");
       System.out.println("\t[-f record-mailbox] [-M transport-host] [-d] [address]");
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     if (optind < argv.length) {
       // XXX - concatenate all remaining arguments
       to = argv[optind];
       System.out.println("To: " + to);
     } else {
       System.out.print("To: ");
       System.out.flush();
       to = in.readLine();
     }
     if (subject == null) {
       System.out.print("Subject: ");
       System.out.flush();
       subject = in.readLine();
     } else {
       System.out.println("Subject: " + subject);
     }
     Properties props = System.getProperties();
     // XXX - could use Session.getTransport() and Transport.connect()
     // XXX - assume we"re using SMTP
     if (mailhost != null)
       props.put("mail.smtp.host", mailhost);
     // Get a Session object
     Session session = Session.getInstance(props, null);
     if (debug)
       session.setDebug(true);
     // construct the message
     Message msg = new MimeMessage(session);
     if (from != null)
       msg.setFrom(new InternetAddress(from));
     else
       msg.setFrom();
     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
     if (cc != null)
       msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false));
     if (bcc != null)
       msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc, false));
     msg.setSubject(subject);
     collect(in, msg);
     msg.setHeader("X-Mailer", mailer);
     msg.setSentDate(new Date());
     // send the thing off
     Transport.send(msg);
     System.out.println("\nMail was sent successfully.");
     // Keep a copy, if requested.
     if (record != 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();
       }
       // Get record Folder. Create if it does not exist.
       Folder folder = store.getFolder(record);
       if (folder == null) {
         System.err.println("Can"t get record folder.");
         System.exit(1);
       }
       if (!folder.exists())
         folder.create(Folder.HOLDS_MESSAGES);
       Message[] msgs = new Message[1];
       msgs[0] = msg;
       folder.appendMessages(msgs);
       System.out.println("Mail was recorded successfully.");
     }
   } catch (Exception e) {
     e.printStackTrace();
   }
 }
 public void collect(BufferedReader in, Message msg) throws MessagingException, IOException {
   String line;
   String subject = msg.getSubject();
   StringBuffer sb = new StringBuffer();
   sb.append("<HTML>\n");
   sb.append("<HEAD>\n");
   sb.append("<TITLE>\n");
   sb.append(subject + "\n");
   sb.append("</TITLE>\n");
   sb.append("</HEAD>\n");
   sb.append("<BODY>\n");
sb.append("

" + subject + "

" + "\n");
   while ((line = in.readLine()) != null) {
     sb.append(line);
     sb.append("\n");
   }
   sb.append("</BODY>\n");
   sb.append("</HTML>\n");
   msg.setDataHandler(new DataHandler(new ByteArrayDataSource(sb.toString(), "text/html")));
 }

}


 </source>
   
  
 
  



Send an email message

   <source lang="java">


import javax.mail.Session; import javax.mail.Message; import javax.mail.Transport; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import javax.mail.internet.InternetAddress; import java.util.Properties; public class Main {

 public static void main(String[] args) {
   String from = "user@some-domain.ru";
   String to = "user@some-domain.ru";
   String subject = "Hi There...";
   String text = "How are you?";
   Properties properties = new Properties();
   properties.put("mail.smtp.host", "smtp.some-domain.ru");
   properties.put("mail.smtp.port", "25");
   Session session = Session.getDefaultInstance(properties, null);
   Message message = new MimeMessage(session);
   message.setFrom(new InternetAddress(from));
   message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
   message.setSubject(subject);
   message.setText(text);
   Transport.send(message);
 }

}

 </source>
   
  
 
  



Show information about and contents of messages

   <source lang="java">

/*

* @(#)msgshow.java 1.33 05/12/09
*
* Copyright 1997-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.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; 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.MessagingException; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.event.StoreEvent; import javax.mail.event.StoreListener; import javax.mail.internet.ContentType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.ParseException; // import javax.activation.*; /*

* Demo app that exercises the Message interfaces. Show information about and
* contents of messages.
* 
* @author John Mani @author Bill Shannon
*/

public class MainClass {

 static String protocol;
 static String host = null;
 static String user = null;
 static String password = null;
 static String mbox = null;
 static String url = null;
 static int port = -1;
 static boolean verbose = false;
 static boolean debug = false;
 static boolean showStructure = false;
 static boolean showMessage = false;
 static boolean showAlert = false;
 static boolean saveAttachments = false;
 static int attnum = 1;
 public static void main(String argv[]) {
   int msgnum = -1;
   int optind;
   InputStream msgStream = System.in;
   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("-v")) {
       verbose = 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("-p")) {
       port = Integer.parseInt(argv[++optind]);
     } else if (argv[optind].equals("-s")) {
       showStructure = true;
     } else if (argv[optind].equals("-S")) {
       saveAttachments = true;
     } else if (argv[optind].equals("-m")) {
       showMessage = true;
     } else if (argv[optind].equals("-a")) {
       showAlert = true;
     } else if (argv[optind].equals("--")) {
       optind++;
       break;
     } else if (argv[optind].startsWith("-")) {
       System.out.println("Usage: msgshow [-L url] [-T protocol] [-H host] [-p port] [-U user]");
       System.out.println("\t[-P password] [-f mailbox] [msgnum] [-v] [-D] [-s] [-S] [-a]");
       System.out.println("or     msgshow -m [-v] [-D] [-s] [-S] [-f msg-file]");
       System.exit(1);
     } else {
       break;
     }
   }
   try {
     if (optind < argv.length)
       msgnum = Integer.parseInt(argv[optind]);
     // Get a Properties object
     Properties props = System.getProperties();
     // Get a Session object
     Session session = Session.getInstance(props, null);
     session.setDebug(debug);
     if (showMessage) {
       MimeMessage msg;
       if (mbox != null)
         msg = new MimeMessage(session, new BufferedInputStream(new FileInputStream(mbox)));
       else
         msg = new MimeMessage(session, msgStream);
       dumpPart(msg);
       System.exit(0);
     }
     // Get a Store object
     Store store = null;
     if (url != null) {
       URLName urln = new URLName(url);
       store = session.getStore(urln);
       if (showAlert) {
         store.addStoreListener(new StoreListener() {
           public void notification(StoreEvent e) {
             String s;
             if (e.getMessageType() == StoreEvent.ALERT)
               s = "ALERT: ";
             else
               s = "NOTICE: ";
             System.out.println(s + e.getMessage());
           }
         });
       }
       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();
     }
     // Open the Folder
     Folder folder = store.getDefaultFolder();
     if (folder == null) {
       System.out.println("No default folder");
       System.exit(1);
     }
     if (mbox == null)
       mbox = "INBOX";
     folder = folder.getFolder(mbox);
     if (folder == null) {
       System.out.println("Invalid folder");
       System.exit(1);
     }
     // try to open read/write and if that fails try read-only
     try {
       folder.open(Folder.READ_WRITE);
     } catch (MessagingException ex) {
       folder.open(Folder.READ_ONLY);
     }
     int totalMessages = folder.getMessageCount();
     if (totalMessages == 0) {
       System.out.println("Empty folder");
       folder.close(false);
       store.close();
       System.exit(1);
     }
     if (verbose) {
       int newMessages = folder.getNewMessageCount();
       System.out.println("Total messages = " + totalMessages);
       System.out.println("New messages = " + newMessages);
       System.out.println("-------------------------------");
     }
     if (msgnum == -1) {
       // Attributes & Flags for all messages ..
       Message[] msgs = folder.getMessages();
       // Use a suitable FetchProfile
       FetchProfile fp = new FetchProfile();
       fp.add(FetchProfile.Item.ENVELOPE);
       fp.add(FetchProfile.Item.FLAGS);
       fp.add("X-Mailer");
       folder.fetch(msgs, fp);
       for (int i = 0; i < msgs.length; i++) {
         System.out.println("--------------------------");
         System.out.println("MESSAGE #" + (i + 1) + ":");
         dumpEnvelope(msgs[i]);
         // dumpPart(msgs[i]);
       }
     } else {
       System.out.println("Getting message number: " + msgnum);
       Message m = null;
       try {
         m = folder.getMessage(msgnum);
         dumpPart(m);
       } catch (IndexOutOfBoundsException iex) {
         System.out.println("Message number out of range");
       }
     }
     folder.close(false);
     store.close();
   } catch (Exception ex) {
     System.out.println("Oops, got exception! " + ex.getMessage());
     ex.printStackTrace();
     System.exit(1);
   }
   System.exit(0);
 }
 public static void dumpPart(Part p) throws Exception {
   if (p instanceof Message)
     dumpEnvelope((Message) p);
   /**
    * Dump input stream ..
    * 
    * InputStream is = p.getInputStream(); // If "is" is not already buffered,
    * wrap a BufferedInputStream // around it. if (!(is instanceof
    * BufferedInputStream)) is = new BufferedInputStream(is); int c; while ((c =
    * is.read()) != -1) System.out.write(c);
    * 
    */
   String ct = p.getContentType();
   try {
     pr("CONTENT-TYPE: " + (new ContentType(ct)).toString());
   } catch (ParseException pex) {
     pr("BAD CONTENT-TYPE: " + ct);
   }
   String filename = p.getFileName();
   if (filename != null)
     pr("FILENAME: " + filename);
   /*
    * Using isMimeType to determine the content type avoids fetching the actual
    * content data until we need it.
    */
   if (p.isMimeType("text/plain")) {
     pr("This is plain text");
     pr("---------------------------");
     if (!showStructure && !saveAttachments)
       System.out.println((String) p.getContent());
   } else if (p.isMimeType("multipart/*")) {
     pr("This is a Multipart");
     pr("---------------------------");
     Multipart mp = (Multipart) p.getContent();
     level++;
     int count = mp.getCount();
     for (int i = 0; i < count; i++)
       dumpPart(mp.getBodyPart(i));
     level--;
   } else if (p.isMimeType("message/rfc822")) {
     pr("This is a Nested Message");
     pr("---------------------------");
     level++;
     dumpPart((Part) p.getContent());
     level--;
   } else {
     if (!showStructure && !saveAttachments) {
       /*
        * If we actually want to see the data, and it"s not a MIME type we
        * know, fetch it and check its Java type.
        */
       Object o = p.getContent();
       if (o instanceof String) {
         pr("This is a string");
         pr("---------------------------");
         System.out.println((String) o);
       } else if (o instanceof InputStream) {
         pr("This is just an input stream");
         pr("---------------------------");
         InputStream is = (InputStream) o;
         int c;
         while ((c = is.read()) != -1)
           System.out.write(c);
       } else {
         pr("This is an unknown type");
         pr("---------------------------");
         pr(o.toString());
       }
     } else {
       // just a separator
       pr("---------------------------");
     }
   }
   /*
    * If we"re saving attachments, write out anything that looks like an
    * attachment into an appropriately named file. Don"t overwrite existing
    * files to prevent mistakes.
    */
   if (saveAttachments && level != 0 && !p.isMimeType("multipart/*")) {
     String disp = p.getDisposition();
     // many mailers don"t include a Content-Disposition
     if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)) {
       if (filename == null)
         filename = "Attachment" + attnum++;
       pr("Saving attachment to file " + filename);
       try {
         File f = new File(filename);
         if (f.exists())
           // XXX - could try a series of names
           throw new IOException("file exists");
         ((MimeBodyPart) p).saveFile(f);
       } catch (IOException ex) {
         pr("Failed to save attachment: " + ex);
       }
       pr("---------------------------");
     }
   }
 }
 public static void dumpEnvelope(Message m) throws Exception {
   pr("This is the message envelope");
   pr("---------------------------");
   Address[] a;
   // FROM
   if ((a = m.getFrom()) != null) {
     for (int j = 0; j < a.length; j++)
       pr("FROM: " + a[j].toString());
   }
   // TO
   if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
     for (int j = 0; j < a.length; j++) {
       pr("TO: " + a[j].toString());
       InternetAddress ia = (InternetAddress) a[j];
       if (ia.isGroup()) {
         InternetAddress[] aa = ia.getGroup(false);
         for (int k = 0; k < aa.length; k++)
           pr("  GROUP: " + aa[k].toString());
       }
     }
   }
   // SUBJECT
   pr("SUBJECT: " + m.getSubject());
   // DATE
   Date d = m.getSentDate();
   pr("SendDate: " + (d != null ? d.toString() : "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]);
   }
   pr("FLAGS: " + sb.toString());
   // X-MAILER
   String[] hdrs = m.getHeader("X-Mailer");
   if (hdrs != null)
     pr("X-Mailer: " + hdrs[0]);
   else
     pr("X-Mailer NOT available");
 }
 static String indentStr = "                                               ";
 static int level = 0;
 /**
  * Print a, possibly indented, string.
  */
 public static void pr(String s) {
   if (showStructure)
     System.out.print(indentStr.substring(0, level * 2));
   System.out.println(s);
 }

}


 </source>