通过 JavaMail 访问 Hotmail 邮箱(hotmail不提供smtp和pop3服务)

简介: 相信许多人都有 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 进行邮件的发送速度比较慢,差不多有几分钟后才能收到相应的信息,因此如果测试中发现该问题请耐心等待。

我想通过本文介绍如何利用 JDAVMail 收发 Hotmail 邮件,以及研究 JDAVMail 的源码,不仅可以更加深入了解 JavaMail 的体系结构,对编写 JavaMail Provider 也有更加具体的参照。另外希望为正困挠于如何在 Java 程序中访问 Hotmail 邮件的朋友们排忧解难。同时也非常欢迎通过我的网站http://www.javayou.com跟我交流在使用中遇到的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36280.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# SmtpClient好像不支持STARTTLS,outlook邮箱不能发了

最近发现我之前的程序不能用了。于是我想代替程序&#xff0c;于是找到MailKit了&#xff0c;我先试一下水。 using System; using System.Text; using System.Net.Mail; using System.Net;namespace sendmail {internal class Program{static void Main(string[] args){try{Sm…

Outlook和Foxmail里设置Gmail(Google)谷歌企业邮箱

在大多数客户眼中&#xff0c;Gmail堪称完美邮箱的代表&#xff0c;支持POP3/SMTP&#xff0c;超大容量&#xff0c;绝对强大的反垃圾功能&#xff0c;发国外不退信&#xff0c;由世界最大的Google提供&#xff0c;稳定放心…… 注册开通地址&#xff1a; http://www.google.c…

小红书达人等级划分?小红书垂类达人怎么看

小红书的种草能力和社区加电商的模式&#xff0c;吸引了越来越多用户&#xff0c;也使得越来越多品牌将目光放在小红书笔记推广上。那么今天就和大家介绍一下小红书达人等级划分情况和小红书达人种草力度&#xff0c;供大家参考了解。 一、小红书达人等级划分 小红书达人等级划…

【报告分享】2021小红书投放运营指南书-小红书(附下载)

如需查看完整报告和报告下载或了解更多&#xff0c;公众号&#xff1a;行业报告智库 摘要:如果说是产品种草的话&#xff0c;一定要给人一种真实试用后产出的内容&#xff0c;再加上客观表达&#xff0c;围绕产品特点及个人风格进行描述&#xff0c;分享真实感受&#xff0c;不…

CDGA|盘点近年全国各部门、各城市颁布数字化转型的政策

近年来&#xff0c;政府数字化转型正在成为全球公共治理和公共服务发展趋势。中国政府也在积极探索和实践&#xff0c;并走出一条具有中国特色的政府数字化转型之路。 下面来盘点一下近年来国内各政府部门与城市实施关于数字化转型方面的政策。 【各政府部门关于数字化转型的政…

揭秘腾讯智慧城市版图:“数字政府”+“超级大脑”的新打法

2015年&#xff0c;“互联网”概念异军突起&#xff0c;成为重构商业模式的符号&#xff1b;2017年&#xff0c;“数字经济”利用后发性优势推动高新技术突飞猛进&#xff1b;2018年&#xff0c;“数字中国”成为国内建设的主旋律符号&#xff0c;一批战略行动和重大工程迅速跟…

构建城市三维信息模型(CIM)与数字孪生城市可视化技术 优锘ThingJS

#智慧城市# #数字孪生# #三维可视化# 构建城市三维信息模型&#xff08;CIM&#xff09;数字孪生城市可视化呈现 简介&#xff1a;数字孪生体的全写实性&#xff0c;使得城市全状态实时化、可视化以及城市管理决策与服务的协同化和智能化&#xff0c;这是数字孪生城市的愿景&a…

数字孪生城市技术图谱和平台架构

城市数字化转型特征内涵 城市数字化转型本质上是“以业务价值提升为导向&#xff0c;以机制体制优化为保障&#xff0c;以技术创新应用为手段&#xff0c;最终提升城市面向未来的综合竞争力”的城市发展新范式。 数字孪生城市不是一项技术&#xff0c;是多维技术融合的综合应用…

数字城市与智慧城市的创建,数字化大数据技术的应用

城市即是“资源高地”&#xff0c;又存在着“效率洼地”。经过几千年的发展&#xff0c;人口高度集中进一步加重了城市公共资源网的供求矛盾&#xff0c;为城市治理者产生日渐严峻的诸多挑战。咱们的城市“得病”了&#xff0c;交通堵塞、空气污染、治安违法等难题备受群众抨击…

如何构建数字城市?数字城市的意义有哪些?

在信息化建设的过程中&#xff0c;常常会面临数据不互通、不关联、难挖掘等难题。数字城市能紧跟新技术、新标准和新要求&#xff0c;适时对系统建设标准进行调整&#xff0c;以便在建成后能充分发挥智慧城市的数字底座作用。 数字城市建设是数字中国建设的重要组成部分&#x…

最近非常火的AI绘图(附操作方法)

现在网上比较流行AI绘图&#xff0c;不管你是绘画高手还是小白&#xff0c;只要输入绘制内容或者基础图像&#xff0c;就可以绘制富有艺术感的画作&#xff01; 下面介绍一个AI绘图的绘制步骤。 1.首先登录网址&#xff0c;通过手机号注册账号&#xff0c;然后选择这个AI艺术…

韦东山嵌入式学习视频

本人微信公众号&#xff0c;同时本人也是韦东山老师的代理

韦东山第1期-学习笔记-1

前言&#xff1a;已有C51、STM32、linux arm开发相关基础。之前在华清远见学习过一段时间&#xff08;未学完就来上学了&#xff09;。希望通过韦东山重新系统学习一遍。笔记为看视频时简单记录&#xff0c;主要是框架和针对自己的弱点。 韦东山官方淘宝店&#xff1a;https:/…

如何彻底关闭2345流氓软件附带的广告(弹窗,工具栏搜索taskbarsearch,右下角信息展示)

我用这个流氓软件也是出于他的压缩功能比较好用,可能也是习惯了。但是最近我发现这个软件有点过分了。首先莫名其妙的工具栏出现个搜素框(整的还挺像windows的),之后就是右下角又出现了个消息框(做贼心虚吧,也是仿照windows),自动弹窗行为还好,我用了杀毒软件自动屏蔽…

烧写文件系统——韦东山嵌入式Linux学习笔记11

本文实验环境&#xff1a; 1. windows 7&#xff08;64bit&#xff09; 2. JZ2440&#xff08;V2&#xff09; 使用 u-boot 烧写文件系统&#xff0c;一般有两种方法。 1. 通过USB下载功能 2. 通过TFTP功能 通过USB下载功能烧写文件系统 这种方法比较简单。 操作步骤&a…

北大最强扫地僧“韦东奕”爆红全网

临近高考&#xff0c;越来越多人为高考生们加油打气&#xff0c;一条北大数学老师的视频更是爆红网络。 视频中的他&#xff0c;自我介绍是&#xff1a;北京大学数学系10级本科生、14级研究生&#xff0c;高中数学联赛山东省冠军&#xff0c;拿到过数学奥林匹克金牌&#xff0c…

看看高手做的ARM开发板

放假前&#xff0c;我写了一篇文章&#xff0c;里面有提到我放假的时候会接触一个开发板&#xff0c;这个开发板就是标题提到的这个ARM处理器&#xff0c;这篇文章会对这个处理器和开发板做个简单的介绍。 说这个开发板前&#xff0c;先介绍下我的一个朋友zzy。 zzy是通过公众号…

韦东山鸿蒙移植01-移植RTOS需要做的事

在线课堂&#xff1a;https://www.100ask.net/index&#xff08;课程观看&#xff09; 论  坛&#xff1a;http://bbs.100ask.net/&#xff08;学术答疑&#xff09; 开 发 板&#xff1a;https://100ask.taobao.com/ &#xff08;淘宝&#xff09;      https://weid…

2017-韦东山视频学员成果精选(四)

首发平台&#xff1a;微信公众号baiwenkeji 1&#xff0c; 2&#xff0c; 3&#xff0c; 4&#xff0c; 5&#xff0c;

韦东山开发板QT移植笔记

参考 《百问网精智JZ2440开发板4.3寸LCD版使用手册.pdf2015/12/29》 修改环境变量&#xff1a; sudo vi /etc/environment 修改&#xff1a;PATH"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin" 改为&#xf…