电子邮件系统关键技术及协议研究

2016-02-24 08:34李现全蒋2孔黎明
北京电子科技学院学报 2016年2期
关键词:附件电子邮件邮件

李现全蒋 华,2孔黎明

电子邮件系统关键技术及协议研究

李现全1蒋 华1,2孔黎明1

1.北京电子科技学院,北京 100070; 2.西安电子科技大学,西安 710071

随着互联网技术的发展,电子邮件作为企业开发重要组件,是企业组织内部人员进行信息交流的重要手段之一。开发邮件系统需要研究相关邮件传输协议,如SMTP、POP3、IMAP等。本文利用Javamail作为目前流行的邮件系统开发技术,研究和开发了一种邮件系统,并给出实例分析。

电子邮件;Javamail;SMTP;POP3;IMAP

引言

随着互联网及办公自动的快速发展,电子邮件已经成为政府机关、企事业单位内部信息交流的重要手段之一。在日常生活中人们发送电子邮件主要通过特定的邮件管理软件如Outlook Express和FoxMail等实现。还有一种就是通过网页访问邮件服务器发送接收邮件。这两种方式都可以简单方便的发送接收邮件。本文主要探讨开发专有的邮件系统,使其既可以作为单独系统用于邮件发送与接收,又可以作为其他企业应用的重要组件。开发一个邮件系统需要对其关键技术及协议做深入研究。Javamail作为目前主流的邮件系统开发技术,已经得到业界认可。邮件传输协议主要有SMTP协议、POP3协议和IMAP协议。在开发系统之前,有必要对所需技术和协议做深入研究,掌握电子邮件系统开发API,熟悉邮件发送及传输流程,了解邮件格式。

1 关键技术研究

1.1 Javamail技术介绍

Javamail是Sun公司为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,不同的厂商可以提供自己的实现类,它支持一些常用的邮件协议,如SMTP、POP3、IMAP等。

1.2 Javamail API介绍

Session类:Session类主要用于配置整个应用程序所需的环境信息,主要体现在两方面:一方面通过Properties对象设置邮件服务器的主机名、端口号、采用的邮件发送和接收协议等属性信息和网络连接的会话信息;另一方面初始化Javamail环境。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。

Javamail API按其功能划分通常可分为如下三大类,如图1所示。

(1)创建和解析邮件内容的API:Message抽象类是创建和解析邮件的核心,其实现类MimeMessage能够解析MIME类型、MIME头信息,最终的封装对象代表一封电子邮件。

(2)发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,通过属性mail.transport.protocol指定传输协议,默认为 SMTP协议。

(3)接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,通过属性mail.store.protocol指定存储邮件协议默认为POP3协议。Store类能够实现特定邮件协议上的读、写、监视、查找等操作。用户认证的 API: Authenticatior类是邮件认证的核心API类,它的实例对象代表实现了某个邮件认证对象,通过用户名和密码访问受保护的资源。

1.3 JAF框架介绍

JAF(JavaBeans Activation Framework,JavaBeans激活框架)是目前互联网常用的处理邮件数据的数据处理框架,通过封装数据对外暴露接口方便其他应用程序调用。经过JAF框架处理过的数据可以方便应用程序对其进行查看、编辑等操作。对于通过JAF封装的数据,应用程序通过JAF提供的接口可以完成如下功能:访问数据源中的数据、获知数据源的数据类型、获知可对数据进行的各种操作、用户对数据执行某种操作时,自动创建执行该操作的软件部件的实例对象Javamail API可以利用JAF从某种数据源中读取数据和获知数据的MIME类型,并用这些数据生成MIME消息中的消息体和消息类型。

2 邮件协议研究

尽管Javamail API与邮件协议无关,在这里还需要深入研究相关邮件协议。目前邮件系统传输协议主要有SMTP协议、POP协议、IMAP协议及MIME协议,下面将对这四个协议做具体分析:

SMTP简单邮件传输协议(Simple Mail Transfer Protocol)由RFC 821定义用于发送电子邮件的机制。在 Javamail API环境下,基于SMTP服务器通信,经过SMTP服务器周转,用户最终经由 POP(Post Office Protocol)或 IMAP (Internet Message Access Protocol)服务 获得信息。由于支持身份验证,不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。目前Javamail API中并不支持配置服务器来中继消息或添加删除邮件账号等功能。

POP代表邮局协议是由RFC 1939定义用来接收邮件的机制协议。虽然POP作为互联网接受邮件的协议得到大规模应用,但本身也存在一些缺陷,例如不具有实时更新以及计算功能。当采用Javamail实现邮件服务时,需要自己添加这些功能。

IMAP是RFC 2060定义的更高级的用于接收消息的协议。IMAP代表因特网消息访问协议,在使用到IMAP时,邮件服务器必需支持这个协议。POP协议和IMAP在某些方面并不完全兼容。基于Javamail的程序就可访问在服务器上拥有的多个文件夹,并且这些文件夹可以被多个用户共享。

MIME (Multipurpose Internet Mail Extensions)代表多用途因特网邮件扩展标准。虽然不是邮件传输协议,但对传输内容的消息、附件及其它的内容定义了格式。主要有RFC 822、RFC 2045、RFC 2046和RFC 2047。邮件传输过程如图2所示。

3 邮件传输过程代码分析

(1)邮件发送

发送电子邮件消息这一过程包括获取一个会话,创建并填充一则消息,然后发送。首先创建一个Properties对象,存放邮件服务器的信息,生成Session对象,从这个 session中创建一条Message,给这条Message设定From TO CC BCC和Subject,用Transport.send()发送邮件。

(2)邮件内容读取

为读邮件,首先创建一个Properties对象,存放邮件服务器的信息,给Properties对象赋值,生成Session对象,从这个session中创建Store,从Store中获取Folder,从Folder中读取邮件内容。

(3)邮件回复

Message类引入一个reply()方法来配置一个新Message,包括正确的recipient(收件人)和添加“Re”(如果没有就添加)的正确的subject。这样做并没有为消息添加新内容,仅仅将 from或reply-to(被回复人)头复制给新的收件人。这种方法用一个 boolean参数指定消息只回复给发件人(false)或回复给全体(true)。

(4)邮件转发

转发消息首先要分析邮件消息组成部分,通常消息格式是 MIME格式,消息是一般由BodyPart组成,特殊情况下是由MimeBodyPart组成。不同的body part(信体部件或正文部件)结合成一个容器,命名 Multipart,还有的是MimeMultipart。要转发一条消息,先创建消息正文然后加入要转发消息组成一个Multipart(多部件),最后按照地址发送即可。

(5)邮件附件处理

附件是邮件消息的相关资源,如通常不包含在消息正文里文本文件、电子表格或图像等。发送附件非常像转发消息。建立各部分以组成完整消息。完成第一部件,即消息正文后,添加其它部件,其中每个DataHandler都代表附件,而不是转发消息情况下的共享处理程序。如果从文件中读附件,附件的数据源是 FileDataSource。而如果从 URL中读时,附件的数据源是URLDataSource。一旦存在DataSource,只要先把它传递给 DataHandler构造器,最后再用setDataHandler()把它附加到BodyPart。假定您要保留附件的原始文件名,最终要做的是用BodyPart的setFileName()方法设置与附件相关的文件名。

4 Javamail技术发送邮件实例分析

4.1 使用Javamail技术发送一封简单邮件

(1)创建包含邮件服务器的网络连接信息的session对象

Session session = Session. getInstance (Properties props);

(2)创建包含邮件内容的Message对象Message msg=new MimeMessage(session); (3)创建Transport对象、连接服务器、发送Message、关闭连接。

Msg.send();

4.2 发送复杂邮件

(1)复杂邮件的开发实例分析

消息的类型采用 MimeMessage msg=new MimeMessage(session);Mail Extensions多功能Internet邮件扩充服务,它是一种多用途网际邮件扩充协,能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。Message中的方法:

1.msg.setFrom();设置发件人

2.msg.setSubject();设置邮件主题

3.msg.setRecipients();设置收件人

4.msg.setReplyTo(Adress[]);设置回复邮件的地址

5.“sina”<sina@sina.com>;收件人、发件人友好显现方式

6.InternetAddress.parse(String s);将字符串转换成InternetAddress类型的数组

(2)设置复杂邮件

1.设置邮件类型

MimeMultipart msgMultipart = new MimeMultipart(“mixed”);混合模式

2.设置消息文本

msg.setContent(msgMultipart);设置消息为混合类型的正文

3.设置混合文本的组成部分

MimeBodyPart attch1=new MimeBodyPart ();第一个附件

MimeBodyPart attch2=new MimeBodyPart ();第二个附件

MimeBodyPart content=new MimeBodyPart ();正文部分

msgMultipart.addBodyPart(attch1);将附件添加到混合文本中去

msgMultipart.addBodyPart(attch2);

msgMultipart.addBodyPart(content);

4.附件的初始化

DataSource ds2=new FileDataSource(“文件路径”);

DataHandler dh2=new DataHandler(ds2);

attch2.setDataHandler(dh2);将附件包装成DataHandler对象

attch2.setFileName("slogo.gif");设置附件的名称

5.Html类型的正文的初始化

MimeMultipart bodyMultipart = new MimeMultipart(“related”);设置文本为依赖注入关系

content.setContent(bodyMultipart);设置正文为bodyMultipart

MimeBodyPart htmlPart=new MimeBodyPart ();设置html文本部分

MimeBodyPart gifPart=new MimeBodyPart ();设置图片部分

bodyMultipart.addBodyPart(htmlPart);

bodyMultipart.addBodyPart(gifPart);

html文本部分初始化:

htmlPart.setContent("html文本部分 <img src='http://www.itcast.cn/logo.gif'>",

"text/html;charset=gbk");

图片部分初始化:

DataSource gifds=new FileDataSource(“图片路径”);

DataHandler gifdh = new DataHandler (gifds);

gifPart.setDataHandler(gifdh);

gifPart.setHeader("Content-Location"," http://www.itcast.cn/logo.gif");设置图片代表正文中的那个位置

6.保存信息的修改

msg.saveChanges();保存复杂文本

7.中文编码

MimeUtility.encodeText(“中文”);

5 结束语

开发一个性能优良的邮件系统,需要了解邮件系统开发所需要的技术和邮件传输过程中所涉及到的协议。Javamail作为当今邮件系统开发主流技术,是邮件系统开发的关键,本文重点分析了API用法以及如何与特定的协议融合。

[1]张孝祥,方立勋.Java邮件开发详解[M].北京:电子工业出版社,2007.

[2]李扬.安全增强电子邮件系统安全性分析[J].保密科学技术,2014(2):20-30.

[3]杨清兰.电子邮件定题信息服务的安全策略[J].内蒙古科技与经济,2014(4):44-57.

[4]杨旭士.基于James技术的企业电子邮件系统设计与实现[J].计算机与现代化,2011 (4):61-63.

[5]钟路,刘玲,夏红霞.基于Java Mail API的Web邮件系统开发[J].武汉理工大学学报,2006,28(6):84-86.

[6]孙卫琴,李洪成.Tomcat与Java Web开发技术详解[M].北京:电子工业出版社,2004.

[7]邱林,张凌.基于B/S三层结构的电子邮件解决方案明[J].计算机工程,2003,29 (19):158-159.

[8]屈培,刘莉,葛蓁.基于JavaMail的电子邮件群发[J].电脑知识与技术(学术交流),2007,3(17):1285-1286.

[9]钟忺,刘春燕.基于JavaMail API的邮件认证与接受[J].计算机与数字工程,2007,35 (3):145-147.

[10]王勇,陈楠.基于Java语言的电子邮件系统的实现[J].现代电子技术,2004(9):26-30.

Key Techniques and Protocols of E-mail System

Li Xianquan1Jiang Hua1,2Kong Liming1

1.Beijing Electronic Science and Technology Institute,Beijing 100070,China; 2.Xi’dian University,Xi’an Shaanxi710071,China

With the development of Internet technology,as an important component of corporate development,e-mail is an important means of information within the organization personnel exchanges.It is also need to study related mail transfer protocols,such as SMTP,POP3,IMAP to develop mail system.As the most popular e-mail systems development technology,Javamail is the preferred mail system development.

e-mail;Javamail;SMTP;POP3;IMAP

TP393.08

A

1672-464X(2016)2-26-05

(责任编辑:鞠 磊)

本论文受“基本科研业务费(项目号:2015CL-LXQ)”

** 作者简介:李现全(1990—),男,北京电子科技学院;专业:电子与通信工程;学历:工程硕士。

猜你喜欢
附件电子邮件邮件
有关旅行计划的电子邮件
基于James的院内邮件管理系统的实现
来自朋友的邮件
一封邮件引发的梅赛德斯反弹
新型武器及附件展呈
德国军队使用的手枪套及其附件
小测试:你对电子邮件上瘾了吗?
Outlook和Foxmail邮件互导
点点鼠标,论坛附件一把抓
有奖问答