Chapter 15
How to use JavaMail to
send email
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
send email
Objectives
Applied
•
'HYHORSVHUYOHWVWKDWVHQGHPDLOPHVVDJHVWRWKHXVHUVRIWKH
DSSOLFDWLRQ
Knowledge
•
,QWHUPVRIWKH6073323DQG0,0(SURWRFROVGHVFULEHKRZ
DQHPDLOPHVVDJHLVVHQWIURPRQHFOLHQWWRDQRWKHU
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
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
Mail server software Mail server software
Three protocols for sending and retrieving email
messages
Protocol
Description
6073
6LPSOH0DLO7UDQVIHU3URWRFRO
LVXVHGWRVHQGDPHVVDJH
IURPRQHPDLOVHUYHUWRDQRWKHU
323
3RVW2IILFH3URWRFRO
LVXVHGWRUHWULHYHPHVVDJHVIURPD
PDLOVHUYHU7KLVSURWRFROWUDQVIHUVDOOPHVVDJHVIURP
WKHPDLOVHUYHUWRWKHPDLOFOLHQW
WKHPDLOVHUYHUWRWKHPDLOFOLHQW
,0$3
,QWHUQHW0HVVDJH$FFHVV3URWRFRO
LVXVHGE\ZHEEDVHG
PDLOVHUYLFHVVXFKDV+RWPDLO<DKRRDQG*PDLO7KLV
SURWRFRODOORZVDZHEEURZVHUWRUHDGPHVVDJHVWKDWDUH
VWRUHGRQWKHPDLOVHUYHU
Another protocol that’s used with email
Protocol
Description
0,0(
7KH
0XOWLSXUSRVH,QWHUQHW0HVVDJH([WHQVLRQ
W\SH
RU
0,0(
W\SHVSHFLILHVWKHW\SHRIFRQWHQWWKDWFDQ
EHVHQWDVDPHVVDJHRUDWWDFKPHQW
The JAR files for the JavaMail API
File
Description
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
PDLOMDU
&RQWDLQVWKH-DYDFODVVHVIRUWKH-DYD0DLO$3,
DFWLYDWLRQMDU
&RQWDLQVWKH-DYDFODVVHVIRUWKH-DYD%HDQ$FWLYDWLRQ
)UDPHZRUN7KHVHFODVVHVDUHQHFHVVDU\IRUWKH
-DYD0DLO$3,WRUXQ
How to install the JavaMail API
•
/RFDWHWKHGRZQORDGSDJHIRUWKH-DYD0DLO$3,RQWKH-DYDZHE
VLWHZZZMDYDVXQFRP
•
&OLFNRQWKH'RZQORDGEXWWRQDQGIROORZWKHLQVWUXFWLRQV
•
6DYHWKH]LSILOHIRUWKH-DYD0DLO$3,WR\RXUKDUGGLVN7KLVILOH
LVW\SLFDOO\QDPHGVRPHWKLQJOLNHMDYDPDLOB]LS
•
([WUDFWWKHILOHVIURPWKH]LSILOH
•
&RS\WKHPDLOMDUILOHWRWKH-'.¶VMUH?OLE?H[WGLUHFWRU\
•
&RS\WKHPDLOMDUILOHWRWKH-'.¶VMUH?OLE?H[WGLUHFWRU\
How to install the JavaBeans Activation
Framework API
•
/RFDWHWKHGRZQORDGSDJHIRUWKH-DYD%HDQV$FWLYDWLRQ
)UDPHZRUN$3,RQWKH-DYDZHEVLWHZZZMDYDVXQFRP
•
&OLFNRQWKH'RZQORDGEXWWRQDQGIROORZWKHLQVWUXFWLRQV
•
6DYHWKH]LSILOHIRUWKH-DYD0DLO$3,WR\RXUKDUGGLVN7KLVILOH
LVW\SLFDOO\QDPHGVRPHWKLQJOLNHMDIB]LS
•
([WUDFWWKHILOHVIURPWKH]LSILOH
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
•
([WUDFWWKHILOHVIURPWKH]LSILOH
•
&RS\WKHDFWLYDWLRQMDUILOHWRWKH-'.¶VMUH?OLE?H[WGLUHFWRU\
Three packages for sending email
Package
Description
MDYDXWLO
&RQWDLQVWKH3URSHUWLHVFODVVWKDW¶VXVHGWRVHW
WKHSURSHUWLHVIRUWKHHPDLOVHVVLRQ
MDYD[PDLO
&RQWDLQVWKH6HVVLRQ0HVVDJH$GGUHVV
7UDQVSRUWDQG0HVVDJLQJ([FHSWLRQFODVVHV
QHHGHGWRVHQGDPHVVDJH
MDYD[PDLOLQWHUQHW
&RQWDLQVWKH0LPH0HVVDJHDQG
MDYD[PDLOLQWHUQHW
&RQWDLQVWKH0LPH0HVVDJHDQG
,QWHUQHW$GGUHVVFODVVHVQHHGHGWRVHQGDQHPDLO
PHVVDJHDFURVVWKH,QWHUQHW
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);
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
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);
Code that uses the JavaMail API (cont.)
// 4 - send the message Transport.send(message); } catch (MessagingException e) { log(e.toString()); }
Common properties that can be set for a Session
object
Property
Description
PDLOWUDQVSRUWSURWRFRO 6SHFLILHVWKHSURWRFROWKDW¶VXVHGIRUWKH
VHVVLRQ)RUVHQGLQJHPDLOWKHSURWRFROLV
XVXDOO\VPWSRUVPWSV
PDLOVPWSKRVW
6SHFLILHVWKHKRVWFRPSXWHUIRUWKH6073
VHUYHU
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
VHUYHU
PDLOVPWSSRUW
6SHFLILHVWKHSRUWWKDWWKH6073VHUYHULV
XVLQJ
PDLOVPWSDXWK
6SHFLILHVZKHWKHUDXWKHQWLFDWLRQLVUHTXLUHG
WRORJLQWRWKH6073VHUYHU
PDLOVPWSTXLWZDLW
7KLVSURSHUW\FDQEHVHWWRIDOVHWRSUHYHQWDQ
66/([FHSWLRQIURPRFFXUULQJZKHQ\RX
DWWHPSWWRFRQQHFWWRD*0DLO6073VHUYHU
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);
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);
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
How to create a mail session
•
$6HVVLRQREMHFWFRQWDLQVLQIRUPDWLRQDERXWWKH
PDLOVHVVLRQ
VXFK
DVWKHSURFRWROWKHKRVWWKHSRUWDQGVRRQ7KLVLVQ¶WWKHVDPH
DVWKH+WWS6HVVLRQREMHFW
•
7RVHWWKHSURSHUWLHVRID3URSHUWLHVREMHFW\RXFDQXVHWKHSXW
PHWKRGWRVSHFLI\DSURSHUW\QDPHDQGYDOXHIRUHDFKSURSHUW\
•
7KHVWDWLFJHW'HIDXOW,QVWDQFHPHWKRGRIWKH6HVVLRQFODVVUHWXUQV
WKHGHIDXOW6HVVLRQREMHFWIRUWKHDSSOLFDWLRQ
•
7KHVHW'HEXJPHWKRGRIWKH6HVVLRQREMHFWFDQEHXVHGWRSULQW
GHEXJJLQJLQIRUPDWLRQDERXWWKHVHVVLRQWRDORJILOH
•
,I\RXFKDQJHWKHSURSHUWLHVIRUD6HVVLRQREMHFW\RXPXVWUHVWDUW
7RPFDWEHIRUHWKHFKDQJHVWDNHHIIHFW
•
,IWKH-DYDDSSOLFDWLRQLVUXQQLQJRQWKHVDPHFRPSXWHUDVWKH
6073VHUYHU\RXFDQXVXDOO\XVHWKHORFDOKRVWNH\ZRUGWR
VSHFLI\WKH6073KRVW
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
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
How to set the body of an HTML message
message.setContent(
"<H1>Thanks for your order!</H1>", "text/html");
How to create a message
•
<RXFDQXVHWKH0LPH0HVVDJHFODVVWKDW¶VVWRUHGLQWKH
MDYD[PDLOLQWHUQHWSDFNDJHWRFUHDWHDPHVVDJH7KLVPHVVDJH
H[WHQGVWKH0HVVDJHFODVVWKDW¶VVWRUHGLQWKHMDYDPDLOSDFNDJH
•
7RFUHDWHD0LPH0HVVDJHREMHFW\RXVXSSO\DYDOLG6HVVLRQ
REMHFWWRWKH0LPH0HVVDJHFRQVWUXFWRU
•
2QFH\RX¶YHFUHDWHGD0LPH0HVVDJHREMHFW\RXFDQXVHWKH
VHW6XEMHFWDQGVHW7H[WPHWKRGVWRVHWWKHVXEMHFWOLQHDQGERG\RI
WKHHPDLOPHVVDJH7KLVDXWRPDWLFDOO\VHWVWKH0,0(W\SHWR
WKHHPDLOPHVVDJH7KLVDXWRPDWLFDOO\VHWVWKH0,0(W\SHWR
WH[WSODLQ
•
<RXFDQXVHWKHVHW&RQWHQWPHWKRGWRLQFOXGHDQ+70/
GRFXPHQWDVWKHERG\RIWKHPHVVDJH7RGRWKDWWKHILUVW
DUJXPHQWVSHFLILHVDVWULQJIRUWKH+70/GRFXPHQWDQGWKH
VHFRQGDUJXPHQWVSHFLILHVWH[WKWPODVWKH0,0(W\SH
•
$OORIWKHVHPHWKRGVWKURZDMDYD[PDLO0HVVDJLQJ([FHSWLRQ
How to set the From address
Address fromAddress = new
InternetAddress("cds@murach.com"); message.setFrom(fromAddress);
How to set the To address
Address toAddress =
new InternetAddress("andi@yahoo.com"); message.setRecipient(
Message.RecipientType.TO, toAddress);
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
How to set the CC address
Address ccAddress = new InternetAddress("ted@yahoo.com"); message.setRecipient(
Message.RecipientType.CC, ccAddress);
How to set the BCC address
Address bccAddress =
new InternetAddress("jsmith@gmail.com"); message.setRecipient(
Message.RecipientType.BCC, bccAddress);
How to include an email address and a name
Address toAddress = new InternetAddress( "andi@yahoo.com", "Andrea Steelman");
How to send a message to multiple recipients
Address[] mailList = { new InternetAddress("andi@hotmail.com"), new InternetAddress("joelmurach@yahoo.com"), new InternetAddress("jsmith@gmail.com") }; message.setRecipients( message.setRecipients( Message.RecipientType.TO, mailList);
How to add recipients to a message
Address toAddress =
new InternetAddress("joelmurach@yahoo.com"); message.addRecipient(
How to address a message
•
8VHWKH,QWHUQHW$GGUHVVFODVVWKDW¶VVWRUHGLQWKH
MDYD[PDLOLQWHUQHWSDFNDJH
•
7RVHWWKH)URPDGGUHVVXVHWKHVHW)URPPHWKRGRIWKH
0LPH0HVVDJHREMHFW7RVHWWKH7R&&
FDUERQFRS\
DQG%&&
EOLQGFDUERQFRS\
DGGUHVVHVXVHWKHVHW5HFLSLHQWDQG
VHW5HFLSLHQWVPHWKRGVRIWKH0LPH0HVVDJHREMHFW
•
7RLQFOXGHDQDPHIRUDQHPDLODGGUHVV\RXFDQDGGDVHFRQG
DUJXPHQWWRWKH,QWHUQHW$GGUHVVFRQVWUXFWRU+RZHYHUWKLV
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
DUJXPHQWWRWKH,QWHUQHW$GGUHVVFRQVWUXFWRU+RZHYHUWKLV
FRQVWUXFWRUWKURZVDQH[FHSWLRQRIWKH
MDYDLR8QVXSSRUWHG(QFRGLQJ([FHSWLRQW\SH
•
7RVHQGDQHPDLOPHVVDJHWRPXOWLSOHUHFLSLHQWV\RXFDQSDVVDQ
DUUD\RI$GGUHVVREMHFWVWRWKHVHW5HFLSLHQWVPHWKRG7RDGG
HPDLODGGUHVVHVWRDQ\H[LVWLQJDGGUHVVHVIRUDPHVVDJHXVHWKH
DGG5HFLSLHQWDQGDGG5HFLSLHQWVPHWKRGV
•
$OORIWKHVHPHWKRGVWKURZDMDYD[PDLO0HVVDJLQJ([FHSWLRQ
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("johnsmith@gmail.com", "sesame"); transport.sendMessage(
message, message.getAllRecipients()); message, message.getAllRecipients()); transport.close();
How to send a message
•
,IWKH6073VHUYHUGRHVQ¶WUHTXLUHDXWKHQWLFDWLRQ\RXFDQXVHWKH
VWDWLFVHQGPHWKRGRIWKH7UDQVSRUWFODVV
•
,IWKH6073VHUYHUUHTXLUHVDXWKHQWLFDWLRQ\RXFDQXVHWKHVWDWLF
JHW7UDQVSRUWPHWKRGRIWKH7UDQVSRUWFODVVWRUHWXUQD7UDQVSRUW
REMHFW7KHQ\RXFDQXVHWKHFRQQHFWPHWKRGWRVSHFLI\D
XVHUQDPHDQGSDVVZRUGWKDWFDQEHXVHGWRFRQQHFWWRWKHVHUYHU
WKHVHQG0HVVDJHPHWKRGWRVHQGWKHPHVVDJHDQGWKHFORVH
PHWKRGWRFORVHWKHFRQQHFWLRQ
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
PHWKRGWRFORVHWKHFRQQHFWLRQ
•
,IWKH6073KRVWLVLQFRUUHFWLQWKHVHVVLRQREMHFWRULIDPHVVDJH
FDQ¶WEHVHQWWKHVHQGPHWKRGZLOOWKURZD6HQG)DLOHG([FHSWLRQ
REMHFW<RXFDQXVHWKLVREMHFWWRUHWXUQLQYDOLGDGGUHVVHVYDOLG
DGGUHVVHVWKDWKDYHEHHQVHQWDQGYDOLGDGGUHVVHVWKDWKDYHQ¶W
EHHQVHQW
•
7KH6HQG)DLOHG([FHSWLRQFODVVLQKHULWVWKH0HVVDJLQJ([FHSWLRQ
FODVV
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, 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);
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
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
// 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); }
}
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
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);
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
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);
A servlet that sends an email (cont.)
// send email to user String to = emailAddress;
String from = "email_list@murach.com";
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); }
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);
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
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"); }
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);
} }
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,
0XUDFK¶V-DYD6HUYOHWV-63QG(G& 0LNH0XUDFK $VVRFLDWHV,QF 6OLGH
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);
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(
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(); } }