JavaMail开发<精通J2EE网络编程 12章>
用Java 开发的各种应用系统中经常要用到收发邮件的功能,JavaMail提供了丰富的API供程序员使用。本章将首先讲述JavaMail中使用的邮件协议及基 本的概念,再介绍与JavaMail开发相关的类及其常用方法,然后编写发送和接收E-mail的程序。本章中的所有实例都是利用已配置好邮件服务器的服 务来发送和接收电子邮件,而并非要在本地服务器上配置邮件服务器。12.1 JavaMail基础
12.1.1 邮件协议
在Internet中,常用的与邮件操作相关的协议有3个——SMTP、POP、IMAP。在学习JavaMail之前先学习Internet中实现邮件传输的邮件协议是学好JavaMail开发的基础,因为邮件的传送要依赖于具体的传输协议。
简单邮件传输协议(simple mail transfer protocol,SMTP)协议是邮件服务器之间相互发送邮件的协议,邮件客户机也可以使用它向服务器发送邮件。一个邮件先被传送到邮件服务器,再被邮件服务器分发到一个或多个目标邮件服务器。
邮局协议第3版(post office protocol version 3,POP3)协议用于从邮件服务器检索以得到新的邮件,目前常用的就是这个协议的第3版,大量的客户机从邮件服务器接收邮件就是使用POP3协议。
因特 网消息访问协议(internet messager access protocol,IMAP)协议比POP3功能更加强大,它可在接收邮件时,把邮件保存在邮件服务器中,既可在服务器中保留邮件也可把邮件下载下来。基 于此协议的邮件服务器需要长期保存邮件,因此需要大量的硬盘空间以储存众多用户的邮件。
12.1.2 JavaMail概述
JavaMail 对SMTP、POP3、IMAP提供了支持,封装了电子邮件功能中的邮件对象、发送功能、身份认证、接收等。然而,Weglogic 8.1中仅包含了JavaMail1.1.3,它仅支持SMTP和IMAP。如果要使用POP3,就必须安装新的JavaMail规范。本书中将使用 JavaMail API 1.3.2。
此外,几乎所有版本的JavaMail API都需要JavaBeans Activation Framework(简称JAF)来支持任意数据块的输入及相应处理。
JavaMail API用服务、传输和存储来表述邮件协议。javax.mail.Transport类用于发送邮件,其实质是一个完全功能的SMTP实现;javax.mail.Store用于从邮件服务器中检索邮件。
12.2 安装与配置JavaMail
JavaMail API 1.3.2 Release版本可从在Sun公司的网站上可以免费下载,下载地 址为:
http://java.sun.com/products/javamail/downloads/index.html
也 可以在本书提供的光盘中找到JavaMail API 1.3.2 Release的ZIP压缩包。下载后用解压缩软件解压后可得到mail.jar文件,把这个文件拷贝到想要放置类包的文件夹中。这里拷贝至D:\bea \weblogic81\server\lib中,读者可根据自己的喜好放置。不管用户把mail.jar文件放在何处,一定要在系统的 CLASSPATH中加入放置的路径(最好放在最前面,以免冲突),故此处在CLASSPATH中加入:
D:\bea\weblogic81\server\lib\mail.jar
JAF中要用到的包activation.jar在Weblogic8.1中已经存在了,不必再安装。
12.3 相关的类介绍
JavaMail包中的类比较多,重点要掌握会话类、地址类、邮件类、邮件发送类、邮件接收类和邮件文件夹类这些常用的类。
12.3.1 Session
Session(会话类),即javax.mail.Session。使用邮件功能时必须先建立邮件会话 Session类的对象。这个对象可用来创建邮件对象、实现邮件对象中数据的封装并可指定邮件服务器认证的客户端属性。Session类的常用方法如下所示。
(1)getDefaultInstance()
方法原型如下:
public static Session Session.getDefaultInstance(java.util.Properties
props)
或
public static Session Session.getDefaultInstance(java.util.Properties
props, Authenticator authenticator)
这个方法创建与具体的客户端相关的会话对象。参数Props是属性对象,继承自HashTable(哈希表),简单地说就是键和值对;参数authenticator对象是邮件认证对象。
(2)getInstance()
方法原型如下:
public static Session Session.getInstance(java.util.Properties props)
或
public static Session Session.getInstance(java.util.Properties props,
Authenticator authenticator)
此方法创建的是共享型的会话对象,调用形式与getDefaultInstance()方法类似。
(3)getProperties()
方法原型如下:
public Properties SessionObjectName.getProperties()
得到邮件会话的属性类对象。SessionObjectName是邮件会话类对象的名称。
(4)getProperty()
方法原型如下:
public String SessionObjectName.getProperty(String PropertyName)
得到邮件会话的一个特定的属性值。参数PropertyName是要得到的属性的名称,方法返回这个属性名称对应的值为String型。
(5)getStore()
方法原型如下:
public Store SessionObjectName.getStore(String Protocol)
得到邮件会话的邮件存储对象,为Store类。返回的对象可建立与邮件服务器的连接,可从邮件服务器中得到邮件。参数Protocol是使用的协议,要从邮件服务中获取邮件就要使用POP3或IMAP协议。
(6)getTransport()
方法原型如下:
public Transport SessionObjectName.getTransport(Address address)
得到一个可以传送消息到特定地址的传送对象。参数address是要传送至的目的地址对象。
12.3.2 InternetAddress
InternetAddress(地址类),即javax.mail.internet.InternetAddress。它继承自抽象类javax.mail.Address。InternetAddress类的常用方法如下所示。
(1)构造函数
方法原型如下:
public InternetAddress(String address)
构造函数用来建立InternetAddress类的对象。参数address是构造对象的E-mail地址,如dengziyun@126.com,dengziyun是笔者在126.com的邮箱用户名,@是邮件的分隔符,126.com是邮件服务器。
(2)clone()
方法原型如下:
public Object InternetAddressObjectName.clone()
方法返回InternetAddress对象的一个拷贝。InternetAddressObjectName是网络地址对象的名称,返回对象类型是InternetAddress,是一个新的与原对象相同的对象,而并非原对象的引用。
(3)getAddress()
方法原型如下:
public String InternetAddressObjectName.getAddress()
得到E-mail地址。
12.3.3 MimeMessage
MimeMessage(邮件消息类),即javax.mail.internet.MimeMessage。它继承自抽象类javax.mail.Message。MimeMessage有一个内部类Recipient类,即javax.mail.internet. MimeMessage.Recipient,表示邮件消息的接收者。这个类有一个属性to表示接收者,即接收邮件的邮箱地址。MimeMessage类常用的方法如下所示。
(1)构造函数
方法原型如下:
public MimeMessage(Session session)
构造函数可生成邮件消息类对象。参数session是邮件会话对象,是用来建立邮件消息类对象的邮件会话对象。
(2)addRecipients()
方法原型如下:
public void MimeMessageObjectName.addRecipients(RecipientType type,
String Address)
增加一个接收邮件的邮箱对象。MimeMessageObjectName是邮件消息类对象的名称,参数type是邮件接收类型,Address是增加的邮件发往地址。
(3)getAllRecipients()
方法原型如下:
public Address[] MimeMessageObjectName.getAllRecipients()
得到所有的收件箱。返回类型是一个Address对象数组。
(4)getContent()
方法原型如下:
public Object MimeMessageObjectName.getContent()
得到邮件消息内容对象。
(5)getContentType()
方法原型如下:
public String MimeMessageObjectName.getContentType()
得到表示邮件消息的内容类型的字符串。
(6)getForm()
方法原型如下:
public Address[] MimeMessageObjectName.getForm()
得到邮件消息发件邮箱数组,返回类型为Address数组。
(7)getSubject()
方法原型如下:
public String MimeMessageObjectName.getSubject()
得到邮件消息的主题。
(8)isMimeType()
方法原型如下:
public boolean MimeMessageObjectName.isMimeType(String mimeType)
判断邮件消息内容是否是指定的类型,是则返回true,否则返回false。参数mimeType是表示类型的字符串,如“text/plain”。
(9)setContent()
方法原型如下:
public void MimeMessageObjectName.setContent (Multipart mp)
设置邮件消息内容,无返回值。参数mp是可以包含多个数据内容部分的对象,其中addBodyPort(BodyPart part)可增加内容部分;Multipart则是一个抽象类,可以设置为邮件内容的一部分。
(10)setForm()
方法原型如下:
public void MimeMessageObjectName.setForm(Address address)
设置邮件的发件邮箱。参数address是发件邮箱的邮箱地址。
(11)setRecipients()
方法原型如下:
public void MimeMessageObjectName.setRecipients (RecipientType type,Address address)
设置收件邮箱地址,无返回值。
(12)setSubject()
方法原型如下:
public void MimeMessageObjectName.setSubject (String subject)
设置邮件消息主题。
12.3.4 Transport
Transport(邮件发送类),即javax.mail.Transport。它可由Session类对象的getTransport()方法生成。其常用方法如下所示。
(1)connect()
方法原型如下:
public void TransportObjectName.connect(String SMTPserverName,String UserName,String Password )
连 接到指定的邮件服务器。TransportObjectName是传输对象名称;参数SMTPserver- Name是用来发送邮件的SMTP服务器的地址,如126邮件服务器为smtp.126.com;UserName中登录邮件服务器的用户名; Password是登录邮件服务器的用户的密码。
(2)sendMessage()
方法原型如下:
abstract public void TransportObjectName.sendMessage(Message message,
Address[] address)
发送邮件消息。参数Message是要发送的邮件消息,参数address是发往邮件地址的数组。
12.3.5 Store
Store类,即javax.mail.Stroe,它可用来从邮件服务器上接收邮件。Store类最常用的方法就是getFolder(),此方法得到指定名称的邮件服务器文件夹中的邮件,调用方法 如下:
abstract public Folder StoreObjectName.getFolder(String name)
StoreObjectName是Store类对象的名称;参数name是指定的邮件服务器上文件夹的名称,如INDEX。
12.3.6 Folder
Folder类,即javax.mail.Folder,它是一个邮件文件夹类。Folder类有两个常见的属性,READ_ONLY表示只读,READ_WRITE表示其内容可读可写,其常用方法如下 所示。
(1)exists()
方法原型如下:
abstract public void FolderObjectName.exists()
验证邮件文件夹是否存在,返回值是boolean类型。如果存在则返回true,否则返回false。FolderObjectName是邮件文件夹对象的名称。
(2)fetch()
方法原型如下:
public void FolderObjectName.fetch(Message[] msgs,FetchProfile fp)
根据取邮件的选项从邮件服务器中获取邮件至Message数组中。参数fp是取邮件的配置。FetchProfile类的层次结构是javax.mail.FetchProfile,调用add(FetchProfile.Item item)方法可加入配置,常用的配置项有ENVOLOP、FLAGS、Content_INFO。
(3)getMessages()
方法原型如下:
public synchronized Message[] FolderObjectName.getMessages()
得到此邮件文件夹对象的所有邮件消息对象数组,返回类型是一个邮件消息数组。
12.4 发送邮件
12.4.1 发送文本格式的邮件
例12-1 发送文本格式的邮件。
发送文本格式的邮件是比较简单的程序。为方便演示,先编写一个用来输入所发邮件相关内容的JSP页面,包括发往邮箱的地址、发送邮件的主题及邮件的内容。再用一个页面来接收输入数据并发送邮件。输入页面的代码如下:
writemail.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title>写邮件内容</title>
</head>
<body>
<form name="form1" method="post" action="sendmail.jsp">
<table width="100" border="1" align="center" cellspacing="1">
<tr >
<td width="34%">收信人地址(邮箱):</td>
<td width="66%"><input name="to" type="text" id="to"></td>
</tr>
<tr >
<td>主题:</td>
<td><input name="title" type="text" id="title"></td>
</tr>
<tr>
<td height="107" colspan="2">
<textarea name="content" cols="50" rows="5" id="content">
</textarea></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" name="Submit" value="发送">
<input type="reset" name="Submit2" value="重输">
</td>
</tr>
</table>
</form>
</body>
</html>
其内容其实就是一个简单的表单,运行结果如图12-1所示。
发送邮件界面
输入完邮件内容后,将提交给发送邮件的处理页面sendmail.jsp,源代码如下所示:
sendmail.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<!--引入要用到的类库-->
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%!
public String codeToString(String str)
{//处理中文字符串的函数
String s=str;
try
{
byte tempB[]=s.getBytes("ISO-8859-1");
s=new String(tempB);
return s;
}
catch(Exception e)
{
return s;
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送邮件的结果</title>
</head>
<body>
<%
try{
//从html表单中接收邮件信息
String to_mail=codeToString(request.getParameter("to"));
String to_title=codeToString(request.getParameter("title"));
String to_content=codeToString(request.getParameter("content"));
//--------建立邮件会话--------
Properties props=new Properties();//也可用Properties props = System.
getProperties();
props.put("mail.smtp.host","smtp.126.com"); //存储发送邮件服务器的信息
props.put("mail.smtp.auth","true"); //同时通过验证
Session s=Session.getInstance(props); //根据属性新建一个邮件会话
s.setDebug(true);
//----由邮件会话新建一个消息对象----
MimeMessage message=new MimeMessage(s); //由邮件会话新建一个消息对象
//--------设置邮件--------
InternetAddress from=new InternetAddress("tougao-email@126.com");
message.setFrom(from); //设置发件人
InternetAddress to=new InternetAddress(to_mail);
message.setRecipient(Message.RecipientType.TO,to);
//设置收件人,并设置其接收类型为TO
message.setSubject(to_title); //设置主题
message.setText(to_content); //设置信件内容
message.setSentDate(new Date()); //设置发信时间
//--------发送邮件--------
message.saveChanges(); //存储邮件信息
Transport transport=s.getTransport("smtp");
//--以smtp方式登录邮箱,第一个参数是发送邮件用的邮件服务器SMTP地址;第二个参数为用
户名;第3个参数为密码
transport.connect("smtp.126.com","tougao-email","8807698");
//发送邮件,其中第二个参数是所有已设好的收件人地址
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%>
<div align="center">
<p>向<%=to_mail%>发送邮件成功!<br>
邮件主题:<%=to_title%><br>
邮件内容:<%=to_content%></p>
</div>
<%
}catch(MessagingException e){
out.println("发送失败!");
}
%>
</body>
</html>
程 序先要接收邮件的相关内容,用Properties类的对象来储存邮件会话的属性;用Session对象的getInstance()方法建立一个邮件会 话,再设置邮件的相关内容;用Transport类对象transport来建立连接,连接时要给出SMTP服务器的用户名和密码,再发送邮件。如果在此 过程中出现异常则报告发送邮件失败。本例的运行结果如图12-2所示。读者不妨登录接收邮件的邮箱试试看是否发送成功(当然前提是要可连接到 Internet)。
邮件发送结果
12.4.2 发送HTML邮件
现在的邮件服务器大都支持HTML格式的邮件,即超文本的邮件。HTML邮件比纯文本邮件更具表现力,内容既可以做得美观大方,又可以做得丰富多彩。
例12-2 发送HTML邮件。
继续利用例12-1中的输入邮件内容的JSP页面,只是修改表单的action属性值为处理邮件的页面,这里为sendmailHTML.jsp。sendmailHTML.jsp源代码如下所示。
sendmailHTML.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%!
public String codeToString(String str)
{//处理中文字符串的函数
String s=str;
try
{
byte tempB[]=s.getBytes("ISO-8859-1");
s=new String(tempB);
return s;
}
catch(Exception e)
{
return s;
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送邮件处理结果</title>
</head>
<body>
<%
try{
//----接收邮件相关内容----
String to_mail=codeToString(request.getParameter("to"));
String to_title=codeToString(request.getParameter("title"));
String to_content=codeToString(request.getParameter("content"));
Properties props=new Properties();
//------建立邮件会话------
props.put("mail.smtp.host","smtp.126.com");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);
MimeMessage message=new MimeMessage(s);
//--给消息对象设置发件人、收件人、主题、发信时间--
InternetAddress from=new InternetAddress("tougao-email@126.com");
message.setFrom(from);//发件人
InternetAddress to=new InternetAddress(to_mail);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(to_title);
message.setSentDate(new Date());
//------给消息对象设置内容------
//新建一个存放信件内容的BodyPart对象
BodyPart mdp=new MimeBodyPart();
//给BodyPart对象设置内容和格式的编码方式
mdp.setContent(to_content,"text/html;charset=gb2312");
//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
Multipart mm=new MimeMultipart();
//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
mm.addBodyPart(mdp);
//把mm作为消息对象的内容
message.setContent(mm);
message.saveChanges();
Transport transport=s.getTransport("smtp");
//以smtp方式登录邮箱,第一个参数是发送邮件用的邮件服务器SMTP地址;第二个参数为用户
名;第三个参数为密码
transport.connect("smtp.126.com","tougao-email","8807698");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%>
<div align="center">
<p>发送HTML邮件到<%=to_mail%>成功!</p>
</div>
<%
}catch(MessagingException e){
out.println("发送邮件失败!");
}
%>
</body>
</html>
这里用的是MimeMultipart对象来存放BodyPart,即HTML文件的具体内容。在设置内容时要设置对象的格式,这里是"text/html;charset=gb2312"。
12.4.3 发送带附件的邮件
例12-3 发送带附件的邮件。
继续利用例12-1的输入邮件内容的JSP页面,只是修改表单的action属性值为处理邮件的页面,这里为sendmailFile.jsp。sendmailFile.jsp源代码如下所示。
sendmailFile.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,javax.mail.*"%>
<%@ page import="javax.mail.internet.*"%>
<%@ page import="javax.activation.*"%><!--要发送附件必须引入该库-->
<%@ page import="java.net.*"%><!--要用到URL类-->
<%!
public String codeToString(String str)
{//处理中文字符串的函数
String s=str;
try
{
byte tempB[]=s.getBytes("ISO-8859-1");
s=new String(tempB);
return s;
}
catch(Exception e)
{
return s;
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>发送邮件结果</title>
</head>
<body>
<%
try{
String to_mail=codeToString(request.getParameter("to"));
String to_title=codeToString(request.getParameter("title"));
String to_content=codeToString(request.getParameter("content"));
Properties props=new Properties();
props.put("mail.smtp.host","smtp.126.com");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);
MimeMessage message=new MimeMessage(s);
//--给消息对象设置发件人、收件人、主题、发信时间--
InternetAddress from=new InternetAddress("tougao-email@126.com");
message.setFrom(from);
InternetAddress to=new InternetAddress(to_mail);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(to_title);
message.setSentDate(new Date());
//新建一个MimeMultipart对象用来存放多个BodyPart对象
Multipart mm=new MimeMultipart();
//------设置信件文本内容------
//新建一个存放信件内容的BodyPart对象
BodyPart mdp=new MimeBodyPart();
//给BodyPart对象设置内容和格式/编码方式
mdp.setContent(to_content,"text/html;charset=gb2312");
//将含有信件内容的BodyPart加入到MimeMultipart对象中
mm.addBodyPart(mdp);
//--设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送)
//新建一个存放附件的BodyPart
mdp=new MimeBodyPart();
//新建一个DataHandler对象,并设置其内容和格式/编码方式
DataHandler dh=new DataHandler("JavaMail附件测试","text/plain; charset= gb2312");
//加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setFileName("fj.txt");
//给BodyPart对象设置内容为dh
mdp.setDataHandler(dh);
//将含有附件的BodyPart加入到MimeMultipart对象中
mm.addBodyPart(mdp);
//设置信件的附件2(用本地机上的文件作为附件)
mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource("d:/story.txt");
dh=new DataHandler(fds);
mdp.setFileName("story.txt");//可以和原文件名不一致
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
message.setContent(mm);//把mm作为消息对象的内容
message.saveChanges();
Transport transport=s.getTransport("smtp");
//以smtp方式登录邮箱,第一个参数是发送邮件用的邮件服务器SMTP地址;第二个参数为用户
名;第三个参数为密码
transport.connect("smtp.126.com","tougao-email","8807698");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%>
<div align="center">
<p><font color="#FF6600">发送带附件的邮件到<%=to_mail%>成功!</font></p>
</div>
<%
}catch(MessagingException e){
out.println(e.toString());
}
%>
</body>
</html>
12.5 接收邮件
例12-4 从邮件服务中接收邮件。
这里所说的接收E-mail是指从邮件服务器中阅读已收到的邮件,而并非把Web服务器作为接收邮件的邮件服务器。程序代码如下所示。
viewmailall.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,java.io.*,java.text.*" %>
<%@ page import="javax.mail.*,javax.mail.internet.*,javax.activation.*"%>
<%
Session mailsession=Session.getInstance(System.getProperties(),null);
mailsession.setDebug(false);
//protocol为连接协议,IMAP或是POP
Store store=mailsession.getStore("pop3");
//pop3.126.com为主机,dengziyun为用户名,8807698为密码
store.connect("pop3.126.com","tougao-email","8807698");
Folder folder = store.getFolder("INBOX");
try{
folder.open(Folder.READ_WRITE);
}catch (MessagingException ex)
{
folder.open(Folder.READ_ONLY);
}
Message message[]=folder.getMessages();
out.println("tougao-email@126.com邮箱的收件箱中共有"+message.length+"封邮
件:<br>");
out.println("<table>");
out.println("<tr><td>序号</td><td>主题</td><td>日期</td></tr>");
for(int i=0;i<message.length;i++){
out.println("<tr><td>"+(i+1)+"</td><td>");
out.println("<a href='viewmail.jsp?id="+i+"'>"+message[i].getSub-
ject()+"</a>");
out.println("</td><td>");
out.println(message[i].getSentDate());
out.println("</td></tr>");
}
out.println("</table>");
folder.close(true);
store.close();
%>
这个程序浏览邮件服务器中指定用户(tougao-email@126.com)邮箱的收件箱中的邮件列表。通过邮件标题做超链接,传递邮件的ID号,在链接的viewmail.jsp文件中显示邮件内容。viewemailall.jsp运行结果如图12-3所示。
邮件中的邮件列表
单击超链接将显示具体邮件的内容。显示具体邮件内容的源代码如下所示。
viewmail.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,java.io.*,java.text.*" %>
<%@ page import="javax.mail.*,javax.mail.internet.*,javax.activation.*" %>
<%!
String getDisplayAddress(Address a)
{ //转换RFC822为Unicode
String pers = null;
String addr = null;
if(a instanceof InternetAddress &&((pers=((InternetAddress)a).
getPersonal ())!=null))
addr=pers+" "+"<"+((InternetAddress)a).getAddress()+">";
else
addr = a.toString();
return addr;
}
%>
<%
Session mailsession=Session.getInstance(System.getProperties(),null);
mailsession.setDebug(false);
Store store=mailsession.getStore("pop3");//protocol为连接协议,IMAP或是POP
//pop3.126.com为主机,dengziyun为用户名,8807698为密码
store.connect("pop3.126.com","tougao-email","8807698");
Folder folder = store.getFolder("INBOX");
try {
folder.open(Folder.READ_WRITE);}
catch (MessagingException ex) {
folder.open(Folder.READ_ONLY);}
Message message[]=folder.getMessages();
FetchProfile fp=new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
fp.add("X-Mailer");
folder.fetch(message,fp);
int id=0,j=0;
//假设要阅读第ID个邮件。
for(int i=0;i<request.getParameter("id").length();i++)
id=id*10+(request.getParameter("id").charAt(i)-48);
for(j=0;j<id;j++);
message[j].setFlag(Flags.Flag.SEEN,true);
out.println("<table width=\"750\"border=\"1\"cellpadding=\"0\"
cellspacing =\"0\" align=\"center\">");
out.println("<tr>");
out.println("<td width=80>主题:</td><td width=490> "+message[j].
getSubject()+" </td></tr>");
String from=new String();
Address[] fr=message[j].getFrom();
if(fr!=null){
boolean tf=true;
for(int i=0;i<fr.length;i++)
from=from+getDisplayAddress(fr[i]);
}
out.println("<tr><td width=80>来自:</td><td width=490> "+from+" </td>
</tr>");
out.println("<tr><td colspan=\"2\"> <div align=\"center\"><b>内容
</b> </div><br>");
Object o=message[j].getContent();
if (message[j].isMimeType("text/plain"))
//若其Type为text/plain就可直接读出了
out.println((String)o+"</td>");
else if(message[j].isMimeType("multipart/*")){
Multipart mp=(Multipart)o;
Part part=mp.getBodyPart(0);
String msg=(String)part.getContent();
StringBuffer buf=new StringBuffer(msg.length()+6);
char ch=' ';
for(int i=0;i<msg.length();i++)//若遇到换行就转为<br>
{ ch=msg.charAt(i);
if(ch=='\n')buf.append("<br>");
else buf.append(ch);
}
out.println(buf.toString());
}else
out.println("现在还无法显示:"+message[j].getContentType());
out.println("</tr>");
out.println("<table>");
folder.close(true);
store.close();
%>
如果选中图12-3中的第2封邮件,viewmail.jsp运行结果如图12-4所示。
显示邮件中的内容
12.6 删除邮件
删除邮件的操作实现并不难,只需要修改一个标志。语句如下所示。
message.setFlag(Flags.Flag.DELETED,true)
即把删除标志置为true。但在置删除标志之前,必须以读写方式打开folder,语句如下所示。
folder.open(Folder.READ_WRITE);
当关闭folder时,再传递一个true值,就会物理删除带有删除标志的邮件了,语句如下所示。
folder.close(true);
12.7 小结
本章学习的是J2EE中JavaMail的开发。电子邮件的传送协议主要有3种:SMTP、POP3、IMAP。其中,SMTP多用于发送邮件,POP3与IMAP可从邮件服务器上获取 邮件。
开 发发送和接收邮件的程序,需要事先安装JavaMail API以及JAF框架,在Weblogic8.1中只要安装JavaMail API即可。发送接收E-mail使用session类定义邮件会话,InternetAddress定义邮箱地址,MimeMessage定义邮件发送 消息,Transport定义邮件传输对象。Store表示从邮件服务器上获取邮件的对象,Folder表示邮件文件夹。
12.8 习题
1.利用自己在Internet邮件服务器上注册的邮箱编写一个邮件发送程序,并测试 通过。
2.编写一个从邮件服务器中得到特定用户收件箱内所有邮件标题的Java程序,用Java应用程序或JSP编写均可。