`
bjxagu
  • 浏览: 165347 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

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

分享到:
评论

相关推荐

    JavaMail访问Hotmail邮箱

    来访问和操作这个邮箱进行邮件的收发。但是这个邮箱有一个限制就是它并不提供POP3或者SMTP服务,也就是说一般的邮件客户端工具无法使用这个邮箱,虽然现在有不少的邮件工具可以支持Hotmail邮箱,但是如果我们需要在...

    JavaMail - 注册邮箱激活源码

    3. 发送激活邮件:利用JavaMail API,服务器创建一封包含验证码的邮件,发送至用户提供的邮箱地址。 4. 邮件内容:邮件中通常会包含一个链接,链接中带有加密的用户ID和验证码,以便服务器验证。 5. 用户点击激活...

    JavaMail 具备垃圾邮件过滤功能的邮箱

    总的来说,这个JavaMail邮箱系统是一个集成了邮件处理、用户设置和智能过滤的综合平台,通过利用JavaMail库和朴素贝叶斯算法,提供了一种高效且用户友好的邮件管理方案。开发者在设计时考虑到了用户体验和安全,使其...

    javamail实现邮箱与邮箱发送邮件

    本示例将重点介绍如何使用JavaMail库来实现163邮箱向腾讯邮件发送邮件的流程。 首先,确保你的项目中已经包含了JavaMail所需的依赖。通常,这可以通过在Maven或Gradle的构建文件中添加对应的依赖完成。例如,如果你...

    javaMail源代码,可以使用QQ邮箱等发送邮件

    这个压缩包包含的源代码示例展示了如何使用JavaMail API通过QQ邮箱发送邮件,这对于开发者来说是一个实用的工具,尤其是在开发用户注册验证或通知功能时。让我们深入探讨一下JavaMail的核心概念以及如何使用它与QQ...

    JavaMail邮箱验证实现

    JavaMail是一种在Java应用程序中发送和接收电子邮件的标准API,它为...通过这种方式,你可以确保用户提供的邮箱地址真实有效,提升应用的安全性和用户体验。在实际开发中,可能还需要根据具体需求进行调整和优化。

    Android使用JavaMail开发邮箱最新jar包集合

    在Android平台上进行邮箱服务的开发时,JavaMail是一个不可或缺的工具。JavaMail是一个开源库,它为Java应用程序提供了访问邮件服务器的标准API。本资源提供的"Android使用JavaMail开发邮箱最新jar包集合"包含了开发...

    javamail开发邮箱使用的jar包

    在 Android 开发中,如果你需要实现邮箱相关的功能,例如发送邮件、读取邮件等,JavaMail 是必不可少的工具。这个压缩包包含三个重要的 JAR 文件,它们分别是: 1. **mail.jar**:这是 JavaMail 的核心库,提供了...

    javamail发送、接收邮件

    JavaMail API是由Sun Microsystems开发的一套API集合,它为Java应用程序提供了访问标准Internet邮件协议的能力,如SMTP(Simple Mail Transfer Protocol)、POP3(Post Office Protocol Version 3)和IMAP(Internet...

    邮箱验证--javamail的简单使用

    JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一套全面的API,使得开发者能够方便地处理SMTP、POP3、IMAP等邮件协议。本篇文章将详细探讨JavaMail的简单使用,包括如何设置、配置...

    javaMail 用java实现的邮箱验证,找回密码

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中处理电子邮件。它提供了全面的API,使得开发者能够方便地发送、接收和操作...通过深入理解和熟练运用JavaMail,你可以构建更加安全、用户体验良好的Web应用。

    JAVAMail邮箱服务器搭建步骤详解

    【JavaMail邮箱服务器搭建步骤详解】 在现代的数字化工作中,电子邮件已经成为不可或缺的沟通工具。对于企业和个人来说,拥有一个自定义的企业邮箱服务器可以提供更高的安全性和管理效率。Apache James是基于Java...

    javamail收取Hotmail的退信

    Hotmail 是我最常用的Email Client。虽然时下hotmail的容量是小了些,速度也常常慢得让人不禁问候盖茨的母亲。但不可否认,它功能相当丰富,也比较稳定。尤其它的页面设计更是我等web编程人员的重要参照。 不象很多...

    JavaMail邮箱发送,activation.jar包

    通过JAF,Java程序可以自动识别邮件中的不同部分(如文本、图片、附件等),并对其进行正确的处理。 在JavaWeb应用中,使用JavaMail发送邮件通常涉及以下步骤: 1. **引入依赖**:首先,你需要将`javamail.jar`和`...

    使用jsp实现javaMail邮箱功能开发

    通过以上步骤,你可以利用JSP和JavaMail API开发出一个能够从Web界面发送邮件的应用。在实践中,还可以进一步扩展功能,例如支持HTML格式的邮件、添加多个收件人、提供邮件模板等。学习和掌握这些技术,对于提升Web...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    创建 `Store` 对象后,通过 `getStore("imap")` 连接到邮件服务器,然后打开指定的邮箱 folder,例如 `inbox = store.getFolder("INBOX")`。接着,调用 `folder.open(Folder.READ_ONLY)` 打开邮箱,然后可以获取邮件...

    javamail(带界面的javamail)

    通过 MimeMultipart 类,可以访问邮件中的多个部分,并对每个部分进行相应的处理。 总的来说,"javamail(带界面的javamail)"项目是一个实用的示例,涵盖了JavaMail的核心功能和GUI编程的结合。它可以帮助开发者理解...

    java实现邮箱推送消息(JavaMail)的Demo

    本Demo将详细介绍如何使用JavaMail API来实现邮箱消息的推送。 首先,你需要在项目中引入JavaMail的相关依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;com.sun.mail&lt;/groupId&gt;...

    Gmail邮件通过JavaMail发送(不带附件与带一个附件)

    以上就是使用JavaMail API通过Gmail发送邮件的基本过程,无论是无附件还是有附件,主要区别在于是否创建和添加`MimeBodyPart`以及`MimeMultipart`。通过理解和应用这些概念,你可以灵活地构建满足需求的邮件系统。

    基于JavaMail开发的Android邮箱项目源码.zip

    通过学习和分析这个基于JavaMail的Android邮箱项目源码,开发者可以深入理解如何在Android平台上使用JavaMail API实现邮件功能,为自己的应用添加邮件通信模块。同时,这也是一个很好的实践案例,帮助开发者提升在...

Global site tag (gtag.js) - Google Analytics