您的位置:首页 > Web前端 > JavaScript

Servlet&JSP的那些事儿(二十六)

2012-12-24 16:17 441 查看
本篇介绍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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: