【java基础】Java邮件开发

来源:互联网 发布:常州瑞声科技 知乎 编辑:程序博客网 时间:2024/04/26 06:53

 前面介绍了电子邮件系统的基本知识(Java邮件开发-----电子邮件的基本概念),那篇博客知识对基础理论知识做一些简要介绍,并不妨碍我们做邮件开发。现在开始Java邮件开发。

 

         一、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程序所必须要用到的核心开发包。

         demo子目录:示例程序。

         demo子目录:示例程序

         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的工作流程如下:

         在这个工作流程中,MessageSessionTransportStore四个对象紧密相连的完成一封电子邮件的发送和接收。我们只需要了解这个四个核心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对象中。

 

         四、发送邮件实例

[java] view plaincopyprint?
  1. public class JavaMail_01 {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Properties props = new Properties();  
  4.         props.setProperty("mail.smtp.auth""true");  
  5.         props.setProperty("mail.transport.protocol""smtp");  
  6.           
  7.         Session session = Session.getInstance(props);  
  8.         session.setDebug(true);  
  9.           
  10.         Message msg = new MimeMessage(session);  
  11.         msg.setSubject("这是一个测试程序....");  
  12.         msg.setText("你好!这是我的第一个javamail程序---陈明");  
  13.         msg.setFrom(new InternetAddress("******@163.com"));  
  14.   
  15.         Transport transport = session.getTransport();  
  16.         transport.connect("smtp.163.com"25"*******""********");  
  17.         transport.sendMessage(msg,new Address[]{new InternetAddress("chenssy995812509@sina.cn")});  
  18.   
  19.         System.out.println("邮件发送成功...");  
  20.         transport.close();  
  21.     } 

     五、将邮件发送给多个收件人和如何利用Authenticators对象实现用户验证

         在指定收件人的时候,我们可以有两种方法来指定。上篇博客是在发送邮件的时候临时指定收件人,其实还可以在Message对象中指定。

[java] view plaincopyprint?
  1. message.addRecipient(Message.RecipientType.TO,new InternetAddress(” 995812509@99.com ”));  

         这个只是发送给一个收件人而言,但是有多个收件人如何处理?同样有两种方法来处理。

          1、在发送邮件时Transport的sendMessage()方法指定收件人时是使用数组来指定收件人的,这个时候我们只需要多添加收件人地址即可完成。

          2、在使用Message对象来添加收件人我们可以使用InternetAddress对象的parse(String string)方法,该方法返回的是InternetAddress数组,这样同样可以实现发送给多个收件人。

 

         我们知道在进行JavaMail开发时我们必须要进行授权校验,授权校验目的是阻止他人任意乱发邮件,减少垃圾邮件的产生。前篇博客中我是是用的Transport的connect(host,port,username,password)方法来进行校验的,其实我们还可以在获取Session对象的时候进行校验。在Session对象中有这两个方法:getDefaultInstance(prop,authenticator),getInstance(prop,authenticator),这两个方法都有一个共同的参数authenticator,该参数是一个Authenticator对象。Authenticator对象就是帮助用户进行信息验证的,完成授权校验。Authenticator对象中有getPasswordAuthentication()方法,该方法返回返回一个PasswordAuthentication对象,PasswordAuthentication对象中有两个方法:getPassword()getUserName()也就说我们将passworduserName封装在PasswordAuthentication对象,通过这两个方法就可以获取用户名和密码了。即可完成用户信息验证。

          实例如下:

[java] view plaincopyprint?
  1. public class JavaMail_02 {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Properties  props = new Properties();  
  4.         props.setProperty("mail.smtp.auth""true");  
  5.         props.setProperty("mail.transport.protocol""smtp");  
  6.         props.setProperty("mail.host""smtp.163.com");  
  7.           
  8.         Session session = Session.getInstance(props,  
  9.                 new Authenticator(){  
  10.                     protected PasswordAuthentication getPasswordAuthentication(){  
  11.                         return new PasswordAuthentication("********","*********");  
  12.                     }  
  13.         });  
  14.         session.setDebug(true);  
  15.           
  16.         Message msg = new MimeMessage(session);  
  17.         msg.setFrom(new InternetAddress("chenssy995812509@163.com"));  
  18.           
  19.         msg.setSubject("JavaMail测试程序...");  
  20.         msg.setContent("<span style='color:red'>这是我的第二个javaMail测试程序....</span>""text/html;charset=gbk");  
  21.         //msg.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("1111@@qq.com"),new InternetAddress("2222@qq.cpm")});  
  22.         msg.setRecipients(RecipientType.TO, InternetAddress.parse("995812509@qq.com,1247723213@qq.com"));  
  23.           
  24.         Transport.send(msg);  
  25.     }  
  26.   


    六、复合邮件开发

       在实际的电子邮件中我们一般都会涉及到更加复杂电子邮件结构,例如有附件、邮件正文里面包含图片、包含歌曲等等,在这个时候我们就必须要对邮件的结构有着很清晰的认识。在进行复合邮件开发之前需要对复合邮件的结构有一定的了解。

     

         上面这幅图片展示了一封复合邮件的整体结构,我们可以看出一封复杂的电子邮件由多个部分组成。它有一个头部和正文,但是正文并不是像以前那么简单了,而是由几个部分组成。头部需要起到一个指示的作用,它需要说明正文需要使用什么样的分隔符来分开,正文几个部分之间使用什么样的组合关系。对于上面电子邮件它由三个部分组成,每一部分都有自己头和体,第一部分也由两个部分组成。

 

         复合邮件的组合关系

         正文部分之间有多种组合关系。组合关系如下图:

        alternative:选择关系。上面的纯文本和超文本之间就是一种选择关系。

        related:关联关系。假如上面的超文本正文是展示一幅图片,那么我们在发送邮件的时候必须要将这幅图片包含到邮件中,也就是所谓的内嵌资源,这个内嵌资源是给超文本用的。所以他们两者之间是一个关联关系。

        mixed:混合关系。在纯文本、超文本和内嵌资源组成一个整体和,他们与附件并列着,两者之间就是一个混合关系了。

 

        复合邮件组织结构的API

 

        MimeMessage类表示整封电子邮件。

        MimeBodyPart类表示邮件的一个MiME消息。

        MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

 

        下面一个实例:该邮件里面包含两个附件、正文部分包括纯文本和超文本,超文本表示展示一张图片。源代码如下:

[java] view plaincopyprint?
  1. public class JavaMail_03 {  
  2.   
  3.     public static void main(String[] args) throws Exception {  
  4.         Properties props = new Properties();  
  5.         props.setProperty("mail.smtp.auth""true");  
  6.         props.setProperty("mail.transport.protocol""smtp");  
  7.         props.setProperty("mail.host""smtp.163.com");  
  8.         Session session = Session.getInstance(props,  
  9.                 new Authenticator(){  
  10.                     protected PasswordAuthentication getPasswordAuthentication(){  
  11.                         return new PasswordAuthentication("*****","******");  
  12.                     }  
  13.         });  
  14.           
  15.         Message message = new MimeMessage(session);  
  16.         message.setSubject("第三个JavaMail测试程序");  
  17.         message.setFrom(new InternetAddress("\""+MimeUtility.encodeText("陈明")+"\"<chenssy995812509@163.com>"));  
  18.         message.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("995812509@qq.com")});  
  19.           
  20.         //邮件正文  
  21.         MimeMultipart multipart = new MimeMultipart("mixed");  
  22.         message.setContent(multipart);  
  23.         /* 
  24.          * 创建邮件的内容 
  25.          * 包括一个邮件正文和两个附件 
  26.          */  
  27.         MimeBodyPart content = new MimeBodyPart();      //邮件内容  
  28.         MimeBodyPart attch1 = new MimeBodyPart();      //附件1  
  29.         MimeBodyPart attch2 = new MimeBodyPart();      //附件2  
  30.         //将邮件内容添加到multipart中  
  31.         multipart.addBodyPart(content);  
  32.         multipart.addBodyPart(attch1);  
  33.         multipart.addBodyPart(attch2);  
  34.           
  35.         //设置附件1  
  36.         DataSource ds1 = new FileDataSource("G:\\电子书\\oracle口令.txt");  
  37.         DataHandler dh1 = new DataHandler(ds1);  
  38.         attch1.setDataHandler(dh1);  
  39.         attch1.setFileName("oracle.txt");  
  40.         //设置附件2  
  41.         DataSource ds2 = new FileDataSource("G:\\电子书\\账号.txt");  
  42.         DataHandler dh2 = new DataHandler(ds2);  
  43.         attch2.setDataHandler(dh2);  
  44.         attch2.setFileName(MimeUtility.encodeText("账号.txt"));  
  45.         /* 
  46.          * 设置内容(正文)---是一个复杂体 
  47.          * 包括HTML正文和显示一张图片 
  48.          */  
  49.         MimeMultipart bodyMultipart = new MimeMultipart("related");  
  50.         content.setContent(bodyMultipart);  
  51.         //构造正文  
  52.         MimeBodyPart htmlBody = new MimeBodyPart();  
  53.         MimeBodyPart gifBody = new MimeBodyPart();  
  54.         bodyMultipart.addBodyPart(htmlBody);  
  55.         bodyMultipart.addBodyPart(gifBody);  
  56.       
  57.         //设置图片  
  58.         DataSource gifds = new FileDataSource("F:\\图片\\图片\\4.jpg");  
  59.         DataHandler gifdh = new DataHandler(gifds);  
  60.         gifBody.setDataHandler(gifdh);  
  61.         gifBody.setHeader("Content-ID""<"+gifds.getName()+">");  
  62.         //gifBody.setHeader("Content-Location", "http://www.itcast.cn/logo.gif");  
  63.         //设置HTML正文  
  64.         htmlBody.setContent("<span style='color:red;font-size:16px'>这是我的第三个JavaMail测试哦!包括了附件和图片,有点儿复杂...</span><br>" +  
  65.                 "显示的图片<img src='cid:4.jpg'/>""text/html;charset=UTF-8");  
  66.           
  67.           
  68.         message.saveChanges();        //生成邮件  
  69.         Transport.send(message);  
  70.     }  
  71.   



0 0
原创粉丝点击