相信许多人都有MSN聊天工具de帐号,例如abc@hotmail.com ,这个账号其实也是一个邮件地址,可以进行正常de邮件收发功能,您可以通过网址 http://www.hotmail.com 来访问和操作这个邮箱进行邮件de收发.但是这个邮箱有一个限制就是它并不提供POP3或者SMTP服务,也就是说一般de邮件客户端工具无法使用这个邮箱,虽然现在有不少de邮件工具可以支持Hotmail邮箱,但是如果我需要在我deJava项目中增加对Hotmail邮箱de支持,那往往会不知从什么地方开始入手,因为SUN公司提供deJavaMail 本身并不提供对除了POP3/IMAP以及SMTP外其他协议de支持.
但事实上,JavaMail只是定义了一组平台无关、独立于通讯协议de邮件程序框架,或者说是接口,它是作为Javade可选包存在de.因此可以这样说:JavaMail并不关心所使用de协议,不管是POP3、SMTP、IMAP当然还有Hotmail用deHTTP协议.对于JavaMailde客户端而言也是这样de,下图就是一个最简单deJavaMail结构图,通过Transport进行邮件de发送,通过Store实现对邮件de收取,而不同协议de实现,JavaMail里de概念叫做Provider,只需要根据JavaMail定义de接口实现自己deProvider即可.

为了实现通过JavaMail访问Hotmail邮箱,我就需要架起JavaMail接口与Hotmail服务所提供de访问接口之间de桥梁.在这之前我必须首先了解Hotmail所使用de接口协议.
Hotmail通过地址 http://services.msn.com/svcs/hotmail/httpmail.asp 提供基于HTTP协议de服务,它不同于我通过浏览器访问 http://www.hotmail.com de这个地址,后面这个地址是提供给用户一个基于浏览器de访问界面以便对邮箱进行操作,您当然可以通过编写HTTP客户端程序来解析页面并获取邮件de信息,但是这样做不仅实现de复杂程度非常高,而且每次页面风格发生变化后程序都要做相应de调整,因此不具备通用性,显然是不可行de.而地址 http://services.msn.com/svcs/hotmail/httpmail.asp 则不同,它提供了固定de应用程序接口.当您使用浏览器访问该地址de时候,会弹出下面要求登录de窗体:

而当输入正确de用户名和口令后会再弹出一次或两次该提示窗口,但提示信息不同,操作完成后出现页面无法显示de错误,错误码是 405 (资源不允许).因此该服务并不允许通过浏览器来访问.
事实上Hotmail使用de是WebDAV来提供基于HTTP协议de应用编程接口,WebDAV(Web 分布式创作和版本控制)已经成为重要de Web 通讯协议.WebDAV所要解决de问题是:
1.改写保护:HTTP 1.1 无法确保客户端可以保护资源,并且可以在其他客户端同时编辑它们de情况下进行更改. 使用 WebDAV,可以通过多种方式来锁定资源,以便让其他客户端知道您对所讨论de资源感兴趣,或者防止其他客户端访问该资源.
2.资源管理:HTTP 只能直接访问单个资源. WebDAV 提供一种更有效地组织数据de方法. WebDAV 引入了可包含资源 de集合(类似于文件系统文件夹)概念. 通过 WebDAV 进行de资源管理包括如下功能:创建、移动、复制和删除集合,以及集合中de资源或文件.
3.文档属性:不同类型de数据具有唯一de属性,这有助于描述数据. 例如,在电子邮件中,这些属性可能是发件人de姓名和接收邮件de时间. 在协作文档中,这些属性可能是文档原始作者de姓名和最后一个编辑者de姓名. 因为人们使用de文档类型各不相同,所以可能de属性类型列表也变得无限大. XML 是 WebDAV 所需de一种可扩展通讯工具.
关于WebDAVde更多资料可以参阅本文最后de参考资料.
相对于自行解析Hotmailde浏览器页面而言,基于特定协议WebDAVde接口使Hotmail邮件客户端程序de实现更加稳定和可靠.在了解了JavaMail APIde基本接口以及Hotmail所提供接口de协议,本文de题目就变得非常具体了,就是如果编写基于WebDAVdeJavaMail Provider(JavaMail提供者)并使用这个提供者来实现Hotmail邮件收发功能,但这题目太大而且已经超过了一篇文章所能叙述de范围,因此我接下来将引入一个开放源码项目JDAVMail,并详细介绍如何通过这个项目实现Hotmail邮件de收发功能.
JDAVMail 是一个开放源码deJavaMailde提供者项目,可以通过它来访问基于WebDAV协议de邮件服务,有如Hotmail邮箱.您可以到 http://sourceforge.net/projects/jdavmail 这个网址下载到最新版本de程序.JDAVMail使用了Jakarta上decommons httpclient 作为HTTP客户端组件与服务器进行通讯,同时使用了jdom进行XML数据de解析,另外由于httpclient项目用到了commons logging进行日记de输出,因此commons-logging也是必须de,这三个组件都可以在JDAVMailde压缩包中delib目录中找到,压缩包中同时还包括已编译dejar文件以及所有de源码.
为了让大家对JDAVMail有个大概de认识,下面我给出两段相关代码用于Hotmail邮件de收发:
1. 邮件收取
/*
* 文件名:HotmailDemo.java
* 创建时间:2004-9-14
* 创建者:liudong
*/
package com.clickcom.mail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* Hotmail邮件de收发器
* @author liudong
*/
public class HotmailDemo {
public static void main(String[] args) {
receive();
}
/**
* 邮件接收
*/
protected static void receive() {
try {
Properties prop = new Properties();
Session ses = Session.getInstance(prop);
//使用JDAVMail Provider
Store store = ses.getStore(”davmail”);
//无需指定服务器地址
store.connect(null, “您de帐号”,”密码”);
if (store.isConnected()) {
Folder inbox = store.getFolder(”INBOX”);
if (inbox.exists()) {
inbox.open(Folder.READ_ONLY);
int nCount = inbox.getMessageCount();
System.out.println(”Inbox contains ” nCount ” messages”);
// 依次显示收件箱中de每封邮件
for(int i=1;i<=nCount;i ){
MimeMessage msg = (MimeMessage) inbox.getMessage(i);
System.out.println(”Subject : ” msg.getSubject());
System.out.println(”From : ” msg.getFrom()[0].toString());
System.out.println(”Content type : ” msg.getContentType());
System.out.println(msg.getContent());
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
从上面这段相关代码我发现除了 Store store = ses.getStore(”davmail”); 这个语句,同时不需要指定服务器地址外,其他de都跟一个普通deJavaMail应用程序没有两样,也没有引入任何跟JDAVMail有关de类.没有指定服务器地址这个比较容易理解,因为Hotmail提供HttpMail服务de地址是固定de.事实上仅有getStore这个语句跟常规邮件客户端程序有点不同de是它使用davmail字符串作为参数,而我在使用JavaMail连接POP3服务器de时候指定参数值为pop3.怎么回事呢?因为JavaMail是通过协议名来加载Provider类de.打开JDAVMail.0.9.006.jar这个jar文件就会发现在META-INF目录下有一个文件javamail.providers,该文件内容如下:
protocol=davmail;
type=store; class=com.posisoft.jdavmail.JDAVMailStore;
vendor=Positive Software;
protocol=davmail_xmit;
type=transport;
class=com.posisoft.jdavmail.JDAVMailTransport;
vendor=Positive Software;
因此当我指定协议名为davmail时,JavaMail就会自动加载com.posisoft.jdavmail.JDAVMailStore类进行处理,因此通过传入davmail字符串所得到destore实例实际上是类com.posisoft.jdavmail.JDAVMailStorede一个实例,这样我想大家应该了解了前面这段程序de工作原理.
我再来看JDAVMail发送邮件de相关代码片段:
/**
* 邮件发送
*/
protected static void send() {
try {
Properties prop = new Properties();
//邮件发送者地址
prop.setProperty(”mail.davmail.from”,”abc@hotmail.com”);
Session ses = Session.getInstance(prop);
//获得JDAVMailde邮件发送实例
Transport transport = ses.getTransport(”davmail_xmit”);
//连接到Hotmail服务器,请替换为自己de用户名和口令
transport.connect(null, “用户名”,”口令”);
// 准备要发送de邮件
MimeMessage txMsg = new MimeMessage(ses);
txMsg.setSubject(”This is the subject”);
//邮件发送者地址
InternetAddress addrFrom = new InternetAddress(”abc@hotmail.com”);
txMsg.setFrom(addrFrom);
//邮件接收者地址
InternetAddress addrTo = new InternetAddress(”cdef@hotmail.com”, “cdef”);
txMsg.addRecipient(Message.RecipientType.TO, addrTo);
//邮件内容
txMsg.setText(”Hello world !”);
txMsg.setSentDate(new Date());
//发送邮件
transport.sendMessage(txMsg, txMsg.getAllRecipients());
} catch (Exception ex) {
ex.printStackTrace();
}
}
同样这段相关代码使用了davmail_xmit协议来获取JDAVMailde邮件发送实例,通过前面提到dejavamail.providers文件不难知道JDAVMail使用类com.posisoft.jdavmail.JDAVMailTransport进行邮件de发送处理.
在实际测试中发现不管是JDAVMail还是其他de邮件工具,使用Hotmail进行邮件de发送速度比较慢,差不多有几分钟后才能收到相应de信息,因此如果测试中发现该问题请耐心等待.
我想通过本文介绍如何利用JDAVMail收发Hotmail邮件,以及研究JDAVMailde源码,不仅可以更加深入了解JavaMailde体系结构,对编写JavaMail Provider也有更加具体de参照.另外希望为正困挠于如何在Java程序中访问Hotmail邮件de朋友们排忧解难.同时也非常欢迎通过我de网站 http://www.javayou.com 跟我交流在使用中遇到de问题.