Recipe 20.3 Sending Email from a Servlet Using a JavaBean


Problem

You want to use a JavaBean or helper class to send email from a servlet.

Solution

Develop a Java class that implements a sendMessage( ) method (just a name I gave it) to construct an email and send it. Store the new class in the WEB-INF/classes folder of the web application, including the class's package- related folders.

Discussion

You may choose to separate the responsibilities of handling HTTP requests and managing email by encapsulating these tasks in separate classes. A JavaBean that provides the essential function of sending email fits the bill here.

Recipe 20.5 and Recipe 20.6 show JavaBeans that are used to access email and handle attachments. A bean that does everything email-related grows fairly large in size, so developers must make a design decision about whether to separate these tasks into different JavaBeans (or utility classes) that can be used from servlets.


Create the bean and store it in the WEB-INF/classes folder. Example 20-3 shows the doGet( ) method of an HttpServlet using a JavaBean to send an email. Example 20-2 shows the bean class itself. The difference between the sendMessage( ) method of Example 20-1 and the one in Example 20-2 is in the way the bean receives the various email parts, such as the recipient's email address. The bean stores these parts as properties and uses setter methods to provide the property values.

On the other hand, Example 20-1 uses request parameters and method arguments to provide these values.


Example 20-2. A JavaBean used to send email
 package com.jspservletcookbook;     import java.io.IOException; import java.io.PrintWriter; import java.util.Properties;  import javax.mail.*; import javax.mail.internet.*;  public class EmailBean  {   public EmailBean( ){}       //set defaults       private final static String DEFAULT_CONTENT = "Unknown content";       private final static String DEFAULT_SUBJECT= "Unknown subject";       private static String DEFAULT_SERVER = null;       private static String DEFAULT_TO = null;       private static String DEFAULT_FROM = null;       static{           //set Mail defaults based on a properties file           java.util.ResourceBundle bundle =              java.util.ResourceBundle.             getBundle("com.jspservletcookbook.mailDefaults");              DEFAULT_SERVER = bundle.getString("DEFAULT_SERVER");             DEFAULT_TO = bundle.getString("DEFAULT_TO");             DEFAULT_FROM = bundle.getString("DEFAULT_FROM");           }//static  //JavaBean properties           private String smtpHost;           private String to;           private String from;           private String content;           private String subject;       public void sendMessage( ) throws Exception {             Properties properties = System.getProperties( );       //populate the 'Properties' object with the mail       //server address, so that the default 'Session'       //instance can use it.       properties.put("mail.smtp.host", smtpHost);       Session session = Session.getDefaultInstance(properties);       Message mailMsg = new MimeMessage(session);//a new email message       InternetAddress[] addresses = null;  try {               if (to != null) {  //throws 'AddressException' if the 'to' email address               //violates RFC822 syntax               addresses = InternetAddress.parse(to, false);               mailMsg.setRecipients(Message.RecipientType.TO, addresses);  } else {                        throw new MessagingException(                 "The mail message requires a 'To' address.");                    }           if (from != null) {  mailMsg.setFrom(new InternetAddress(from));  } else {                        throw new MessagingException(                 "The mail message requires a valid 'From' address.");                    }  if (subject != null)               mailMsg.setSubject(subject);           if (content != null)               mailMsg.setText(content);                    //Finally, send the mail message; throws a 'SendFailedException'            //if any of the message's recipients have an invalid address           Transport.send(mailMsg);  } catch (Exception exc) {                     throw exc;                }         }//sendMessage  //The setter methods are all the same structure,   //so we're just showing two  public void setSmtpHost(String host){       if (check(host)){           this.smtpHost = host;       } else {           this.smtpHost = DEFAULT_SERVER;       }   }//setSmtpHost        public void setTo(String to){       if (check(to)){           this.to = to;       } else {           this.to = DEFAULT_TO;       }   }//setTo              /* -- Not shown: 'setter' methods continue with exactly the same structure for  'from', 'subject', and 'content' -- */        private boolean check(String value){            if(value == null  value.equals(""))           return false;                        return true;   }//check } 

Example 20-3 uses the java.util.ResourceBundle class to set default property values for variables such as the name of the server. The mailDefaults.properties file is stored in WEB-INF/classes/com/jspservletcookbook . Here is an example of the properties file's contents:

 DEFAULT_SERVER=smtp.comcast.net DEFAULT_TO=author@jspservletcookbook.com DEFAULT_FROM=author@jspservletcookbook.com 

The bean allows the setting of the various email parts with the following methods (Example 20-3 does not show all of them): setSmtpHost( ) , setTo( ) , setFrom( ) , setSubject( ) , and setContent( ) .

The servlet in Example 20-3 creates an instance of an EmailBean , sets the various parts of the email message, then calls the sendMessage( ) method. Example 20-3 shows only the doGet( ) method. The servlet's doPost( ) method could call doGet( ) as in: doGet(request, response) .

Example 20-3. A servlet uses the JavaBean to send email
 public void doGet(HttpServletRequest request,    HttpServletResponse response)   throws ServletException, java.io.IOException {          response.setContentType("text/html");     java.io.PrintWriter out = response.getWriter( );     out.println(     "<html><head><title>Email message sender</title></head><body>");  EmailBean emailer = new EmailBean( );     emailer.setSmtpHost("mail.attbi.com");     emailer.setTo("myfriend@yahoo.com");     emailer.setFrom("author@jspservletcookbook.com");     emailer.setSubject("This is not spam!");     emailer.setContent("Please call ASAP.");         try{         emailer.sendMessage( );         } catch (Exception e) {throw new ServletException(e);}  out.println("</body></html>"); } //doGet 

The bean itself throws MessagingExceptions if, for instance, the "to" email address that the user provides is in an invalid format. The bean rethrows any exceptions that it catches while building and sending the email.

See Also

Recipe 20.4 covering how to access email in a servlet; Recipe 20.5 on accessing email with a JavaBean; Recipe 20.6 on handling attachments in a servlet; Recipe 20.7 on adding attachments to an email message; Recipe 20.8 on reading an email's headers.



Java Servlet & JSP Cookbook
Java Servlet & JSP Cookbook
ISBN: 0596005725
EAN: 2147483647
Year: 2004
Pages: 326

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net