400 likes | 709 Views
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:
E N D
Java TrainingIntroduction 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 sizefonts • 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