murach’s java servlets/jsp (2 nd ed.), c15© 2008, mike murach & associates, inc.slide 1

31
Murach’s Java Servlets/JSP (2 nd Ed.), C15 © 2008, Mike Murach & Associates, Inc . Slide 1 C hapter15 How to use JavaM ailto send em ail

Post on 20-Dec-2015

228 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 1

Chapter 15

How to use JavaMail to send email

Page 2: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 2

Objectives

Applied

Develop servlets that send email messages to the users of the application.

Knowledge

In terms of the SMTP, POP, and MIME protocols, describe how an email message is sent from one client to another.

Page 3: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 3

How email works

Sending server

Sending client

Mail client software

Mail server software

Receiving server

Mail server software

Receiving client

Mail client software

SMTP POP

Page 4: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 4

Three protocols for sending and retrieving email messages

Protocol Description

SMTP Simple Mail Transfer Protocol is used to send a message from one mail server to another.

POP Post Office Protocol is used to retrieve messages from a mail server. This protocol transfers all messages from the mail server to the mail client.

IMAP Internet Message Access Protocol is used by web-based mail services such as Hotmail, Yahoo, and Gmail. This protocol allows a web browser to read messages that are stored on the mail server.

Page 5: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 5

Another protocol that’s used with email

Protocol Description

MIME The Multipurpose Internet Message Extension type, or MIME type, specifies the type of content that can be sent as a message or attachment.

The JAR files for the JavaMail API

File Description

mail.jar Contains the Java classes for the JavaMail API.

activation.jar Contains the Java classes for the JavaBean Activation Framework. These classes are necessary for the JavaMail API to run.

Page 6: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 6

How to install the JavaMail API Locate the download page for the JavaMail API on the Java web

site (www.java.sun.com).

Click on the Download button and follow the instructions.

Save the zip file for the JavaMail API to your hard disk. This file is typically named something like javamail-1_4.zip.

Extract the files from the zip file.

Copy the mail.jar file to the JDK’s jre\lib\ext directory.

Page 7: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 7

How to install the JavaBeans Activation Framework API Locate the download page for the JavaBeans Activation

Framework API on the Java web site (www.java.sun.com).

Click on the Download button and follow the instructions.

Save the zip file for the JavaMail API to your hard disk. This file is typically named something like jaf-1_1.zip.

Extract the files from the zip file.

Copy the activation.jar file to the JDK’s jre\lib\ext directory.

Page 8: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 8

Three packages for sending email

Package Description

java.util Contains the Properties class that’s used to set the properties for the email session.

javax.mail Contains the Session, Message, Address, Transport, and MessagingException classes needed to send a message.

javax.mail.internet Contains the MimeMessage and InternetAddress classes needed to send an email message across the Internet.

Page 9: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 9

Code that uses the JavaMail API to send an email try { // 1 - get a mail session Properties props = new Properties(); props.put("mail.smtp.host", "localhost"); Session session = Session.getDefaultInstance(props); // 2 - create a message Message message = new MimeMessage(session); message.setSubject(subject); message.setText(body); // 3 - address the message Address fromAddress = new InternetAddress(from); Address toAddress = new InternetAddress(to); message.setFrom(fromAddress); message.setRecipient(Message.RecipientType.TO, toAddress);

Page 10: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 10

Code that uses the JavaMail API (cont.) // 4 - send the message Transport.send(message); } catch (MessagingException e) { log(e.toString()); }

Page 11: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 11

Common properties that can be set for a Session object

Property Description

mail.transport.protocol Specifies the protocol that’s used for the session. For sending email, the protocol is usually smtp or smtps.

mail.smtp.host Specifies the host computer for the SMTP server.

mail.smtp.port Specifies the port that the SMTP server is using.

mail.smtp.auth Specifies whether authentication is required to log in to the SMTP server.

mail.smtp.quitwait This property can be set to false to prevent an SSLException from occurring when you attempt to connect to a GMail SMTP server.

Page 12: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 12

How to get a mail session for a local SMTP server Properties props = new Properties(); props.put("mail.smtp.host", "localhost"); Session session = Session.getDefaultInstance(props);

Another way to get a mail session for a local SMTP server

Properties props = new Properties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.host", "localhost"); props.put("mail.smtp.port", 25); Session session = Session.getDefaultInstance(props); session.setDebug(true);

Page 13: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 13

How to get a mail session for a remote SMTP server

Properties props = new Properties(); props.put("mail.transport.protocol", "smtps"); props.put("mail.smtps.host", "smtp.gmail.com"); props.put("mail.smtps.port", 465); props.put("mail.smtps.auth", "true"); props.put("mail.smtps.quitwait", "false"); Session session = Session.getDefaultInstance(props); session.setDebug(true);

Page 14: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 14

How to create a mail session A Session object contains information about the mail session such

as the procotol, the host, the port, and so on. (This isn’t the same as the HttpSession object.)

To set the properties of a Properties object, you can use the put method to specify a property name and value for each property.

The static getDefaultInstance method of the Session class returns the default Session object for the application.

The setDebug method of the Session object can be used to print debugging information about the session to a log file.

If you change the properties for a Session object, you must restart Tomcat before the changes take effect.

If the Java application is running on the same computer as the SMTP server, you can usually use the localhost keyword to specify the SMTP host.

Page 15: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 15

How to create a message Message message = new MimeMessage(session);

How to set the subject line of a message message.setSubject("Order Confirmation");

How to set the body of a plain text message message.setText("Thanks for your order!");

How to set the body of an HTML message message.setContent( "<H1>Thanks for your order!</H1>", "text/html");

Page 16: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 16

How to create a message You can use the MimeMessage class that’s stored in the

javax.mail.internet package to create a message. This message extends the Message class that’s stored in the java.mail package.

To create a MimeMessage object, you supply a valid Session object to the MimeMessage constructor.

Once you’ve created a MimeMessage object, you can use the setSubject and setText methods to set the subject line and body of the email message. This automatically sets the MIME type to text/plain.

You can use the setContent method to include an HTML document as the body of the message. To do that, the first argument specifies a string for the HTML document, and the second argument specifies text/html as the MIME type.

All of these methods throw a javax.mail.MessagingException.

Page 17: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 17

How to set the From address Address fromAddress = new InternetAddress("[email protected]"); message.setFrom(fromAddress);

How to set the To address Address toAddress = new InternetAddress("[email protected]"); message.setRecipient( Message.RecipientType.TO, toAddress);

How to set the CC address Address ccAddress = new InternetAddress("[email protected]"); message.setRecipient( Message.RecipientType.CC, ccAddress);

How to set the BCC address Address bccAddress = new InternetAddress("[email protected]"); message.setRecipient( Message.RecipientType.BCC, bccAddress);

Page 18: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 18

How to include an email address and a name Address toAddress = new InternetAddress( "[email protected]", "Andrea Steelman");

How to send a message to multiple recipients Address[] mailList = { new InternetAddress("[email protected]"), new InternetAddress("[email protected]"), new InternetAddress("[email protected]") }; message.setRecipients( Message.RecipientType.TO, mailList);

How to add recipients to a message Address toAddress = new InternetAddress("[email protected]"); message.addRecipient( Message.RecipientType.TO, toAddress);

Page 19: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 19

How to address a message Use the InternetAddress class that’s stored in the

javax.mail.internet package.

To set the From address, use the setFrom method of the MimeMessage object. To set the To, CC (carbon copy), and BCC (blind carbon copy) addresses, use the setRecipient and setRecipients methods of the MimeMessage object.

To include a name for an email address, you can add a second argument to the InternetAddress constructor. However, this constructor throws an exception of the java.io.UnsupportedEncodingException type.

To send an email message to multiple recipients, you can pass an array of Address objects to the setRecipients method. To add email addresses to any existing addresses for a message, use the addRecipient and addRecipients methods.

All of these methods throw a javax.mail.MessagingException.

Page 20: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 20

How to send a message when no authentication is required

Transport.send(message);

How to send a message when authentication is required

Transport transport = session.getTransport(); transport.connect("[email protected]", "sesame"); transport.sendMessage( message, message.getAllRecipients()); transport.close();

Page 21: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 21

How to send a message If the SMTP server doesn’t require authentication, you can use the

static send method of the Transport class.

If the SMTP server requires authentication, you can use the static getTransport method of the Transport class to return a Transport object. Then, you can use the connect method to specify a username and password that can be used to connect to the server; the sendMessage method to send the message; and the close method to close the connection.

If the SMTP host is incorrect in the session object or if a message can’t be sent, the send method will throw a SendFailedException object. You can use this object to return invalid addresses, valid addresses that have been sent, and valid addresses that haven’t been sent.

The SendFailedException class inherits the MessagingException class.

Page 22: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 22

A helper class for sending an email with a local SMTP server package util; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class MailUtilLocal { public static void sendMail(String to, String from, String subject, String body, boolean bodyIsHTML) throws MessagingException { // 1 - get a mail session Properties props = new Properties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.host", "localhost"); props.put("mail.smtp.port", 25); Session session = Session.getDefaultInstance(props); session.setDebug(true);

Page 23: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 23

A helper class for sending an email with a local SMTP server (cont.) // 2 - create a message Message message = new MimeMessage(session); message.setSubject(subject); if (bodyIsHTML) message.setContent(body, "text/html"); else message.setText(body); // 3 - address the message Address fromAddress = new InternetAddress(from); Address toAddress = new InternetAddress(to); message.setFrom(fromAddress); message.setRecipient( Message.RecipientType.TO, toAddress); // 4 - send the message Transport.send(message); } }

Page 24: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 24

A servlet that sends an email package email; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.mail.MessagingException; import business.User; import data.UserIO; import util.*; public class AddToEmailListServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Page 25: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 25

A servlet that sends an email (cont.) // get parameters from the request String firstName = request.getParameter("firstName"); String lastName = request.getParameter("lastName"); String emailAddress = request.getParameter("emailAddress"); // create the User object and write it to a file User user = new User( firstName, lastName, emailAddress); ServletContext sc = getServletContext(); String path = sc.getRealPath( "/WEB-INF/EmailList.txt"); UserIO.addRecord(user, path); // store the User object in the session HttpSession session = request.getSession(); session.setAttribute("user", user);

Page 26: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 26

A servlet that sends an email (cont.) // send email to user String to = emailAddress; String from = "[email protected]"; String subject = "Welcome to our email list"; String body = "Dear " + firstName + ",\n\n" + "Thanks for joining our email list. " + "We'll make sure to send you announcements " + "about new products and promotions.\n" + "Have a great day and thanks again!\n\n" + "Kelly Slivkoff\n" + "Mike Murach & Associates"; boolean isBodyHTML = false; try { MailUtilLocal.sendMail( to, from, subject, body, isBodyHTML); }

Page 27: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 27

A servlet that sends an email (cont.) catch (MessagingException e) { String errorMessage = "ERROR: Unable to send email. " + "Check Tomcat logs for details.<br>" + "NOTE: You may need to configure your " + "system as described in chapter 15.<br>" + "ERROR MESSAGE: " + e.getMessage(); request.setAttribute( "errorMessage", errorMessage); this.log( "Unable to send email. \n" + "Here is the email you tried to send: \n" + "=====================================\n" + "TO: " + emailAddress + "\n" + "FROM: " + from + "\n" + "SUBJECT: " + subject + "\n" + "\n" + body + "\n\n"); }

Page 28: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 28

A servlet that sends an email (cont.) // forward request and response to JSP page String url = "/display_email_entry.jsp"; RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url); dispatcher.forward(request, response); } }

Page 29: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 29

A helper class for sending an email with a remote SMTP server package util; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class MailUtilYahoo { public static void sendMail(String to, String from, String subject, String body, boolean bodyIsHTML) throws MessagingException { // 1 - get a mail session Properties props = new Properties(); props.put("mail.transport.protocol", "smtps"); props.put("mail.smtps.host", "smtp.mail.yahoo.com"); props.put("mail.smtps.port", 465); props.put("mail.smtps.auth", "true"); Session session = Session.getDefaultInstance(props); session.setDebug(true);

Page 30: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 30

A helper class for sending an email with a remote SMTP server (cont.) // 2 - create a message Message message = new MimeMessage(session); message.setSubject(subject); if (bodyIsHTML) message.setContent(body, "text/html"); else message.setText(body); // 3 - address the message Address fromAddress = new InternetAddress(from); Address toAddress = new InternetAddress(to); message.setFrom(fromAddress); message.setRecipient( Message.RecipientType.TO, toAddress);

Page 31: Murach’s Java Servlets/JSP (2 nd Ed.), C15© 2008, Mike Murach & Associates, Inc.Slide 1

Murach’s Java Servlets/JSP (2nd Ed.), C15 © 2008, Mike Murach & Associates, Inc. Slide 31

A helper class for sending an email with a remote SMTP server (cont.) // 4 - send the message Transport transport = session.getTransport(); transport.connect("johnsmith", "sesame"); transport.sendMessage( message, message.getAllRecipients()); transport.close(); } }