# Presentation: 070776

## 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

- 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

- 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-1026-javamail-p2.html