通过JavaMail会见Hotmail邮箱
副标题#e#
相信很多人都有MSN谈天东西的帐号,譬喻[email protected] ,这个账号其实也是一个邮件地点,可以举办正常的邮件收发成果,你可以通过网址 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邮件的收发成果。
#p#副标题#e#
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. 邮件收取
#p#分页标题#e#
/*
* 文件名: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","[email protected]");
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("[email protected]");
txMsg.setFrom(addrFrom);
//邮件吸收者地点
InternetAddress addrTo = new InternetAddress("[email protected]", "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();
}
}
#p#分页标题#e#
同样这段代码利用了davmail_xmit协议来获取JDAVMail的邮件发送实例,通过前面提到的javamail.providers文件不难知道JDAVMail利用类com.posisoft.jdavmail.JDAVMailTransport举办邮件的发送处理惩罚。
在实际测试中发明不管是JDAVMail照旧其他的邮件东西,利用Hotmail举办邮件的发送速度较量慢,差不多有几分钟后才气收到相应的信息,因此假如测试中发明该问题请耐性期待。
我想通过本文先容如何操作JDAVMail收发Hotmail邮件,以及研究JDAVMail的源码,不只可以越发深入相识JavaMail的体系布局,对编写JavaMail Provider也有越发详细的参照。别的但愿为正困挠于如安在Java措施中会见Hotmail邮件的伴侣们排忧解难。同时也很是接待通过我的网站 http://www.javayou.com 跟我交换在利用中碰着的问题。