本篇介绍jsp与javamail。由于越来越多的java web应用需要集成电子邮件功能,javamail组件完美的解决了这个问题。
电子邮件的工作原理
电子邮件的工作过程遵循客户-服务器模式。每份电子邮件的发送都涉及发送方和接收方。发送方充当客户端,接收方充当服务器。服务器中含有很多用户的电子邮箱。发送方通过邮件客户程序,将编辑好的电子邮件向SMTP服务器发送。SMTP服务器识别接收者的地址,向管理该地址的POP3服务器发送消息。邮件服务器将消息存放在接收者电子邮箱内,并通知接收者有新邮件。接收者通过客户端登录后,就会看到提示。
相关协议
SMTP协议(简单邮件传输协议,simple mail transfer protocol)是为了保证电子邮件的可靠和高效传送。它使用25号端口进行传输。当发送者和接收者在同一个网络内时,它会将邮件直接发送给接收者。否则,需要通过一个或几个中间服务器转发。所以,它的收信方可以是最终用于或者邮件服务器。
POP3协议(邮局协议,post office protocol)用于电子邮件的接收。常用的是第三版,称为POP3。它使用110号端口。通过POP协议,用户登录到服务器后,可以对自己的邮件进行删除或下载到本地。它是一个离线协议标准。
javamail简介
javamail是sun发布的用来处理email的API,它支持各种电子邮件通信协议。要想在java web程序中使用javamail就要将javamail的mail.jar和activation.jar复制到WEB-INF/lib目录下。通过调用javamail的API即可在自己的应用程序中便捷的操作email。
javamail的核心类主要包括session,message,address,authenticator,transport,store,folder。
session类
和http会话一样,session类定义了基本的邮件会话。session利用java.util.Propertities对象获得邮件服务器,用户名,密码信息和整个应用程序都要使用到的共享信息。
message类
message对象用来存储实际发送的电子邮件信息,message对象被作为一个MimeMessage对象来创建,在创建时需要指定一个session对象做参数。创建完message对象之后,就可以为它设置一些信息。在为message对象添加内容时分两种情况,如果是文本型内容,可通过setText()方法来设置,如果消息内容中要包含html或附件,可通过setContent()方法来设置。
address类
当建立了session和message之后,需要使用地址类Address为邮件标明地址。和Message类一样,Address类是一个抽象类,javax.mail.internet.InternetAddress是Address的子类,可通过它来创建Address对象。
authenticator类
javamail API通过使用授权类(Authenticator)以用户名和密码的方式访问邮件服务器。使用Authenticator类时必须采用继承该抽象类的方式,并且该继承类必须具有返回PasswordAuthentication对象的getPasswordAuthencation()方法。
transport类
Transport类根据指定的邮件发送协议,通过指定的账号和密码连接指定的邮件发送服务器发送邮件。
store类
store代表了存储邮件的邮件服务器,可从session中获取特定类型的store,然后根据指定的账号,密码及授权连接到store。store类实现特定邮件协议上的读,写,监视,查找等操作。通过javax.mail.Store类可以访问javax.mail.Folde类。
folder类
Folder类代表了邮件夹,通过它可以访问邮件夹中的邮件。通过Store对象的getFolder()方法可以取得一个Folder对象。
例如,一个发送带附件的邮件应用代码如下:
package test;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendAttachMail {
String SMTPHost=""; //SMTP服务器
String user=""; //登录SMTP服务器的帐号
String password=""; //登录SMTP服务器的密码
String from =""; //发件人邮箱
String to =""; //收件人邮箱
String subject =""; //邮件标题
String content =""; //邮件内容
String filename =""; //附件文件名
//无参数构造方法
public SendAttachMail() {}
public String getContent() {
return content;
}
public void setContent(String content) {
try{
//解决内容的中文问题
content = new String(content.getBytes("ISO8859-1"),"gb2312");
}catch(Exception ex){
ex.printStackTrace();
}
this.content = content;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
try{
//解决文件名的中文问题
filename = new String(filename.getBytes("ISO8859-1"),"gb2312");
}catch(Exception ex){
ex.printStackTrace();
}
//将文件路径中的'\'替换成'/'
filename = filename.replaceAll("\\\\","/");
this.filename = filename;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSMTPHost() {
return SMTPHost;
}
public void setSMTPHost(String host) {
SMTPHost = host;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
try{
//解决标题的中文问题
subject = new String(subject.getBytes("ISO8859-1"),"gb2312");
}catch(Exception ex){
ex.printStackTrace();
}
this.subject = subject;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
//发送邮件
public boolean send(){
//创建一个属性对象
Properties props = new Properties();
//指定SMTP服务器
props.put("mail.smtp.host", SMTPHost);
//指定是否需要SMTP验证
props.put("mail.smtp.auth", "true");
try{
//创建一个授权验证对象
SmtpAuth auth = new SmtpAuth();
auth.setAccount(user,password);
//创建一个Session对象
Session mailSession = Session.getInstance(props,auth);
mailSession.setDebug(true);
//创建一个MimeMessage 对象
MimeMessage message=new MimeMessage(mailSession);
//指定发件人邮箱
message.setFrom(new InternetAddress(from));
//指定收件人邮箱
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
//指定邮件主题
message.setSubject(subject);
//指定邮件发送日期
message.setSentDate(new Date());
//指定邮件优先级 1:紧急 3:普通 5:缓慢
message.setHeader("X-Priority","1");
message.saveChanges();
//新建一个MimeMultipart对象用来存放多个BodyPart对象
Multipart container=new MimeMultipart();
//新建一个存放信件内容的BodyPart对象
BodyPart textBodyPart=new MimeBodyPart();
//给BodyPart对象设置内容和格式/编码方式
textBodyPart.setContent(content,"text/html;charset=gb2312");
//将含有信件内容的BodyPart加入到MimeMultipart对象中
container.addBodyPart(textBodyPart);
//新建一个存放信件附件的BodyPart对象
BodyPart fileBodyPart=new MimeBodyPart();
//将本地文件作为附件
FileDataSource fds=new FileDataSource(filename);
fileBodyPart.setDataHandler(new DataHandler(fds));
//处理邮件中附件文件名的中文问题
String attachName = fds.getName();
attachName = new String(attachName.getBytes("gb2312"),"ISO8859-1");
//设定附件文件名
fileBodyPart.setFileName(attachName);
//将附件的BodyPart对象加入到container中
container.addBodyPart(fileBodyPart);
//将container作为消息对象的内容
message.setContent(container);
//创建一个Transport对象
Transport transport = mailSession.getTransport("smtp");
//连接SMTP服务器
transport.connect(SMTPHost, user, password);
//发送邮件
transport.send(message, message.getAllRecipients());
transport.close();
return true;
}catch(Exception ex){
ex.printStackTrace();
return false;
}
}
//定义一个SMTP授权验证类
static class SmtpAuth extends Authenticator{
String user,password;
//设置帐号信息
void setAccount(String user,String password){
this.user = user;
this.password = password;
}
//取得PasswordAuthentication对象
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(user,password);
}
}
}
转载请注明出处:http://blog.csdn.net/iAm333