Title: Java Mail API
1Java Mail API
- Sending and Receiving Emails
2Mail API
- Java Mail API is an easy and standard way of
sending and receiving emails - Java Mail API supports following Protocols
- SMTP
- POP
- IMAP
- MIME
3SMTP
- Simple Mail Transfer Protocol
- Usually used for sending emails from clients
- Also used for relaying emails from one server to
another
4SMTP
5POP
- Post office protocol
- Currently Version 3 in use (Pop3 RFC1939)
- Used at client side to check the emails that are
received in the mailbox for a user
6IMAP
- Stands for Internet Message Access Protocol
- Currently IMAP4 (RFC2060) in use
- More advanced protocol for email access that
allows multiple folder management on server,
periodic backups and several other advanced
features.
7MIME
- Multi-purpose Internet Mail Extention
- Defines the contents that are to be transferred
in an email
8What do you need to use Java Mail?
- You should have following two APIs
- Java Mail API
- JavaBeans Activation Framework(JAF)
- JAF is included in JDK6
9Mail API
- As the name says, is used for sending and
receiving emails. - Mail API requires JavaBeans Activation Framework
10JAF
- JavaBeans Activation Framework
- Helps programmers to Determine the type of an
arbitrary piece of data - Encapsulates access to it
- Discovers operations that can be performed on it
11Where to get?
- Both APIs can be downloaded from
http//java.sun.com - Also placed on \\shares\teachers\basit\shared
docs\aip\APIs
12How to Install?
- Un-zip the javamail.zip and jaf.zip into some
folder - Put mail.jar from javamail folder to the
classpath - Put activation.jar from jaf folder to classpath
13Java Mail classes
- You must know following classes before you start
- Session
- Message
- Address
- Transport
- Store
- Folder
14javax.mail.Session
- Defines a basic mail session
- Everything in mail api works due to this session
15javax.mail.Message
- Represents an email message that is either
created to be sent to the recipient or is
received from someone. - Message is an Abstract class
- MimeMessage is the sub-class of message that
understands most MIME types and is most commonly
used for email handling
16javax.mail.Address
- Represents an email addres
- Address is an abstract class
- javax.mail.Internet.InternetAddress is the
sub-class of Address
17Message Representation
18Transport
- This class speaks the protocol specific language
to send messages. (Usually SMTP)
19Store and Folder
- When receiving email
- We create a session
- Connect to a store with our username and password
- Get specific folders (usually inbox)
- And start receiving Message objects
20Sending an Email
- //Create properties object
- Properties p System.getProperties()
- p.put("mail.smtp.host", "202.125.140.71")
- // Get session
- Session s Session.getDefaultInstance(p,null)
-
21Sending an Email (cont)
- Message m new MimeMessage(s)
-
- InternetAddress to new InternetAddress("basit_at_uc
p.edu.pk") - InternetAddress from new InternetAddress("bill_g
ates_at_microsoft.com", "Bill Gates") -
- m.setContent("yeah this is the body",
"text/plain") - m.setFrom(from)
- m.setRecipient(Message.RecipientType.TO, to)
- m.setSubject("de subject")
-
- Transport.send(m)
22Checking Mails
- Properties props new Properties()
- Session session Session.getDefaultInstance(props
, null) - Store store session.getStore("pop3")
- store.connect(host, username, password)
- Folder folder store.getFolder("INBOX")
- folder.open(Folder.READ_ONLY)
23Checking Mails(cont)
- Message message folder.getMessages()
- for (int i0, nmessage.length iltn i)
- System.out.println(i " "
messagei.getFrom()0 "\t\t"
messagei.getSubject()) -
- folder.close(false)
- store.close()
24Output
- 0 Syed Basit ltbasit_at_ucp.edu.pkgt test 1
- 1 basit_at_cnn.com de subject
- 2 basit_at_microsoft.com de subject
- 3 basit_at_dell.com de subject
- 4 basit_at_hell.com de subject
- 5 Bill Gates ltbill_gates_at_microsoft.comgt de
subject
25Lets Try it out!!!
- Send email using Gmail SMTP server
- Set Mail content type (text/plain)
26HTML 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.
27HTML 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!
28Mail 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
29HTML 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 "lthtmlgtltbodygtltbgtMY SPAMlt/bgtltbrgtltimg
- src'http//www.wrfportal.org/images/NOAA_logo.
jpg'gt - lt/bodygtlt/htmlgt"
- 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()
30MultiPart Representation
31javax.Activation.DataSource
- Interface that allows access to file type and to
streams that can manipulate the file - public String getContentType() returns the name
of the MIME file type - Implemented by javax.Activation.FileDataSource
- Used by JavaMail to create and retrieve e-mail
attachments - Constructors
- FileDataSource(File file)
- FileDataSource(String filename)
32javax.Activation.DataHandler
- Wrapper for DataSource objects so that the user
does not need to manipulate the bytes for each
file - Constructors
- DataHandler(DataSource ds)
- DataHandler(Object obj, String mimeType)
- Public Object getContent() Returns the data as
the object that represents its content type (ie
runing this method on a text message returns a
String)
33javax.mail.Part Revisited
- Allows manipulation of DataHandlers
- public void setDataHandler(DataHandler dh)
- public DataHandler getDataHandler()
- Other methods abstract user away from need to
directly manipulate DataHandler - public void setContent(Object object, String
contentType) - public Object getContent()
34javax.mail.MimeBodyPart
- Implements the Part interface (indirectly through
a few abstract classes) - Contains the content for a single part of an
e-mail message - Uses several methods to manipulate content
directly or through DataHandler or streams - Key Methods
- public void setText(String text) for text/plain
content, makes a String into the message content - public void setDataHandler(DataHandler dh) sets
the content using a DataHandler (which may be
text or any other permitted content) - public void setFileName(String filename) sets the
filename associated with the content, if the
content represents a file
35Javax.mail.Multipart
- Container that holds multiple parts
- Each part is indexed, starting with 0
- A Multipart object may be a part within another
Multipart object - Key Methods
- public void addBodyPart(BodyPart part)
- public void addBodyPart(BodyPart part, int index)
- public int getCount() returns the number of
BodyPart objects
36Email 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 MimeBodyPart 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!!!
37Email 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
for text MimeBodyPart mainBodyPart new
MimeBodyPart() mainBodyPart.setText("Here is my
message")
38Email 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)