解析电子邮件的基本概念及JavaMail API邮件功能使用
电子邮件的基本概念介绍
电子邮件用于网上的信心传递和交流,它是最重要的internet服务之一。据统计internet有30%的业务是电子邮件有关的。同时我们也不可否认它在我们的日常生活、工作办公方面扮演着很重要的角色。譬如:许多办公自动化项目(oa)中都要附带发送邮件的功能,如果还要使用outlook等手工方式就不适合,在这个高速的时代,我们需要提供工作效率,让工作能够自动化。同时在许多网站中也都需要附带发送邮件的功能:给新注册的用户发送一封包含其注册信息的欢迎e-mail、将网站的最新活动信息通过e-mail发送给所有的注册会员等等。
在开始电子邮件开发前:我们需要明白一下几个概念:电子邮件系统、邮件服务器、电子邮件、邮件客户端软件、邮件传输协议、电子邮件的传输过程。
电子邮件系统
与传统的邮政服务相类似,电子邮件系统由电子邮局、电子邮件发送、接收系统组成。发送者和接收者通过电子邮件发送、接收系统来发送和接收电子邮件,他们实际上是运行在计算机上的邮件客户端程序。电子邮局起着一个桥梁的作用,它实际上是运行在服务器上的邮件服务器程序。电子邮件的处理流程也和邮政服务相类似。
邮件服务器
邮件服务器是一种用来负责电子邮件收发管理的设备。在internet上提供了大量的电子邮件服务器,如:126、163、hotmail…。
电子邮件服务器主要提供的功能:
1、 接收用户投递的邮件。
2、 将用户投递进来的邮件转发给目标邮件服务器。
3、 接收其他电子邮件服务器转发来的邮件并该邮件存储到其管理的用户邮中。
4、 为前来读取邮件的用户提供读取邮件的服务。
邮件服务器构成了电子邮件系统的核心。每个收信人都有一个位于某个邮件服务器上的邮箱(mailbox)。bob的邮箱用于管理和维护已经发送给他的邮件消息。一个邮件消息的典型旅程是从发信人的用户代理开始,邮件发信人的邮件服务器,中转到收信人的邮件服务器,然后投递到收信人的邮箱中。当bob想查看自己的邮箱中的邮件消息时,存放该邮箱的邮件服务器将以他提供的用户名和口令认证他。alice的邮件服务器还得处理bob的邮件服务器出故障的情况。如果alice的邮件服务器无法把邮件消息立即递送到bob的邮件服务器,alice的服务器就把它们存放在消息队列(message queue)中,以后再尝试递送。这种尝试通常每30分钟左右执行一次:要是过了若干天仍未尝试成功,该服务器就把这个消息从消息队列中去除掉,同时以另一个邮件消息通知发信人(即alice)。
电子邮件
电子邮件是一种通过网络实现相互传送和接收信息的现代化通信方式。它是—种用电子手段提供信息交换的通信方式,是internet应用最广的服务,通过网络的电子邮件系统,用户可以用非常低廉的价格,以非常快速的方式,与世界上任何一个角落的网络用户联系,这些电子邮件可以是文字、图像、声音等各种方式。同时,用户可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。
电子邮件由信封和内容两个部分组成。信封又称邮件头,电子邮件服务器根据信封上的信心来传递邮件的。内容称为邮件体,它用于提供邮件的具体内容。
internet上的电子邮件地址全球唯一,其格式为“邮箱名@邮件服务器域名”。域(邮件域)是电子邮件服务器的基本管理单位,邮件服务以域为基础,每个邮箱对应一个用户。其中邮件服务器域名必须是已注册的dns域名,并且必须要与mx(邮件交换机)记录匹配。dns用于将域名、主机名解析为ip地址。mx记录指向该域名的邮件服务器主机记录,为邮件服务专用。
邮件客户端软件
邮件客户端软件负责与邮件服务器通讯,主要用于帮助用户将邮件发送给smtp服务器和pop3/imap邮件服务器读取用户的电子邮件。邮件客户端软件通常集撰写、发送、接收邮件于一体。
电子邮箱
每一个电子邮件服务器之上都可以开始多个电子邮箱,电子邮箱也称之为e-mail地址。它类似于现实生活中的通讯地址,用户通过它接受别人发来的电子邮件和向别人发送电子邮件。
电子邮箱的获得需要在电子邮件服务器上进行申请,确切的说,电子邮箱其实就是用户在邮件服务器上申请的一个账户。邮件服务器把接收到的邮件保持到为某个账户所分配的邮箱空间中,用户通过其申请的用户名和密码登陆到邮件服务器上查看该地址已经收到的电子邮件。
电子邮件的传输过程
电子邮件系统采用客户/服务器模式。电子邮件传送需要用到以下3个重要模块:
ua(mail user agent,邮件用户代理):用户通过它与电子邮件服务器打交道。mua实际上就是邮件客户端软件。
mta(mail transfer agent,邮件传输代理):它主要负责处理所有接收和发送的邮件,为mua或者mta提供邮件发送服务,接收其他mta发送过来的邮件。
mda(mail delivery agent,邮件投递代理):它负责邮件本地投递。当mta决定某邮件发送本地用户时,mta将邮件交给mda程序进行分发,也就是说投递到用户的。
具体的传递过程如下:
1、 发件人利用mua将邮件发送给mta。
2、 mta收到邮件后判断收件人是不是本地账户,如果是本地账户,交由mda投送到该账户的邮箱中,完成发送过程,跳到第5步。如果不是则执行下一步骤。
3、 mta根据其邮件中继转发设置来决定如何转发邮件。
4、 最终目的的mta将受到的交给他的mda处理,有mda将邮件投递到收件人的邮箱中。
5、 收件人利用mua通过pop/imap协议连接到邮箱所在的服务器,请求查看自己的收件箱是否有邮件,如果有邮件,将会通过它传送个收件人的mua。
注意:提示邮件访问服务的是pop或者imap服务器软件,而并非当初收下邮件的mta,两者的角色是分离的。
邮件传输协议
电子邮件服务传输主要是用到以下3中网络协议
smtp(简单邮件传输协议)
smtp是simple mail transfer protocol。标准tcp端口是25。mua将邮件发送到mta,mta将邮件发送给下一个mta,都是要使用smtp。smtp的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
smtp是一个“单向”的协议,它不能用户从其他邮件服务器收取邮件。它本身是采用客户/服务器模式,负责发送邮件的smtp进程就是smtp客户端,负责接收邮件的smtp进程就是smtp服务器。一个完整的smtp通信过程主要包括建立连接、传送邮件、释放连接三个过程。
建立连接:首先由发件人将要发送的邮件发送到邮件缓存,smtp客户端定期扫描邮件缓存,一旦发现有邮件,就与smtp服务器建立tcp连接,然后发送hrllo命令以附上发送方的主机名。
传送邮件:smtp客户端使用mail命令开始传送邮件,该命令提供发件人的地址;然后执行rcpt命令,并提供收件人地址;最后执行data命令传送邮件内容。
释放连接:邮件传送完毕后,smtp客户端发送out命令请求关闭tcp连接。
pop(邮局协议)
pop是post office protocol。标准tcp端口为110。主要用于电子邮件的接收。mua经由pop协议连接到mta的用户收件箱,以读取或下载用户在收件箱中邮件。
目前用的较多的pop协议是pop3。pop3使用 tcp 作为传输协议。
imap(internet信息访问协议)
imap是internet message access protocol。标准tcp端口为143,它也是让mua从mta收取邮件。目标球imap协议的版本为imap4。
pop和imap两者都可以用于收取邮件,都是采用客户/服务器模式,两者最主要的区别就在于他们检索邮件的方式不同。使用pop时,邮件驻留在服务器中个,一旦接收邮件,邮件都从服务器上下载到用户计算机上。而imap则能够然该用户了解到服务器上存储邮件的情况,已下载的邮件仍然滞留在服务器中,以便于实现邮件归档和共享。
javamail
一、javamail简介
javamail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是sun发布的用来处理email的api。它可以方便地执行一些常用的邮件传输。javamail api是sun公司为方便java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如:smtp、pop3、imap。开发人员使用javamail api编写邮件处理软件时,无须考虑邮件协议底层的实现细节,只要调用javamail开发包中相应的api类就可以了。
二、javamail开发环境
在进行javamail开发之前必须要导入相应的jar包。该jar包可以到oracle的官网上面下载:http://www.oracle.com/technetwork/java/javamail/index.html。
下载完成后解压可以得到如下一个目录:
其中mail.jar:就是开发javamail程序所必须要用到的核心开发包。
lib子目录:该目录下包含5个独立的邮件开发包:smtp.jar、pop3.jar、imap.jar和mailapi.jar,这5个jar文件是对mail.jar文件的分类包装。其中mailapi.jar封装了创建邮件内容和面向普通开发人员调用邮件发送和接收的api类,其它三个jar文件则是封装了它们名称相对应协议的服务实现程序。。在编译java邮件程序时,只需要mailapi.jar文件即可,但是,在运行时必须要有相应邮件协议的底层服务实现程序。如果应用程序中只需要使用到邮件发送功能,则可以只安装smtp.jar和mailapi.jar这两个文件,如果应用程序只需要使用邮件的接收功能,则可以只安装pop3.jar或imap.jar和mailapi.jar这两个jar文件,而不用安装整个mail.jar文件。
lib目录如下:
三、javamail api的介绍
javamail api按其功能划分通常分为如下三大类“:
1、创建和解析邮件内容的api。message类是创建和解析邮件的核心api。它的实例对象代表了一封电子邮件。
2、发送邮件的api。transport类是发送邮件的核心api类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,如smtp协议。
3、接收邮件的api。store类是接收邮件的核心api类,它的实例对象代表了实现某个邮件接收协议的邮件接收对象,例如pop3协议。
javamail的工作流程如下:
在这个工作流程中,message、session、transport、store四个对象紧密相连的完成一封电子邮件的发送和接收。我们只需要了解这个四个核心api的功能和作用,知道他们的工作关系和电子邮件的工作流程,就能够很容易的编写出javamail来了。对于javamail的辅助类而言,当我们需要他们的时候可以顺藤摸瓜,查看文档来解决。
核心api的介绍:
message
message 类是创建和解析邮件的核心api,它的实例对象代表一封电子邮件。在客户端发送邮件时,先穿件邮件的api,将创建的邮件的数据封装到message对象中,然后把这个对象传递给邮件发送api发送出去。在客户端接收到邮件时,邮件接收api把接收的油价数据装在message的实例对象中,客户端在使用邮件解析api从这个对象中解析出来接收到的邮件数据。
session
session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。session对象根据这些会话信息构建邮件收发的store和transport对象,以及为客户端创建message对象提供信息支持。
transport
transport 类是发送邮件的核心api类,它的实例对象,代表实现了某个邮件发送协议的邮件发送对象,例如smtp 协议。客户端程序创建好message对象后,只需要使用邮件发送api得到 transport 对象,然后把 message 对象传递给 transport 对象,并调用它的发送方法,就可以把邮件发送给指定的smtp服务器。
store
store 类是接收邮件的核心api类,它的实例对象代表实现某个邮件接收协议的邮件接收对象,例如pop3和imap协议。客户端程序接收邮件时,只需要使用邮件接收api得到store对象,然后调用store对象的接收方法,就可以从指定的 pop3服务器中获得邮件数据,并把这些邮件数据封装到表示邮件的message对象中。
四、实例
public class javamail_01 { public static void main(string[] args) throws exception { properties props = new properties(); props.setproperty("mail.smtp.auth", "true"); props.setproperty("mail.transport.protocol", "smtp"); session session = session.getinstance(props); session.setdebug(true); message msg = new mimemessage(session); msg.setsubject("这是一个测试程序...."); msg.settext("你好!这是我的第一个javamail程序---陈明"); msg.setfrom(new internetaddress("******@163.com")); transport transport = session.gettransport(); transport.connect("smtp.163.com", 25, "*******", "********"); transport.sendmessage(msg,new address[]{new internetaddress("chenssy995812509@sina.cn")}); system.out.println("邮件发送成功..."); transport.close(); } }