Title: Java Training Introduction to Java Mail
1Java TrainingIntroduction to Java Mail
2What 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!)
3What 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
4How 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
5Mail 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
6Mail 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
7Mail 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.
8POP3, 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)
9POP3
- 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
10IMAP
- 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.
11MAPI
- 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 sitemsdn.microsoft.com"
12Apache 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
13NOAA Mail Server
- You can use ESRL/NOAAs email server
- email.boulder.noaa.gov
- mailProperties.setProperty("mail.smtp.host","email
.boulder.noaa.gov") - This will work IF you send emails to _at_noaa.gov
email addresses (like jeff.s.smith_at_noaa.gov) - When I tried to send an email to
jeffssmith1_at_yahoo.com I got this error message - Invalid Address
- Relaying not allowed jeffssmith1_at_yahoo.com
14Using 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
15Getting 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.proto
col", - "smtp")
- mailProperties.setProperty("mail.smtp.host",
- "localhost")
- return Session.getInstance(mailProperties,
null)
16Plain Text Email Example
- Next, send your email using the mail session
- MimeMessage msg new MimeMessage(getMailSession()
) - msg.setFrom(new InternetAddress("bill.gates_at_msn.co
m")) - msg.addRecipient(Message.RecipientType.TO,
- new InternetAddress("larry.ellison_at_oracle.co
m")) - msg.setSubject("RE Oracle vs SQL Server")
- msg.setText("SQL Server is better than Oracle")
- Transport.send(msg)
17Exceptions 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.
18HTML 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.
19HTML 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!
20Mail 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
21HTML 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_at_msn.com"))
- msg.addRecipient(Message.RecipientType.TO, new
- InternetAddress(tom_at_msn.com"))
- msg.setSubject(subject)
- String html "MY SPAM
- src'http//www.wrfportal.org/images/NOAA_logo.
jpg' - "
- msg.setContent(html, "text/html")
- Transport transport mailSession.getTransport("sm
tp") - transport.connect("localhost","user", "passwd")
- msg.saveChanges()
- transport.sendMessage(msg, msg.getAllRecipients())
- transport.close()
22Email 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!!!
23Email attachment Example-1
MimeMessage msg new MimeMessage(getMailSession()
) msg.setFrom(new InternetAddress("bill.gates_at_msn
.com")) msg.addRecipient(Message.RecipientType.TO
, new InternetAddress("larry.ellison_at_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")
24Email attachment Example-2
//Create attachment body part MimeBodyPart
attachBodyPart new MimeBodyPart() DataSource
source new FileDataSource("1.jpg") attachBodyPa
rt.setDataHandler(new DataHandler(source)) attach
BodyPart.setFileName("1.jpg") //Now create the
multipart and add the parts Multipart multipart
new MimeMultipart() multipart.addBodyPart(mainBod
yPart) multipart.addBodyPart(attachBodyPart) /
/add the multipart to the original Mime
message msg.setContent(multipart) Transport.send
(msg)
25Exercise -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
26JavaMail 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-1
026-javamail-p2.html