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(\ //无需指定服务器地址
store.connect(null, \你的帐号\密码\ if (store.isConnected()) {
Folder inbox = store.getFolder(\ if (inbox.exists()) {
inbox.open(Folder.READ_ONLY); int nCount = inbox.getMessageCount();
System.out.println(\ // 依次显示收件箱中的每封邮件 for(int i=1;i<=nCount;i++){
MimeMessage msg = (MimeMessage) inbox.getMessage(i); System.out.println(\
System.out.println(\ System.out.println(\ System.out.println(msg.getContent()); } } }
} catch (Exception ex) { ex.printStackTrace(); } } }
从上面这段代码我们发现除了 Store store = ses.getStore(\这个语句,同时不需要指定服务器地址外,其他的都跟一个普通的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(\abc@hotmail.com\ Session ses = Session.getInstance(prop); //获得JDAVMail的邮件发送实例
Transport transport = ses.getTransport(\ //连接到Hotmail服务器,请替换为自己的用户名和口令 transport.connect(null, \用户名\口令\ // 准备要发送的邮件
MimeMessage txMsg = new MimeMessage(ses); txMsg.setSubject(\ //邮件发送者地址
InternetAddress addrFrom = new InternetAddress(\abc@hotmail.com\ txMsg.setFrom(addrFrom); //邮件接收者地址
InternetAddress addrTo = new InternetAddress(\cdef@hotmail.com\ txMsg.addRecipient(Message.RecipientType.TO, addrTo); //邮件内容
txMsg.setText(\ 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 跟我交流在使用中遇到的问题。 CNBIE BLOG
-------------------------------------------------------------------------------- JavaMail邮件主题乱码的解决方法 原文:JavaMail邮件主题乱码的解决方法
很多朋友都使用过JavaMail进行邮件发送,在邮件正文中的乱码容易解决。但邮件主题的乱码无论怎样转码总是显示一堆乱码。到底应该怎么处理
CNBIE BLOG
-------------------------------------------------------------------------------- JavaMail之杜绝邮件乱码 原文:JavaMail之杜绝邮件乱码
我一直想不通,RFC822 标准都发布多少年了,为什么还有那么多不符合规范的email 出现呢?一来也许是服务器的问题,二来就是不负责任的程序员的错了。所以我突然意识到,不是只有冷血无情的老板和咄咄逼人的客户让程序员的身心饱受摧残,同行的不经意或经意也在加剧着伤害。
我面对着一份邮件原文发出以上的感慨,客户抱怨该邮件收到的时候在系统中正文显示是乱码。这是一份典型的不合规范的邮件: Content-Type : text/plain ,没有说明 charset,而接下来的正文直接就是未进行任何编码的中文文字。不过 Subject 却是符合规范的(=?gb2312?B?xxxxxxx?=)。
行行色色的不合规范的邮件见过不少,最常见的就是某些header未编码,还有的可能就是,Body编码了而Subject 未编码,最讨厌的就是整份Email都没有编码信息。 恨归恨,问题还是得解决,我修改了代码,处理逻辑如下:
1. 在最开始解析邮件的时候,先解析某些可能带有编码信息的header,并记录为 headerCharset;部分代码如下:
private static Pattern encodeStringPattern =
Pattern.compile(\Pattern.DOTALL);
private final String[] CHARTSET_HEADER = new String[] { \\ ..........
Enumeration enum = message.getMatchingHeaderLines(CHARTSET_HEADER); while (enum.hasMoreElements()) {
String header = (String) enum.nextElement(); Matcher m = encodeStringPattern.matcher(header); if (m.find()) {
this.headCharset = m.group(1);
log.debug(\ break; } }
2. 接着解析邮件体,找到 Body 的时候,看看是否指明 charset 信息;如果指定了,记录为 bodyCharset;如果没有,使用 headerCharset,如果 headerCharset 也是 null,使用默认charset。通常是 ISO-8859-1。
3. 最后再处理邮件 header,如果没有charset 信息,使用 bodyCharset,否则使用默认charset。
以上的解决方案,只要邮件的Body或者Header中的一个提供了编码信息,那么都可能可以避免乱码的产生,如果哪份遭千杀的邮件,Body 用 gb2312 编码,Subject 却是未编码的日文,那我只能长叹被击败了。如果整份邮件都没有编码信息的话,除非你确定邮件都是指定的编码并进行转码,否则只有听天由命。
最后还是要呼吁一声,请遵循规范!
Javamail中的常见中文乱码问题与解决办法(综合) JSP教程-Java技巧及代码
在使用javamail api开发邮件服务系统时,我们常常会碰到很多中文乱码问题,下面就分别介绍如何解决这些问题。
1.发送名称含中文的附件到邮件服务器,用别的邮件接收程序接收到的附件名显示为乱码 解决办法:
在调用MimeBodyPart的setFileName()时使用Base64编码。例如: