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