JMail知识总结

1 javamail 简介:  

 

   javamail sun 公司提供的一套完整的用于读取,编写和发送由件的API ,利用javamail 可以实现类似 outlook,foxmail 等邮件客户端的程序。javamailAPI 隐藏了邮件底层的各种复杂操作,对邮件的特定协议提供了支持,如 smtp,pop3,imap,mime 等。简化了编写邮件程序的操作。

     javamail只是一套API标准,其实现要由provider来提供,其中sun公司自己提供了一套实现,做为默认的provider,也可以采用其它的provider实现来进行邮件的发送。javamail要和jsf一起使用

2 、邮件协议简介:

 

     要编写邮件程序,必须了解邮件的各种协议邮件协议是用于邮件服务器于服务器、服务器于客户端之间相互交流的,邮件协议本质上分为四种:smtp,pop3,imap,mime.

(1) SMTP--- 简为简单邮件传输协议(Simple Mail Transfer Protocol)   SMTP 是事实上的在Integer 上传输Email 的标准。SMTP 是一个相对简单的基于文本协议。SMTP 是用由服务器和服务器之间收发邮件的协议。SMTP 协议主要功能有四个:1 、客户向服务器发送邮件、2 、服务器端 接收客户邮件、3 、服务器接收其它服务器发来的邮件、4 、服务器向其它服务器发送邮件。SMTP 使用TCP 端口25 。  

(2) POP3--- 邮局协议的第 3 个版本 (Post Office Protocol 3) POP3 它规定怎样将个人计算机连接到Internet 的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3 允许用 户从服务器上把邮件存储到本地主机上。使用端口:110

(3) MIME--- 多用途网际邮件扩充协议 (Multipurpose Internet Mail Extensions and Secure MIME) MIME 协议 用于定义复杂邮件体的格式,例如,在邮件体中内嵌的图像数据和邮件附件等。MIME 协议则是定义了如何在邮件体部分表达出的丰富多样的数据内容。一个采用了 MIME 协议的电子邮件就叫做MIME 邮件。MIME 的格式灵活,允许邮件中包含任意类型的文件。 MIME 消息可以包含文本、图象、声音、视频及其它应用程序的特定数据。MIME 复合消息的目录信头设有分界标志,这个分界标志绝不可出现在消息的其它位置,而只能是在各部之间以及消息体的开始和结束处。

(4) IMAP--- 交互式邮件存取协议 (Internet Mail Access Protocol) IMAP POP3 类似,主要作用是邮件客户端( 例如MS Outlook Express) 可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。使用端口143

3.JavaMail项目的分布结构

Java mail 包括三部分:邮件服务器(Mail Server),数据库服务器(DB Server)Web服务器(Web Server)。另外的一些应用程序,如(Outlookforxmail)都是C/S结构上的客户端。如图所示:

 

JMail知识总结_第1张图片

4.Mail的流程图

 

JMail知识总结_第2张图片

5.服务器:

在编写服务器端得程序时,应该完全符合SMTP协议和POP3协议规范的要求。在有统一的标准的情况下,才能解析出正确的信息。我们要根据协议的需求来实现协议要求的每一个步骤。也就是上面第三点提到的协议的一些返回参数。

可以肯定的是在编写服务器端程序的时候要详细的了解协议的要求。也就是协议的需求。需求是很重要的,如果没有按照需求,所做的工作都是徒劳的,无效的。在测试和运行的过程中会出现很多的BUG。每一个细节都要注意。

我从这里,知道了需求的重要性。

服务器端 包括SMTP服务器和POP3服务器它们实现不同的功能。同时包括Socket通信和多线程。还要求邮件服务器有一定的安全性,所以在ehlo 的时候需要认证。

用户的用户名和密码都是以Base64编码后传输的。

 

6.客户端:

客户端程序是Web浏览器,所以我们要在服务器上建立一个Web服务器程序,来提供同邮件服务器和数据库服务器的交互。Web服务器是用JSP/Servlet+JDBC来编写的。

同时SUN公司提供了JavaMail的jar包,在J2EE体系中,使用JavaMail API(接口)来实现邮件的发送和收取功能,所以不需要像邮件服务器端程序那样去了解邮件发送和接收的底层实现的细节。应为JavaMail提供了统一的接口来控制电子邮件。

JavaMail 有很多核心的抽象类,都位于Javax.mail包中。分别如下:

Session、Message、Address、Authenticator、Transport、 Store及Folder ,它们都来自Javamail API顶级包(但开发者需要使用的具体子类可能在javax.mail.internet包内)。可以用这些类完成大量常见的电子邮件任务,包括发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML文件格式的消息以及搜索或过滤邮件列表,这类任务主要属于MTA范畴。

 

.1  邮件发送

 

    邮件的发送简单来说可以总结为以下几部份:

     1、建立邮件会话对象(Session)。

     2、由会话对象(session)创建mimeMessage邮件。

     3、由会话对象(session)创建邮件发送对象(Transport)。

     4、由发送对象发送邮件,并关闭 Transport

下面进行详细描述:

      Session是javamail中 最重要的类之一。 表示邮件会话,是 JavaMail API 的最高层入口类 。要收发邮件,首先都得先建立session对象。建立Session对象使用session的静态方法Session.getInstance(Properties pro);参数需要一个Properties对象,它提供了邮件服务器的各种参数,包括邮件服务器所用的传输协议,是否需要登陆认证, smtp地址,pop3地址,等:

Properties props = new Properties();   
props.setProperty("mail.smtp.auth", "true");   
props.setProperty("mail.transport.protocol", "smtp");   
props.setProperty("mail.store.protocol", "pop3");   
props.put("mail.smtp.host", "smtp.163.com")   
Session session = Session.getInstance(props);  

 

 

要注意的是Session的创建还有另一个静态方法session.getInstance(Properties prop,Authenticator auth).

 Authenticator是一个认证对象,当程序需要邮件服务器用户名和密码时,这个对象被当做回调对象来使用,可以得到认证信息。

Session session = Session.getInstance(props,new Authenticator(){   
  
    protected PasswordAuthentication getPasswordAuthentication(){   
  
        return new PasswordAuthentication("username","password");   
    }   
   }   
);  

 PasswordAuthentication不是Authentication的子类,它是一个持有邮件服务器用户名和密码的一个普通javabean,只有getUsername和getPassword两个方法

 

 

    在javamail里,邮件类用Message表示,由于Message是抽象类,javamail里只提供了一个子类MimeMessage,MimeMessage就是前面讲过的Mime邮件,可以表示复杂的邮件格式,MimeMessage的构造器需要提供一个session对象,MimeMessage对象可以设置邮件内容,主题,发件人,收件人等信息:

Message message=new MimeMessage(session);   
message.setSubject("主题");   
message.setText("邮件内容");   
message.setFrom(new InternetAddress("[email protected]"));  

 

 邮件的地址用InternetAddress表示,复杂结构的MimeMessage创建不是很容易,下次再专门说这个问题。

       当建立好邮件对象和Session后,下一步就是创建邮件发送对象Transport。当创建好Transport对象后,就可以进行邮件发送了,发送时有三步操作,1、调用transport对象的的conection方法连接smtp服务器,该方法有四个参数,分别是smtp地址,端口号(默认25),用户名和密码。2、发送邮件Transport.sendMessage(Message)。3、关闭Transport连接Transport.close()。

3.2 收取邮件

 

      收邮件和发邮件类似,也是四个部份:

        1、建立Session对象

     2、由Session创建Store对象

     3、Store进行服务器连接,打开邮件箱文件夹(Folder)

     4、收取邮件,关闭Store连接

 

           Store对象主要用于从邮件服务器取得邮件,其API和Transport类似,使用时首先也要进行服务器连接,使用完后要关闭。不同的是Transport可以直接发送邮件,而Store则需要先打开文件夹Folder。从Folder里才可以得到邮件.folder使用完后必须要关闭。Store也要关闭。

    Store定义的存储器包括一个分层的目录体系,消息存储在目录内,。客户程序可以通过获取一个实现了数据库访问协议的Store对象来访问消息存储器,绝大多数存储器要求用户在访问前提供认证信息,connect方法执行了该认证过程。

 

Store store=session.getStore();        
store.connect("pop.163.com",110,"username","password");  

 

 Folder 是一个抽象类,用于分级组织邮件,其子类提供针对具体协议的实现。 Folder 代表的目录可以容纳消息或子目录,存储在目录内的消息被顺序计数(从1开始到消息总数),该顺序被称为“邮箱顺序”,通常基于邮件消息到达目录的顺序。邮件顺序的变动将改变消息的序列号,这种情况仅发生在客户程序调用Expunge方法擦除目录内设置了Flags.Flag.DELETED标志位的消息时。执行擦除操作后,目录内消息将重新编号。
  客户程序可以通过消息序列号或直接通过相应的Message对象应用目录中的消息,由于消息序列号在会话中很可能改变,因此应尽可能保存 Message对象而非序列号来反复引用对象。
  连接到Store之后,接下来可以获取一个文件夹(Folder )。该文件夹必须先使用open()方法打开,然后才能读取里面的消息:

Folder folder = store.getFolder("INBOX");   
folder.open(Folder.READ_ONLY);   
Message[] message = folder.getMessages();  

 

 open()方法指定了要打开的文件夹及打开方式(如Folder .READ_WRITE)。 INBOX是POP3唯一可以使用的文件夹。如果使用IMAP,还可以用其它的文件夹。获得Message之后,就可以用getContent()获得其内容,或者用writeTo()将内容写入输出流。getContent()方法之能得到消息内容,而writeTo()的输出却包含消息头.读完邮件之后要关闭与Folder 和Store的连接:

folder.close();   
store.close();  

 

 

 

 

 

 

 

你可能感兴趣的:(J2EE)