Mega Code Archive

 
Categories / Java / Network Protocol
 

Mailer

/*  * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.  * All rights reserved. Software written by Ian F. Darwin and others.  * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions 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.  *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  *   * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee  * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,  * pioneering role in inventing and promulgating (and standardizing) the Java   * language and environment is gratefully acknowledged.  *   * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for  * inventing predecessor languages C and C++ is also gratefully acknowledged.  */ import java.util.*; import javax.mail.*; import javax.mail.internet.*;  /** Mailer. No relation to Norman. Sends an email message.  * My old Sender class, recast as a Bean for use in JSP's & elsewhere.  * Example usage:  * <pre>  * Mailer mb = new Mailer();  * mb.setFrom("orders@YourDomain.com");  * mb.addTo("orders@YourDomain.com");  * mb.setSubject("LHBOOKS ORDER!!");  * mb.setBody(order.toString());  * mb.setServer(application.getInitParameter("mail.server.smtp"));   * try {  *     mb.doSend();  * } catch (MessagingException ex) {  *     ...  * }  * </pre>  * @author Ian F. Darwin  * @version $Id: Mailer.java,v 1.16 2004/01/31 01:26:05 ian Exp $  */ public class Mailer {   /** The javamail session object. */   protected Session session;   /** The sender's email address */   protected String from;   /** The subject of the message. */   protected String subject;   /** The recipient ("To:"), as Strings. */   protected ArrayList toList = new ArrayList();   /** The CC list, as Strings. */   protected ArrayList ccList = new ArrayList();   /** The BCC list, as Strings. */   protected ArrayList bccList = new ArrayList();   /** The text of the message. */   protected String body;   /** The SMTP relay host */   protected String mailHost;   /** The verbosity setting */   protected boolean verbose;   /** Get from */   public String getFrom() {     return from;   }   /** Set from */   public void setFrom(String fm) {     from = fm;   }   /** Get subject */   public String getSubject() {     return subject;   }   /** Set subject */   public void setSubject(String subj) {     subject = subj;   }   // SETTERS/GETTERS FOR TO: LIST    /** Get tolist, as an array of Strings */   public ArrayList getToList() {     return toList;   }   /** Set to list to an ArrayList of Strings */   public void setToList(ArrayList to) {     toList = to;   }   /** Set to as a string like "tom, mary, robin@host". Loses any    * previously-set values. */   public void setToList(String s) {     toList = tokenize(s);   }   /** Add one "to" recipient */   public void addTo(String to) {     toList.add(to);   }   // SETTERS/GETTERS FOR CC: LIST    /** Get cclist, as an array of Strings */   public ArrayList getCcList() {     return ccList;   }   /** Set cc list to an ArrayList of Strings */   public void setCcList(ArrayList cc) {     ccList = cc;   }   /** Set cc as a string like "tom, mary, robin@host". Loses any    * previously-set values. */   public void setCcList(String s) {     ccList = tokenize(s);   }   /** Add one "cc" recipient */   public void addCc(String cc) {     ccList.add(cc);   }   // SETTERS/GETTERS FOR BCC: LIST    /** Get bcclist, as an array of Strings */   public ArrayList getBccList() {     return bccList;   }   /** Set bcc list to an ArrayList of Strings */   public void setBccList(ArrayList bcc) {     bccList = bcc;   }   /** Set bcc as a string like "tom, mary, robin@host". Loses any    * previously-set values. */   public void setBccList(String s) {     bccList = tokenize(s);   }   /** Add one "bcc" recipient */   public void addBcc(String bcc) {     bccList.add(bcc);   }   // SETTER/GETTER FOR MESSAGE BODY   /** Get message */   public String getBody() {     return body;   }   /** Set message */   public void setBody(String text) {     body = text;   }   // SETTER/GETTER FOR VERBOSITY   /** Get verbose */   public boolean isVerbose() {     return verbose;   }   /** Set verbose */   public void setVerbose(boolean v) {     verbose = v;   }   /** Check if all required fields have been set before sending.    * Normally called e.g., by a JSP before calling doSend.    * Is also called by doSend for verification.    */   public boolean isComplete() {     if (from == null    || from.length()==0) {       System.err.println("doSend: no FROM");       return false;     }     if (subject == null || subject.length()==0) {       System.err.println("doSend: no SUBJECT");       return false;     }     if (toList.size()==0) {       System.err.println("doSend: no recipients");       return false;     }     if (body == null || body.length()==0) {       System.err.println("doSend: no body");       return false;     }     if (mailHost == null || mailHost.length()==0) {       System.err.println("doSend: no server host");       return false;     }     return true;   }   public void setServer(String s) {     mailHost = s;   }   /** Send the message.    */   public synchronized void doSend() throws MessagingException {     if (!isComplete())       throw new IllegalArgumentException(         "doSend called before message was complete");     /** Properties object used to pass props into the MAIL API */     Properties props = new Properties();     props.put("mail.smtp.host", mailHost);     // Create the Session object     if (session == null) {       session = Session.getDefaultInstance(props, null);       if (verbose)         session.setDebug(true);    // Verbose!     }          // create a message     final Message mesg = new MimeMessage(session);     InternetAddress[] addresses;     // TO Address list     addresses = new InternetAddress[toList.size()];     for (int i=0; i<addresses.length; i++)       addresses[i] = new InternetAddress((String)toList.get(i));     mesg.setRecipients(Message.RecipientType.TO, addresses);     // From Address     mesg.setFrom(new InternetAddress(from));     // CC Address list     addresses = new InternetAddress[ccList.size()];     for (int i=0; i<addresses.length; i++)       addresses[i] = new InternetAddress((String)ccList.get(i));     mesg.setRecipients(Message.RecipientType.CC, addresses);     // BCC Address list     addresses = new InternetAddress[bccList.size()];     for (int i=0; i<addresses.length; i++)       addresses[i] = new InternetAddress((String)bccList.get(i));     mesg.setRecipients(Message.RecipientType.BCC, addresses);     // The Subject     mesg.setSubject(subject);     // Now the message body.     mesg.setText(body);     // Finally, send the message! (use static Transport method)     // Do this in a Thread as it sometimes is too slow for JServ     // new Thread() {       // public void run() {         // try {           Transport.send(mesg);         // } catch (MessagingException e) {           // throw new IllegalArgumentException(           // "Transport.send() threw: " + e.toString());         // }       // }     // }.start();   }   /** Convenience method that does it all with one call.    * @param mailhost - SMTP server host    * @param recipient - domain address of email (user@host.domain)    * @param sender - your email address    * @param subject - the subject line    * @param message - the entire message body as a String with embedded \n's    */   public static void send(String mailhost,      String recipient, String sender, String subject, String message)    throws MessagingException {     Mailer m = new Mailer();     m.setServer(mailhost);     m.addTo(recipient);     m.setFrom(sender);     m.setSubject(subject);     m.setBody(message);     m.doSend();   }   /** Convert a list of addresses to an ArrayList. This will work    * for simple names like "tom, mary@foo.com, 123.45@c$.com"    * but will fail on certain complex (but RFC-valid) names like    * "(Darwin, Ian) <http://www.darwinsys.com/>".    * Or even "Ian Darwin <http://www.darwinsys.com/>".    */   protected ArrayList tokenize(String s) {     ArrayList al = new ArrayList();     StringTokenizer tf = new StringTokenizer(s, ",");     // For each word found in the line     while (tf.hasMoreTokens()) {       // trim blanks, and add to list.       al.add(tf.nextToken().trim());     }     return al;   } }