一、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();
}
}
}