JavaMail结合JSP实现中文邮件收发系统
田敬,代亚非
北京大学计算机系网络分布式实验室(100871)
摘要:JavaMail的推出使得用Java开发邮件系统变得非常容易,但是要想正确的处理各种各样形式
的MIME类型的Mail,就需要了解MIME的规范以及怎样和Java中的对象相对应。另外在处理中文
Mail时,还会遇到Java中的字符集转换以及Mail中的编码问题。本文重点介绍了MIME协议规定的
邮件格式标准及数据的编码问题。
关键字:JavaMail  邮件结构字符编码
编程是学些什么东西少儿1 引言
网络的迅速发展使得已经成为我们必不可少的通信工具,而的形式也从原来的纯文本方式变成现在的Html页面并加载附件的多彩形式。的普及性以及其数据的多样性使得它成为人们存储自己重要信息、数据的方式。现代化的移动办公要求我们处理邮件用的客户程序应该可以随时随
地的方便使用,而WEB 方式的邮件收发系统恰恰满足了这样的需求,这样JSP结合JavaMail也就成了邮件收发系统的最佳解决方案。
Java语言一直以其独有的强大的网络能力而著称,JavaMail的推出无疑再次扩展了Java的网络能力。然而,虽然Java提供了Mail的开发包但要想实现一个邮件系统还要熟悉的格式结构,另外在开发中文邮件系统时还要了解Mail的编码问题以及Java中的字符集转换问题。本篇文章将介绍如何用JavaMail结合JSP建立一个WEB方式的邮件收发系统(下面简称WEBMAIL),并重点讨论MIME协议规范以及邮件系统所涉及的数据编码的问题。
2 系统概述
从图1a中可以看出,我们的邮件收发系统主要是完成邮件内容信息的接受、显示以及和SMTP、POP3服务器的交互工作。
图1b给出了JavaMail处理消息的流程。图1a中的撰写邮件和发送给SMTP服务器就分别对应JavaMail中的生成Message和Transport一个Message,而显示邮件内容则是通过JavaMail将从POP3服务器上取得的Message还原成邮件原文显示给用户。
我们的WEBMAIL一方面负责与POP3、SMTP服务器收发Message,另一方面负责将要发出去的内容
组成符合MIME协议的Message和将收到的Message还原成为原始邮件内容显示给用户。对于如何用POP3、SMTP协议通过服务器收发邮件很多文章都有介绍,而且借助JavaMail很容易实现,本文将不在赘述。下面我们将重点讨
论如何将一个Message 还原成邮件原文,进而了解MIME 协议和邮件中的编码问题。
3 相关协议及其Java 解决
SMTP 协议:这是“简单邮件传输协议”,最初互联网上的就是通过这个协议在不同主机上传
播的。此协议只支持传输7bit 的字节流(每个字节的最高位将被强制转换为0),这就决定了SMTP 协议只能传输简单的ASCII 字符集的纯文本英文邮件。
POP3协议:虽然SMTP 协议支持了邮件的收发,但并不是每个人都能够有机器长时间做SMTP 服务器。这样就很多人共用一台SMTP 服务器,POP3协议正是这种情况下支持用户从自己的SMTP 服务器上拿到自己邮件的协议。
图 2 MIME 邮件格式
图1a WEBMAIL 的逻辑流程              图1b JavaMail 的消息处理流程
MIME协议:MIME是“多用途互联网邮件扩展”的简称。由于SMTP协议只能收发纯文本方式的英文邮件极大的影响了邮件的可用性,人们就用MIME协议将复杂形式的邮件内容组织成为符合SMTP协议要求的形式,然后通过已有的SMTP协议进行邮件传输。要想正确还原从POP3服务器上取得的Message,就要深入了解MIME 协议内容。
MIME协议主要解决两个问题,一是如何将非ASCII码的字节流(非英文文本或二进制文件)转换成为SMTP服务器可以接受的7bit字节流;二是如何在邮件中组织正文及附件等多个部分。此小节我们重点讨论如何组织正文及附件等多个部分。important高级词汇
图2就是一个MIME邮件的例子,其中Header部分的意义非常明显,这里不再介绍。Body部分我们发现是以树形结构组织的,其中根节点类型说明(Content-Type)为“多部分混合”(multipart/mixed),并且各部分用边界(boundary)分隔。同样每个子节点也可以再有自己的子节点,从而形成了一个树形的文档结构,其中每一个叶节点就是一个文本正文、超文本正文或是邮件附件。
用JavaMail获取到一个Message的输入流后,应该如何处理呢?图3给出了JavaMail中与MIME邮件相关的类之间的关系。显然,邮件Body部分中包含子节点的部分为Multipart类的实例,而其中的叶节点就是BodyPart类的实例。那么,我们首先用输入流构造一个Message对象判断其是不是叶节点,然后
分情况构造BodyPart 或Multipart,如果是Multipart则递归分解,直到分解到叶节点。图4给出了对含有子节点的部分的解析代码。
图 3 MIME相关的Java类图
当得到叶节点(文本正文、超文本正文或附件)后,就可以将其读出并存成文件,以便用户通过WEB访问到该正文或附件。对于多部分的邮件,解析时应该保存其结构信息,这样JSP就可以通过此信息组织呈现给用户的WEB页面。比如有附件的邮件,就可以创建分FRAME的网页,分开显示邮件正文和附件列表;而无附件的邮件就不必创建FRAME网页。
solr配置
图 4 多部分邮件正文解析代码
4 字符编码及字符集转换问题
前面提到MIME要解决的另外一个问题就是将SMTP协议不支持的字节流转换成为SMTP协议支持的字节流。比如我们要通过邮件传输一个附件文档,该附件文档就是一个8bit字节流,如果简单的直接通过SMTP发送,其最高位信息将被丢失。MIME 规定可以用两种编码方式将8bit的字节流编码成为低于8bit的字节流,它们分别是BASE64编码(BASE64将8bit字节流编码成6bit字节流)和QP编码。这两种编码方式同样应用在对中文的编码上。例如如果邮件中文题目叫做“CVS介绍”,那么其编码后的形式可能为:
Subject: =?gb2312?B?Q1ZTLS3QpMX0LnBwdA==?=
webserviceexception标题字符串以”=?”开始,以”?=”结束。”gb2312”表示字符串的字符集,而以”?”分隔的”B”就表示此字符串的编码方式为BASE64。我们处理此标题时就要先将BASE64编码的6bit字节流转换为原来的8bit字节流,再根据字符集”gb2312”转换为Java中的String类型。这里可以简单的使用JavaMail提供的MimeUtility.decodeWord()静态方法将编码后的字符串解码。
5 结束语
通过以上对邮件内容组织以及内部编码的讨论,我们发现虽然邮件的组织形式比较复杂多样,但是借助JSP和JavaMail开发包,可以很轻松的实现我们自己的WEB 邮件收发系统。jsp中文全称
参考文献
1. RFC2047,RFC1939,RFC821
2. JavaMail API Design Specification(Version1.2)
3. www.javaworld/channel_content/jw-topical-index.shtml
>zblogphp万能型主题模板希望

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。