通过JavaMail访问Hotmail邮箱

访问

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

为了实现通过JavaMail访问Hotmail邮箱,我们就需要架起JavaMail接口与Hotmail服务所提供的访问接口之间的桥梁。在这之前我们必须首先了解Hotmail所使用的接口协议。

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

而当输入正确的用户名和口令后会再弹出一次或两次该提示窗口,但提示信息不同,操作完成后出现页面无法显示的错误,错误码是 405 (资源不允许)。因此该服务并不允许通过浏览器来访问。

事实上Hotmail使用的是WebDAV来提供基于HTTP协议的应用编程接口,WebDAV(Web 分布式创作和版本控制)已经成为重要的 Web 通讯协议。WebDAV所要解决的问题是:

1.改写保护:HTTP 1.1 无法确保客户端可以保护资源,并且可以在其他客户端同时编辑它们的情况下进行更改。 使用 WebDAV,可以通过多种方式来锁定资源,以便让其他客户端知道您对所讨论的资源感兴趣,或者防止其他客户端访问该资源。

2.资源管理:HTTP 只能直接访问单个资源。 WebDAV 提供一种更有效地组织数据的方法。 WebDAV 引入了可包含资源 的集合(类似于文件系统文件夹)概念。 通过 WebDAV 进行的资源管理包括如下功能:创建、移动、复制和删除集合,以及集合中的资源或文件。

3.文档属性:不同类型的数据具有唯一的属性,这有助于描述数据。 例如,在电子邮件中,这些属性可能是发件人的姓名和接收邮件的时间。 在协作文档中,这些属性可能是文档原始作者的姓名和最后一个编辑者的姓名。 因为人们使用的文档类型各不相同,所以可能的属性类型列表也变得无限大。 XML 是 WebDAV 所需的一种可扩展通讯工具。

关于WebDAV的更多资料可以参阅本文最后的参考资料。

相对于自行解析Hotmail的浏览器页面而言,基于特定协议WebDAV的接口使Hotmail邮件客户端程序的实现更加稳定和可靠。在了解了JavaMail API的基本接口以及Hotmail所提供接口的协议,本文的题目就变得非常具体了,就是如果编写基于WebDAV的JavaMail Provider(JavaMail提供者)并使用这个提供者来实现Hotmail邮件收发功能,但这题目太大而且已经超过了一篇文章所能叙述的范围,因此我们接下来将引入一个开放源码项目JDAVMail,并详细介绍如何通过这个项目实现Hotmail邮件的收发功能。

JDAVMail 是一个开放源码的JavaMail的提供者项目,可以通过它来访问基于WebDAV协议的邮件服务,有如Hotmail邮箱。你可以到 http://sourceforge.net/projects/jdavmail 这个网址下载到最新版本的程序。JDAVMail使用了Jakarta上的commons httpclient 作为HTTP客户端组件与服务器进行通讯,同时使用了jdom进行XML数据的解析,另外由于httpclient项目用到了commons logging进行日记的输出,因此commons-logging也是必须的,这三个组件都可以在JDAVMail的压缩包中的lib目录中找到,压缩包中同时还包括已编译的jar文件以及所有的源码。

为了让大家对JDAVMail有个大概的认识,下面我们给出两段代码用于Hotmail邮件的收发:

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邮件的收发器
* @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, "你的帐号","密码");
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");
// 依次显示收件箱中的每封邮件
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"); 这个语句,同时不需要指定服务器地址外,其他的都跟一个普通的JavaMail应用程序没有两样,也没有引入任何跟JDAVMail有关的类。没有指定服务器地址这个比较容易理解,因为Hotmail提供HttpMail服务的地址是固定的。事实上仅有getStore这个语句跟常规邮件客户端程序有点不同的是它使用davmail字符串作为参数,而我们在使用JavaMail连接POP3服务器的时候指定参数值为pop3。怎么回事呢?因为JavaMail是通过协议名来加载Provider类的。打开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字符串所得到的store实例实际上是类com.posisoft.jdavmail.JDAVMailStore的一个实例,这样我想大家应该了解了前面这段程序的工作原理。

我们再来看JDAVMail发送邮件的代码片段:

/**
* 邮件发送
*/
protected static void send() {
try {
Properties prop = new Properties();
//邮件发送者地址
prop.setProperty("mail.davmail.from","abc@hotmail.com");
Session ses = Session.getInstance(prop);
//获得JDAVMail的邮件发送实例
Transport transport = ses.getTransport("davmail_xmit");
//连接到Hotmail服务器,请替换为自己的用户名和口令
transport.connect(null, "用户名","口令");

// 准备要发送的邮件
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协议来获取JDAVMail的邮件发送实例,通过前面提到的javamail.providers文件不难知道JDAVMail使用类com.posisoft.jdavmail.JDAVMailTransport进行邮件的发送处理。

在实际测试中发现不管是JDAVMail还是其他的邮件工具,使用Hotmail进行邮件的发送速度比较慢,差不多有几分钟后才能收到相应的信息,因此如果测试中发现该问题请耐心等待。

时间: 2024-08-24 11:22:22

通过JavaMail访问Hotmail邮箱的相关文章

JavaMail访问Hotmail邮箱_JSP编程

相信许多人都有MSN聊天工具的帐号,例如abc@hotmail.com ,这个账号其实也是一个邮件地址,可以进行正常的邮件收发功能,你可以通过网址 http://www.hotmail.com 来访问和操作这个邮箱进行邮件的收发.但是这个邮箱有一个限制就是它并不提供POP3或者SMTP服务,也就是说一般的邮件客户端工具无法使用这个邮箱,虽然现在有不少的邮件工具可以支持Hotmail邮箱,但是如果我们需要在我们的Java项目中增加对Hotmail邮箱的支持,那往往会不知从什么地方开始入手,因为SU

JavaMail访问Hotmail邮箱

JavaMailHotmail 相信许多人都有MSN聊天工具的帐号,例如abc@hotmail.com ,这个账号其实也是一个邮件地址,可以进行正常的邮件收发功能,你可以通过网址 http://www.hotmail.com 来访问和操作这个邮箱进行邮件的收发.但是这个邮箱有一个限制就是它并不提供POP3或者SMTP服务,也就是说一般的邮件客户端工具无法使用这个邮箱,虽然现在有不少的邮件工具可以支持Hotmail邮箱,但是如果我们需要在我们的Java项目中增加对Hotmail邮箱的支持,那往往会

用javamail收取hotmail的退信

Hotmail 是我最常用的Email Client.虽然时下hotmail的容量是小了些,速度也常常慢得让人不禁问候盖茨的母亲.但不可否认,它功能相当丰富,也比较稳定.尤其它的页面设计更是我等web编程人员的重要参照. 不象很多的POP3服务器,hotmail 实现了邮件传送状态通知(multipart/report).我以前写的邮件客户端只支持收取 multipart/related.multipart/alternative和multipart/mixed 等多媒体类型的邮件,其他的因为不

利用javamail收取Hotmail的退信

Hotmail是我最常用的Email Client.虽然时下hotmail的容量是小了些,速度也常常慢得让人不禁问候盖茨的母亲.但不可否认,它功能相当丰富,也比较稳定.尤其它的页面设计更是我等web编程人员的重要参照. 不象很多的POP3服务器,hotmail 实现了邮件传送状态通知(multipart/report).我以前写的邮件客户端只支持收取 multipart/related.multipart/alternative和multipart/mixed 等多媒体类型的邮件,其他的因为不常

javamail收取Hotmail的退信_JSP编程

Hotmail 是我最常用的Email Client.虽然时下hotmail的容量是小了些,速度也常常慢得让人不禁问候盖茨的母亲.但不可否认,它功能相当丰富,也比较稳定.尤其它的页面设计更是我等web编程人员的重要参照. 不象很多的POP3服务器,hotmail 实现了邮件传送状态通知(multipart/report).我以前写的邮件客户端只支持收取 multipart/related.multipart/alternative和multipart/mixed 等多媒体类型的邮件,其他的因为不

javamail收取Hotmail的退信

JavaMailHotmail Hotmail 是我最常用的Email Client.虽然时下hotmail的容量是小了些,速度也常常慢得让人不禁问候盖茨的母亲.但不可否认,它功能相当丰富,也比较稳定.尤其它的页面设计更是我等web编程人员的重要参照. 不象很多的POP3服务器,hotmail 实现了邮件传送状态通知(multipart/report).我以前写的邮件客户端只支持收取 multipart/related.multipart/alternative和multipart/mixed

hotmail邮箱不能访问怎么办?hotmail无法登录问题解决办法

问题状态 我的hotmail邮箱已经好几天都打不开了.打开了也全是空白.里面好多邮件看不到 解决办法 1.通过特别链接地址 大家可能都是习惯了直接在浏览器输入 http://www.hotmail.com 为登陆到hotmail了,但有时此页面会打不开或登录不了了,下面给各位介绍一下方法. 直接在浏览器的地址栏中输入地址: https://login.live.com/login.srf?id=2&svc=mail 可以直接登录hotmail邮箱. 2.使用mobile登录方式 首先,登录msn

建立用自己域名结尾的Hotmail邮箱

 先看这个:http://tech.163.com/05/1120/17/23156LSC000915AS.html在微软live.com刚刚推出不久,近日又推出免费邮局的服务.任何人只要拥有国际域名,通过在http://domains.live.com/简单的注册设置,就可以免费拥有以自己域名为后缀的免费邮局. Windows Live Domain Service的服务内容包括: - 为每个域名创建最多20个邮箱: - 每个邮箱跟Hotmail一样拥有250M空间: - 使用任何上网的电脑查

用C#访问Hotmail

访问 POP邮件协议的优点在于它是一个开放的标准,有着完善的文档,这就使得编写POP邮件客户程序不那么困难,只要掌握了POP.SMTP的基础知识,就可以写出代理程序来执行各种任务,例如过滤广告和垃圾邮件,或提供e-mail自动应答服务. Hotmail是世界上影响最广的Web邮件系统,遗憾的是,当我们要为Hotmail编写独立的客户程序(不通过浏览器访问的客户程序)时,马上就会遇到Hotmail不提供POP网关这一障碍. 虽然Hotmail不提供POP支持,但浏览器并非访问Hotmail的唯一途