一、JavaMail简介

JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。

JavaMail包中用于处理电子邮件的核心类是:Session,Message,Address,Authenticator,Store,Transport, Folder等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。不过JDK中并没有包含,使用JavaMail发送邮件需要使用Sun发布的mail.jar和activtion.jar两个包。

二、javaMail常用类

1、Properties

由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail通过Properties对象封装这些属性西信息。如下面的代码封装了两个属性信息:

  

Properties props = new Properties();
    props.put("mail.smtp.host","smtp.sina.com.cn");
    props.put("mail.smtp.auth","true");

针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,下表是针对SMTP协议的一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):

属性名

属性类型

说明

mail.stmp.host

String

SMTP服务器地址,如smtp.sina.com.cn

mail.stmp.port

int

SMTP服务器端口号,默认为25

mail.stmp.auth

boolean

SMTP服务器是否需要用户认证,默认为false

mail.stmp.user

String

SMTP默认的登陆用户名

mail.stmp.from

String

默认的邮件发送源地址

mail.stmp.socketFactory.class

String

socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.net.SocketFactory接口

mail.stmp.socketFactory.port

int

指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号

mail.smtp.socketFactory.fallback

boolean

设置为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为true

mail.stmp.timeout

int

I/O连接超时时间,单位为毫秒,默认为永不超时

其他几个协议也有类似的一系列属性,如POP3的mail.pop3.host、mail.pop3.port以及IMAP的mail.imap.host、mail.imap.port等。

2、Session

Javax.mail.Session:Session类定义了一个基本邮件会话(session),是Java Mail API最高层入口类。所有其它类都是经由这个session才得以生效。Session对象用Java.util.Properties对象获取信息,如邮件服务器、用户名、密码及整个应用程序中共享的其它信息。

Session是一个很容易被误解的类,这归咎于混淆视听的类名。千万不要以为这里的Session像HttpSession一样代表真实的交互会话,但创建Session对象时,并没有对应的物理连接,它只不过是一对配置信息的集合。Session的主要作用包括两个方面:

1.接收各种配置属性信息:通过Properties对象设置的属性信息;

2.初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。

所以,如果把Session更名为Configure也许更容易理解一些。

Session 通过 JavaMail 配置文件以及程序中设置的 Properties 对象构建一个邮件处理环境,后续的处理将在 Session 基础上进行。 Session 拥有多个静态工厂方法用于创建 Session 实例。

这个Session类代表JavaMail中的一个邮件session。每一个基于JavaMail的应用程序至少有一个session但是可以有任意多的session。Session对象需要知道用来处理邮件的SMTP服务器。

Session 是 JavaMail 提供者配置文件以及设置属性信息的 “ 容器 ” , Session 本身不会和邮件服务器进行任何的通信。所以在一般情况下,我们仅需要通过 getDefaultInstance() 获取一个共享的 Session 实例就可以了,下面的代码创建了一个 Session 实例:

Session sendMailSession; 
         sendMailSession =Session.getInstance(props, null);

3、Message、MimeMessage

Javax.mail.Message、javax.mail.MimeMessage:一旦获得Session对象,就可以继续创建要发送的消息。这由Message类来完成。因为Message是个抽象类,必需用一个子类,多数情况下为Javax.mail.internet.MimeMessage。MimeMessage是个能理解MIME类型和头的电子邮件消息,正如不同RFC中所定义的。虽然在某些头部域非ASCII字符也能被译码,但Message头只能被限制为用US-ASCII 字符。

Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。

Message newMessage = newMimeMessage(sendMailSession);

4、Transport-----邮件操作只有发送或接收两种处理方式,JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store)

Javax.mail.Transport:消息发送的最后一部分是使用Transport类。这个类用协议指定的语言发送消息(通常是SMTP)。它是抽象类,它的工作方式与Session有些类似。仅调用静态send() 方法,就能使用类的缺省版本:Transport.send(message)。或者,读者也可以从针对自己的协议的会话中获得一个特定的实例,传递用户名和密码(如果不必要就不传),发送消息,然后关闭连接。

邮件是既可以被发送也可以被接收到。JavaMail使用了两个不同的类来完成这两个功能:Transport和Store。Transport是用来发送信息的,而Store用来收信。

Transport transport;
        transport =sendMailSession.getTransport(smtp);

用JavaMail Session对象的getTransport方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如smtp。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。

注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和POP3。

5、Store
Javax.mail.Store:Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。

Store store=s.getSorte(pop3);
 store.connect(popserver,username,password);



6、Folder
Javax.mail.Folder:Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。

Folder folder=store.getFolder(INBOX);
 folder.open(Folder.READ_ONLY);


7、Address、InternetAddress
Javax.mail.Address、Javax.mail.internet.InternetAddress:一旦您创建了Session 和Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样,Address也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类。

一旦创建了 address(地址),将它们与消息连接的方法有两种。如果要识别发件人,您可以用 setFrom() 和 setReplyTo() 方法。

message.setFrom(address)

需要消息显示多个 from 地址,可以使用 addFrom() 方法:

Address address[] = ...;

message.addFrom(address);

若要识别消息recipient(收件人),您可以使用addRecipient() 方法。除 address(地址)外,这一方法还请求一个 Message.RecipientType。

message.addRecipient(type, address)

三种预定义的地址类型是:

Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC

8、Authenticator

Javax.mail. Authenticator:与 Java.net 类一样,JavaMailAPI 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于JavaMail API来说,这些资源就是邮件服务器。JavaMail Authenticator在Javax.mail包中,而且它和Java.net中同名的类Authenticator不同。两者并不共享同一个Authenticator,因为JavaMail API 用于Java 1.1,它没有Java.net 类别。

要使用 Authenticator,先创建一个抽象类的子类,并从getPasswordAuthentication() 方法中返回PasswordAuthentication 实例。创建完成后,您必需向session 注册Authenticator。然后,在需要认证的时候,就会通知Authenticator。您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为PasswordAuthentication 对象返回给调用程序。

9、Multipart、MimeMultpart

javax.mail.Multipart、javax.mail.Internet.MimeMultpart:一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法。由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象。

MimeMultipart multipart=new MimeMultipart();

注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart对象。消息可以有很多部分,一个BodyPart可以代表一个部分。

10、BodyPart、MimeBodyPart

javax.mail.BodyPart、javax.mail.Internet.MimeBodyPart:MimeBodyPart是BodyPart具体用于mimeMessage的一个子类。MimeBodyPart对象代表一个MimeMessage对象内容的一部分。每个MimeBodyPart被认为有两部分:MIME类型和匹配这个类型的内容

 三、实例应用

MimeBodyPart mdp=new MimeBodyPart(); 
 String text=Hello JavaMail!; 
 mdp.setContent(text,text/plain); 
 //定义MIME类型为text/plain,并设置MimeBodyPart的内容

1、通过SMTP发送一封普通邮件



package com.test; 
 import java.util.Date; 
 import java.util.Properties; 
 import javax.mail.Message; 
 import javax.mail.Multipart; 
 import javax.mail.Session; 
 import javax.mail.Transport; 
 import javax.mail.internet.InternetAddress; 
 import javax.mail.internet.MimeBodyPart; 
 import javax.mail.internet.MimeMessage; 
 import javax.mail.internet.MimeMultipart; 
 public class SimpleSender { 
     public static voidmain(String args[]) { 
        try { 
           String smtpServer = 192.168.1.254; 
           String to =  jizhou@xxxx.com ; 
           String from =  lijy@xxxx.com ; 
           String subject =  test mail ; 
           String body =  test mail ; 
     StringmsgAttachment =  This is an attachment string! ; 
           send(smtpServer, to, from, subject, body,msgAttachment);          
 }catch (Exception ex) { 
           System.out.println(ex.toString()); 
        } 
     } 
     // 发送一封简单的邮件 
     public static voidsend(String smtpServer, String to, String from, 
      String subject, String body) { 
        try { 
           Properties props = System.getProperties();//属性封装 
           props.put( mail.smtp.host , smtpServer); 
           Session session = Session.getDefaultInstance(props, null);//建立会话 
           Message msg = new MimeMessage(session);//生成消息体
           msg.setFrom(new InternetAddress(from)); // 发件人地址 
           InternetAddress[] address = { new InternetAddress(to) }; 
           msg.setRecipients(Message.RecipientType.TO, address);  // 收件人地址,可以是一个或多个。 
           msg.setSubject(subject);// 邮件主题 
           msg.setSentDate(new Date());// 发送时间 
           msg.setText(body);  // 邮件正文的内容 
         msg.setHeader( X-Mailer ,  LOTONtechEmail ); 
          Transport.send(msg);//利用消息发送message 
           System.out.println( Message sent OK. ); 
        } catch(Exception ex) { 
           ex.printStackTrace(); 
        } 
     } 
     // 发送一封带有附件的邮件 
     public static voidsend(String smtpServer, String to, String from, 
           String subject, String body, String msgAttachment) { 
        try { 
           Properties props = System.getProperties(); 
           props.put( mail.smtp.host , smtpServer);
           Session session = Session.getDefaultInstance(props, null); 
           Message msg = new MimeMessage(session); 
           msg.setFrom(new InternetAddress(from)); 
           InternetAddress[] address = { new InternetAddress(to) }; 
           msg.setRecipients(Message.RecipientType.TO, address); 
          msg.setSubject(subject); 
           msg.setSentDate(new Date()); 
           msg.setHeader( X-Mailer ,  LOTONtechEmail ); 
           MimeBodyPart mbp1 = new MimeBodyPart(); 
           mbp1.setText(body); 
           // 把前面定义的msgText中的文字设定为邮件正文的内容 
           MimeBodyPart mbp2 = new MimeBodyPart(); 
           mbp2.setText(msgAttachment,  utf-8 ); 
           // 创建附件部分 
           Multipart mp = new MimeMultipart(); 
           // 创建Multipart
           mp.addBodyPart(mbp1); 
           mp.addBodyPart(mbp2); 
           // 把前面定义的正文和附件都添加到Multipart中 
           msg.setContent(mp); 
           // 添加 Multipart到Message中 
           Transport.send(msg); 
           System.out.println( Message sent OK. ); 
        } catch(Exception ex) { 
           ex.printStackTrace(); 
        } 
     } 
}