Java Training

advertisement
Java Training
Introduction to Java Mail
Written by Jeff Smith
What is JavaMail? -1

JavaMail is an API for sending and receiving email using
Java. The current version is 1.3.1 and can be downloaded
from Sun's website at:
http://java.sun.com/products/javamail/

Possible uses:
 Send email from web pages using servlets
 Create a GUI email client
 Send email from Java stored procedures
 Send email from any type of Java application
 Spam your friends and enemies! (read email addresses
from a database, write a for () loop, and away the emails
go!)
What is JavaMail? -2

To send JavaMail, you'll need to add at least two JAR files
from Sun to your classpath (placing them in a lib directory
may be a good idea)
 activation.jar
 mail.jar
(Note: You can download these files from the Java Zone)


For more complex emailing tasks (like receiving or
managing pop3 or imap mail servers), you'll need to
download additional files like pop3.jar and imap.jar.
You will also need access to a mail server and possibly a
username/password for that mail server
How Does Email Work?


In general, each internet domain has an email server.
When you send out an email
 Your email client program sends the message to your
email server
 Your email server contacts the addressee's email server
using the SMTP (simple mail transfer protocol)
 Your email server verifies that the addressee's user
name is valid
 Your email server then transfers the email to the
addressee's email server
 When the addressee logs into his email server (using his
email client program), he gets his email
Mail Servers (sendmail)-1

sendmail is the most commonly used mail server in the
world, as it generally comes free with Unix and Linux
installations
 very powerful and flexible. Supports POP3 and IMAP
 well documented (lots of books on setting up sendmail)
 long track record (first version appeared in early '80s)
 tedious to set up (lots of cryptic configuration files)
 free
 www.sendmail.org
Mail Servers (qmail)-2

qmail is probably the most popular alternative to sendmail
in the UNIX world
 perhaps more secure than sendmail (at least older
versions of sendmail)
 Easier to set up and administer than sendmail
 pretty good documentation (several books written on
qmail in the past few years)
 free
 http://www.qmail.org/top.html
Mail Servers (MS Exchange)-2

MS Exchange is widely used in the Windows world,
especially in corporate environments that use MS Office
(and hence MS Outlook)
 Expensive
 Integrated into MS Active Directory
 GUI administration tools are easier to learn for Windows
people

MS Outlook is a powerful and slick email program that will
work with Exchange, sendmail, or qmail. It does, however,
have a history of security vulnerabilities and some
organizations refuse to use it because of that.
POP3, IMAP, MAPI -1

Currently, the most popular protocols are
 POP3 (Post Office Protocol, version 3)
 IMAP (Internet Message Access Protocol)
 MAPI (Messaging Application Programming Interface-Microsoft Windows email interface)
POP3

POP3 is the oldest and most widely used. It was designed
to support offline mail processing.
 Mail is delivered to a server and a user's computer runs
a mail client program to download any new mail
 Once messages are delivered, they are generally
deleted from the mail server
 This minimizes disk space requirements for mail server,
but ties the mail to a particular machine. If user goes to
another computer, he can't access his mail
 POP3 has limited support for reading mail online (and
leaving the mail on the mail server)
 Simpler protocol than IMAP makes it easier to
implement. More POP3 mail clients available
IMAP

IMAP
 Developed at University of Washington
 Primarily used to access mail and leave it on the mail
server. This allows users to access their mail from any
computer
 Requires more disk space to store email messages
 Can work in "offline" mode like POP3
 Easy to manage multiple mailboxes
 Supports tagging emails with flags like "read", "deleted",
"answered", etc.
MAPI

MAPI
 Set of C functions (API) developed by Microsoft and
supported in MS Exchange/Outlook
 Also supported by Eudora Mail
 For more info, type the following search string in Google:
"MAPI site:msdn.microsoft.com"
Apache James Mail Server




Apache has a free mail server called James
Supports POP3, SMTP, and NNTP
Download the binary file
 .ZIP version (for Windows)
 .TAR version (for Linux)
Uncompress it and then run “run.bat” (Windows) or “run.sh”
(Linux) to start the mail server
Download from here:
http://james.apache.org/download.cgi
NOAA Mail Server
You can use ESRL/NOAA’s email server
email.boulder.noaa.gov

mailProperties.setProperty("mail.smtp.host","email.boulder.noaa.gov");


This will work IF you send emails to @noaa.gov email
addresses (like jeff.s.smith@noaa.gov)
When I tried to send an email to jeffssmith1@yahoo.com I got
this error message
Invalid Address
Relaying not allowed: jeffssmith1@yahoo.com
Using JavaMail -1


Once you have a mail server you can use (either James or
another mail server), you can send emails through it by
using JavaMail
In general, to send a plain text email using JavaMail, you do
the following:
 Get a mail session instance
 Create a MimeMessage object (passing in the mail
session instance into the constructor)
 Set the MimeMessage object's properties (like the
toAddress, fromAddress, message, etc.)
 Send the message
Getting a Mail Session



Get a mail session for the James mail server. If James is
running on your own computer, your mail.smtp.host is
localhost.
If your mail server is a remote computer, it might be
something like “mailgate.fsl.noaa.gov”
Get a mail session for the James mail server
private Session getMailSession() throws Exception
{
Properties mailProperties = new Properties();
mailProperties.setProperty("mail.transport.protocol",
"smtp");
mailProperties.setProperty("mail.smtp.host",
"localhost");
return Session.getInstance(mailProperties, null);
}
Plain Text Email Example

Next, send your email using the mail session
MimeMessage msg = new MimeMessage(getMailSession());
msg.setFrom(new InternetAddress("bill.gates@msn.com"));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("larry.ellison@oracle.com"));
msg.setSubject("RE: Oracle vs SQL Server");
msg.setText("SQL Server is better than Oracle");
Transport.send(msg);
Exceptions and imports

Your code which sends an email will need to catch the
following checked exceptions:
 Exception
 MessagingException
 AddressException

You should import the following packages:
import javax.mail.*;
import javax.mail.internet.*;
HTML Email

You can also send HTML email with JavaMail. HTML email
can be used to

Use different size fonts

imbed images into your email

Use different colored text, bold, italic, etc.
HTML Email

With HTML email,
 you set the mime message content type to "text/html"
 call the setContent() method to set your html content
 It helps to know a little HTML!
Mail Security



Virtually all mail servers require a username and password
to receive email
Some mail servers require a username and password to
send an email (by default, James does not).
 This prevents spammers from hijacking the mail server
to send unauthorized email
JavaMail supports this username/password authorization
and authentication
 To implement this, you get a transport object from the
mail session and call the connect() method with the mail
host, username, and password
 See next slide for code example
HTML Email Example

Example of sending html message with an imbedded image
using username/password authorization
MimeMessage msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress("bill@msn.com"));
msg.addRecipient(Message.RecipientType.TO, new
InternetAddress(“tom@msn.com"));
msg.setSubject(subject);
String html = "<html><body><b>MY SPAM</b><br><img
src='http://www.wrfportal.org/images/NOAA_logo.jpg'>
</body></html>";
msg.setContent(html, "text/html");
Transport transport = mailSession.getTransport("smtp");
transport.connect("localhost","user", "passwd");
msg.saveChanges();
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
Email attachments -1


To append an email attachment, you need to send a
"multipart" message
 Create your MimeMessage object as usual, setting the
from address, to address, subject, etc...
 Create a MimeBodyPart object for your main message
and set its text (or content) to be your message
 Create a MimeMultiPart object for your attachment and
call its setContent() method to attach your file
 Create a Multipart object and add both body parts to it.
 Call your MimeMessage's setContent() method, passing
in your Multipart object
 Call Transport.send() to send the message
Whew!!!
Email attachment Example-1
MimeMessage msg = new MimeMessage(getMailSession());
msg.setFrom(new InternetAddress("bill.gates@msn.com"));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("larry.ellison@oracle.com"));
msg.setSubject("RE: Oracle vs SQL Server");
//Create the main message (body) part
MimeBodyPart mainBodyPart = new MimeBodyPart();
mainBodyPart.setText("Here is my message");
Email attachment Example-2
//Create attachment body part
MimeBodyPart attachBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource("1.jpg");
attachBodyPart.setDataHandler(new DataHandler(source));
attachBodyPart.setFileName("1.jpg");
//Now create the multipart and add the parts
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(mainBodyPart);
multipart.addBodyPart(attachBodyPart);
//add the multipart to the original Mime message
msg.setContent(multipart);
Transport.send(msg);
Exercise -1




Write a program in package gov.noaa.email that reads a list of email
recipients from a disk file and then sends them each an email message.
Use your NOAA webmail account to test this (or you can use our Yahoo
email account)
You'll need to:

Create a file and populate it with a list of email addresses (use your
own email address or someone else in the class)

Send a single email to all the recipients you read from the db table.

If you are feeling ambitious, you can send an HTML email message.

Use an email client (NOAA webmail?) to verify message delivery
Extra credit: send an email attachment and write an Ant script for your
project
JavaMail Summary



JavaMail is powerful with good support for things like HTML
and attachments
But adding an attachment isn't as simple as it should be. A
nice framework (or helper class) would be useful to simplify
JavaMail code
JavaMail also supports
 receiving email
 administering mail servers
For an article on receiving email via JavaMail, see:
http://www.javaworld.com/javaworld/jw-10-2001/jw-1026javamail-p2.html
Download