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

本篇介绍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

你可能感兴趣的:(Servlet&JSP的那些事儿(二十六))