通过JavaMail访问Hotmail邮箱

jdav:适用于Java的DAV框架 达夫 适用于Java的DAV框架 该框架提供了一种方便且可扩展的方式来序列化和解析WebDAV中使用的XML文档以及基于WebDAV的标准。 要求 用于解析和序列化。 支持的RFC 实施状况 以下矩阵概述了当前支持哪些RFC。 缺少[X]表示已完成一些工作,但尚不支持所有XML元素。 RFC RFC标题 客户 服务器 WebDAV的版本扩展 [] [] WebDAV的访问控制协议扩展 [] [] WebDAV的日历扩展 [] [] WebDAV [] [] WebDAV搜索 [] [] WebDAV当前校长扩展 [X] [X] 用于Web分布式创作和版本控制(WebDAV)的扩展MKCOL [X] [X] 将扩展绑定到Web分布式创作和版本控制 [] [] 使用POST将成员添加到Web分布式创作和版本(WebDAV)集合 [X] [X] Ca 立即下载

刘冬 (winter.lau@163.com)
Java自由人,
2004 年 10 月

相信许多人都有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 跟我交流在使用中遇到的问题。

参考资料

关于作者
刘冬,一直使用J2EE从事移动业务方面的开发。现在可以通过Java自由人网站来跟我联系,网址是:http://www.javayou.com;另外我的邮件地址是winter.lau@163.com

jdav-client:Java 的 DAV 客户端 jDAV-客户端 Java 的 DAV 客户端 要求 用于解析和序列化的 。 用于 DAV XML 元素的定义。 为 HTTP 客户端建模。 例子 以下示例显示了如何使用此库。 请注意:该示例保持简单,不包含异常处理。 在实际应用程序中,您始终需要为各种异常做好准备,例如连接或身份验证问题。 示例中使用的 Executor 需要实现 http-client-interfaces 库中的 IHttpExecutor 接口。 Executor 实现不是这个库的一部分。 // create a DavContext. This needs to be done only once. // Multiple requests can share the same DavContext, when executed consecutively. DavContext davContext 立即下载

相关推荐

workadventure-jdav

WorkAdventure Map入门套件 这是一个入门工具包,可帮助您为构建自己的地图。 要了解如何使用该入门工具包,请按照的教程进行操作。

简单JAVA类

对于简单JAVA类有如下基本开发要求: 类名称必须存在意义,例如:Book,Emp 类中所有属性必须private封装,封装后的属性必须提供setter、getter方法 类中可以提供任意多个构造方法,但是必须保留一个无参的构造方法 类中不允许出现任何输出语句,所有信息输出必须交给被调用处输出 类中需要提供有一个取得对象完整信息的方法,暂定为getInfo(),而且返回String类型 根据基本开发要求,定义开发Emp程序类 package oop;

Unique_LZ的博客 4547

【vivado PG学习】1 PG168:7 Series FPGAs Transceivers官方配置方法学习笔记

介绍: The 7 series FPGAs Transceivers Wizard LogiCORE™ IP 自动创建配置7系列fpga 收发器的HDL封装。向导可以配置一个或多个支持行业主流标准的高速串行收发器。或者从零开始支持各种自定义协议。 功能: 创建配置7系列fpga 收发器的HDL封装。 自动对模拟设置进行配置。 预定义了提供Aurora 8B/10B, Aurora 64B/66B, CEI-6G,DisplayPort, Interlaken, Open Base StationAr..

w0shishabi的博客 5万+

sublime驼峰与蛇形互转

包地址:https://github.com/jdavisclark/CaseConversion 1.Install 1.1 Package Control Open the Command Palette, type pci to bring up Package Control: Install Package, hit Enter, then search for Case Convers...

阳水平的博客 9890

DeepSeek+Dify实战:零代码构建智能SQL生成器

本文详细介绍了如何利用DeepSeek和Dify零代码构建智能SQL生成器,帮助非技术人员通过自然语言查询数据库。文章涵盖从数据准备、知识库设计到Agent配置的全流程,并提供了优化技巧和实际应用案例,显著提升团队数据查询效率。

weixin_29311017的博客 419

手把手教你配置RK3588的FFmpeg+RKmpp:从解码到RGA转换的完整避坑指南

本文详细介绍了在RK3588平台上配置FFmpeg+RKmpp进行硬件解码和RGA图像处理的完整流程,包括环境准备、DRM Prime解码输出实战、RGA硬件加速转换技巧以及全链路性能调优。通过具体代码示例和问题排查指南,帮助开发者高效实现视频处理流水线,显著提升性能并降低CPU占用率。

weixin_28366475的博客 473

通过JavaMail访问Hotmail邮箱 .

相信许多人都有msn聊天工具的帐号,例如abc@hotmail.com ,这个账号其实也是一个邮件地址,可以进行正常的邮件收发功能,你可以通过网址 http://www.hotmail.com 来访问和操作这个邮箱进行邮件的收发。但是这个邮箱有一个限制就是它并不提供pop3或者s

【郭林专刊】云哥中国 I T 民工 1万+

AWR1642+DCA1000EVM 不使用mmWave Studio软件采集原始ADC数据 Timeout问题汇总

DCA1000 EVM Timeout问题汇总

Jesy_Hsu的博客 1476

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

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

dac55300424的专栏 9万+

基于YOLOv8的水果新鲜程度检测系统设计与实现

数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。

YOLO 444

matlab 基于离散余弦变换DCT的最小二乘相位解缠

最小范数法是寻求在解包裹相位的局部微分与包裹相位微分相一致的条件下, 逼近于真实相位分布的解包裹相位分布。目标是使解包裹相位与包裹相位曲面的差最小

点云侠的博客 285

javamail以hotmail作为发件人时报错SMTPSendFailedException:STOREDRV.Submission.Exception:OutboundSpamException

 我已经彻底服了hotmail邮箱,用javamail收发件时,总是有各种问题。可能是国外的邮箱安全做的太好了吧。今天又收到用户的反馈,发件失败了。在后台看了报如下的错。 com.sun.mail.smtp.SMTPSendFailedException: 554 5.2.0 STOREDRV.Submission.Exception:OutboundSpamException; Failed...

qq_26797239的博客 2万+

化工设计软件:AutoCAD Plant 3D二次开发_(1).AutoCADPlant3D概述

AutoCAD Plant 3D 是一款专为化工行业设计的三维工厂设计和建模软件。它基于AutoCAD平台,提供了强大的三维建模功能和专业的化工设计工具,帮助工程师和设计师在工厂设计过程中提高效率和准确性。AutoCAD Plant 3D不仅能够创建详细的三维模型,还可以进行管道设计、设备布置、支架设计等复杂任务。通过上述案例,我们可以看出 AutoCAD Plant 3D 在化工厂设计中的强大功能和优势。该软件不仅提供了丰富的建模工具和专业的设计功能,还支持二次开发,使用户能够根据具体需求进行定制化操作。

kkchenjj的博客 1103

java发送hotmail邮件_利用javamail收取Hotmail的退信

利用javamail收取Hotmail的退信(2007-04-05 23:44:19)Hotmail 是我最常用的Email Client。虽然时下hotmail的容量是小了些,速度也常常慢得让人不禁问候盖茨的母亲。但不可否认,它功能相当丰富,也比较稳定。尤其它的页面设计更是我等web编程人员的重要参照。不象很多的POP3服务器,hotmail 实现了邮件传送状态通知(multipart/repo...

weixin_39817122的博客 610

YOLO11有效改进专栏目录

YOLO11改进专栏导航

A1983Z的博客 3678

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JavaMail使用Hotmail的SMTP

最近在研究如何用JavaMail来发邮件,其中碰到一个问题就是美国的远程机无法连接126邮箱的SMTP,因为万恶的GFW。于是开始寻找国外邮箱的SMTP,最终发现了Hotmail的使用方法,代码如下 [code="java"] try { String sender="metricsdart@hotmail.com"; //hotmail 邮箱 String reci...

magicfow的专栏 1544

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JavaMail 访问Hotmail

Hotmail使用的是WebDAV来提供基于HTTP协议的应用编程接口,WebDAV(Web 分布式创作和版本控制)已经成为重要的 Web 通讯协议。WebDAV所要解决的问题是:  1.改写保护:HTTP 1.1 无法确保客户端可以保护资源,并且可以在其他客户端同时编辑它们的情况下进行更改。 使用 WebDAV,可以通过多种方式来锁定资源,以便让其他客户端知道您对所讨论的资...

weixin_34281477的博客 502

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 发送邮件 退信,操作javamail收取Hotmail的退信[Java编程]

赞助商链接本文“操作javamail收取Hotmail的退信[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:Hotmail是我最常用的Email Client.固然时下hotmail的容量是小了些,速度也常常慢得让人不由问候盖茨的母亲.但不可否定,它功效相当丰富,也对比安定.尤别的的页面计划更是我...

weixin_39605840的博客 661
上一篇: Rational XDE Developer for Java 入门指南
下一篇: EJB 最佳实践:工业强度的 JNDI 优化
hlplusplus
博客等级 码龄22年 0粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值