在使用Spring框架的过程中,它的优势之一就是在于跟其他一些技术的整合,如JavaMail 、任务调度、缓存策略等技术。今天就Java Mail详细阐述。JavaMail API是被设计为与协议无关的,但是目前我们并不能克服这些协议的束缚。了解JavaMail之前,需要详细了解几个邮件协议,SMTP POP IMAP MIME,现就这些协议详细分析如下:

1.SMTP协议:简单邮件传输协议定义了递送邮件的机制。这个SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。递送邮件机制。(如ipad上的软件QQ邮箱如果要想能收到邮件,必须在我们的QQ邮箱中设置SMTP服务开启)

2.POP:POP是一种邮局协议,目前为第3个版本,即众所周知的POP3。POP定义了一种用户如何获得邮件的机制。它规定了每个用户使用一个单独的邮箱。获取邮件机制。

3.IMAP:IMAP使用在接收信息的高级协议,目前版本为第4版,所以也被称为IMAP4。需要注意的是在使用IMAP时,邮件服务器必须支持该协议。从这个方面讲,我们并不能完全使用IMAP来替代POP,不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP,那么我们的邮件程序将能够具有以下被IMAP所支持的特性:每个用户在服务器上可具有多个目录,这些目录能在多个用户之间共享。
其与POP相比高级之处显而易见,但是在尝试采取IMAP时,我们认识到它并不是十分完美的:由于IMAP需要从其它服务器上接收新信息,将这些信息递送给用户,维护每个用户的多个目录,这都为邮件服务器带来了高负载。并且IMAP与POP的一个不同之处是POP用户在接收邮件时将从邮件服务器上下载邮件,而IMAP允许用户直接访问邮件目录,所以在邮件服务器进行备份作业时,由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间,这将直接导致邮件服务器上磁盘空间暴涨。

4.MIME:MIME并不是用于传送邮件的协议,它作为多用途邮件的扩展定义了邮件内容的格式:信息格式、附件格式等等。一些RFC标准都涉及了MIME:RFC 822, RFC 2045, RFC 2046, RFC 2047,有兴趣的Matrixer可以阅读一下。而作为JavaMail API的开发者,我们并不需关心这些格式定义,但是这些格式被用在了程序中。

二、安装环境:

1.安装JavaMail:从http://java.sun.com/products/javamail/downloads/index.html下载javamail,将mail.jar文件添加到CLASSPATH中。

2.安装JavaBeans Activation Framework,将activation.jar文件添加到CLA。

三、使用:

1. JavaMail.jar的一些核心类:Session、 Message、Address、Authenticator、Transport、Store、Folder。以及javax.mail.internet包中含有的一些常用的其他类。

2. Session邮件回话,收发邮件都是基于这个回话的。session对象利用了javax.util.properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。

// 使用方法

Properties properties = new Properties();
Session session = Session.getDefaultInstance(props, null); 或者,采用 Properties properties = new Properties();
Session session = Session.getInstance();

3. Message,建立了session回话后,变可以构造Message信息体了。使用javax.mail.internet.Message抽象类。使用方式如下:

Message message = new Message(session);
message.setContent("HelloWorld","text/plain"); //设置非文本信息内容
message.setText("Hello"); //设置邮件纯文本信息内容
message.setSubject("SubjectHelloWorld"); //设置邮件主题
message.setSentDate(date); //设置邮件发送日期

4. Address类,建立了session会话和message信息体之后,使用邮件地址Address抽象类。使用javax.mail.internet.InternetAddress类,通过传入邮件地址的字符串。

Address address = new InternetAddress("xuguang.zhao@hp.com");   //设置邮件地址
Address address = new InternetAddress("xuguang.zhao@hp.com","sucre"); //设置带有名字的邮件地址
message.setFrom(address); //设置发信人
message.serReplyTo(); //设置发信人
message.addFrom(Address[] address); //添加多个发信人 message.setRecipient(type,address); //设置收信人
type有三种类型 {Message.RecipientType.To收信人 Message.RecipientType.CC抄送人 Message.Recipienttype.BCC秘密抄送}

5.  Authenticator 授权者类。使用Authenticator抽象类必须实现getPasswordAuthentication( )方法,用于存储认证时用到的用户名和密码。并且要在session中进行注册,使session能够了解在认证时该使用哪个类。

Properties properties = new Properties();
Authenticator authenticator = new MyAuthenticator();
Session session = Session.getDefaultInstance(properties,authenticator); /*
* @return
* throes IOException
*/
public class MyAuthenticator extends Authenticator{
  public PasswordAuthentication getPasswordAuthentication(String param){
     String username;
     String password;
     StringTokenizer st = new StringTokenizer(param,",");
     username = st.nextToken();
     password = st.nextToken();
     return new PasswordAuthentication(username,password);
  }
}

6. Transport抽象类实现了SMTP

Transport.send(MimeMessage message);

//还可以通过session获得相应协议对应的Transport实例,并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接。并使用sendMessage()方法将信息发送。最后关闭连接。
session.setDebug(true); //监控邮件发送过程
message.saveChanges(); //保存文件
Transport transport = session.getTransport("smtp"); //获取实现了smtp协议的Transport类
transport.connect(host,username,password); //连接服务器
transport.sendMessage(message,message.getAllRecipients()); //发送邮件给所有邮件收件人
transport.close(); //关闭连

综合梳理一下JavaMail的一套过程,如下:获得session会话,填充Message的信息,在sentMessage( )之前,需要设置SMTP服务器的相关属性。

JavaMail API 详细分解的更多相关文章

  1. javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)

    引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  2. JavaMail API

    JavaMail API的核心类:会话.消息.地址.验证程序.传输,存储和文件夹.所有这些类都可以在JavaMail API即javax.mail的顶层包中找到,尽管你将频繁地发现你自己使用的子类是在 ...

  3. javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

    引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  4. javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)

    引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  5. javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)

    引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...

  6. javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

    前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一 ...

  7. JavaMail API 1.4.7邮件发送

    下载oracle javaMail API: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive- ...

  8. JavaMail API 概述

    JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序. JavaMail API提供了一组抽象类定义构成一个邮件系统的对象.它是阅读,撰写和发送电子信息的可选包(标准扩 ...

  9. swagger注释API详细说明

    API详细说明 注释汇总 @RequestMapping此注解的推荐配置 value method produces 示例: @ApiOperation("信息软删除") @Api ...

随机推荐

  1. SQL中group by的用法

    group by即按照给定字段对结果集进行分组,从字面意义上理解就是根据"by"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个" ...

  2. Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15

    Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15 1. attilax重要案例的分类(atiuse,auBackTech,bizImp)3 1.1. 两个book3 1.2. ...

  3. DataTable转换成json字符串

    将DataTable里面的行转换成json字符串方法: #region DataTable转为json /// <summary> /// DataTable转为json /// < ...

  4. Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求

    Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本

  5. C#与JS实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...

  6. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

  7. oracle11g AUD$维护

    SYSTEM表空间使用率达到了85%,查出是用来记录审计记录的aud$表占用了很大的空间. 备份后truncate掉AUD$,问题临时解决.记得oracle11.2可以把aud$迁移到普通的表空 间. ...

  8. C++学习之重载、覆盖与隐藏

    MaiziTest12.cpp : 定义控制台应用程序的入口点. 1.重载特征 1)相同的范围(在同一个类中): 2)函数名相同: 3)参数不同: 4)virtual关键字可有可无. 2.覆盖 指的是 ...

  9. javascript中数组和字符串的方法比较

    × 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...

  10. javase基础复习攻略《八》

    进入第八篇,我们开始讨论JAVA的IO初步.在JAVA程序中,对数据的输入\输出操作以"流"(stream)方式进行,J2SDK提供了各种各样的"流"类,用于获 ...