知识大全 Java Mail 深入浅出(1)

Posted 消息

篇首语:再长的路,一步步也能走完;再短的路,不迈开双脚也无法到达。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java Mail 深入浅出(1)相关的知识,希望对你有一定的参考价值。

Java Mail 深入浅出(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  我干软件开发也有一点的年头了 回头想想 也经历了不少的酸甜苦辣 为解决了复杂的问题快乐过 也为不分昼夜的加班赶工程郁闷过 不过这些都没能减少我对计算机的热情 我对程序的喜好 以前对JavaMail也有一些学习性的认识 不过一直没在实际的项目中应用过 直到最近的一个项目 需要JavaMail所以我打算认真的学习一下这种技术 因为我目前擅长的是Struts 而Struts又不具备邮件发送的功能 所以我要深刻的学习一下JavaMailAPI 所以在我学会了JavaMail的基本操作的同时也将这篇文章献给大家 虽然技术含量不高 但是希望能对一些刚刚接触JavaMail的同道中人有所帮助 好了闲话少说进入正题 首先介绍几个邮件传输协议 虽然说不了解这些协议也可以实用JavaMailAPI 但是我始终认为 如果不透彻的了解一种技术的本质 即使会用了也是照葫芦画瓢 换一种模式也许就玩不转了

  SMTP:简单邮件传输协议(Simple Mail Transfer Protocol SMTP)由RFC 定义 它定义了发送邮件的机制 在JavaMail环境中 基于JavaMail的程序将和因特网服务供应商ISP(internet Service Provider s)SMTP服务器通信 SMTP服务器会中转消息给接收方SMTP服务器以便最终让用户经由POP或者IMAP获得

  POP:代表邮局协议(Post Office Protocol) 目前的版本是 所以一般都称之为POP 这个协议是由RFC 定义的 POP是一种机制 因特网上多大数用户用它得到邮件 它规定每个用户一个邮箱的支持 使用POP协议的时候 用户的许多性能并不是由POP协议支持的 如查看几封新邮件消息这个功能 这些功能内建在如Eudora或MicrosoftOutlook之类的程序中 它们记住一些事 所以在用JavaMail的时候 如果你想要这些信息 你就必须自己算了

  IMAP:是更高级的用户接收消息的协议 被定义在RFC 中 IMAP代表因特网消息访问协议(Internet Message Access Protocol) 目前用的版本是 所以也叫做IMAP 在用到IMAP的时候 邮件服务器必须支持这个协议 不能仅仅把使用POP的程序用于IMAP 并指望它支持IMAP所有性能

  MIME:是因特网邮件扩展标准(Multipurpose Internet Mail Extensions) 它不是邮件传输协议 但是对于传输的内容的消息 附件以及其他的内容定义了格式 可以理解成一个定义合适的标准

  NNTP:因为JavaMail将供应商和所有其它的东西分开了 您就能轻松添加额外的协议支持 NNTP 就是网络新闻传输协议

  JavaMailAPI可以到 进行下载 并将mail jar添加到classpath即可

  JAF框架可以到 进行下载 并将activation jar添加到classpath即可

  如果实用J EE就没由什么特定非要用基本的JavaMailAPI了 J EE的类就能处理了 只要确保j ee jar文件在classpath中就Ok了

  下面我用一个最简单的例子还演示第一条消息的发送

   获取系统Properties

  Properties props = System getProperties();

   将您的SMTP服务器名添加到mail smtp host关键字的属性中

  Props pout( mail smtp host host);

   获取基于Properties Session对象

  Session session = Session getDefaultInstance(props null);

   从Session创建一个MimeMessage

  MimeMessage message = new MimeMessage(session);

   设置消息from域

  Message setForm(new InternetAddress(from));

   设置to域

  Message addRecipient(Message RecipientType TO new InternetAddress(to));

   设置消息主题

  message setSubject( HelloJavaMail );

   设置消息内容

  Message setText( Wele to JavaMail );

   发送消息

  Transport send(message);

   在编译用运的时候传递MSTP服务器 from地址 to地址

  通过简单的接触了JavaMail相信大家多邮件发送也有了简单的了解和认识 下面我主要研究一下它的具体功能 也就是说具体的接口或类的含义

  Session类定义了一个基本的邮件会话 所有的其他类都是由这个session才得意生效的 Session对象用java util Properties对象获取信息 如邮件服务器 用户名 密码及整个应用程序中共享的其他信息 类的构造器是此有的 private 它能用getDefaultInstance()方法来共享 获取Session对象的方方法如下:

  Properties props = new Properties();

  Session session = Session getDefaultInstance(props null);

  Null参数都是Authenticator对象 在这里没有使用

  对于大多数情况 共享的session已经足够用了

  Message消息类 在获得了Session对象后 就可以继续创建要发送的消息 因为Message是个抽象类 您必须用一个子类 多数情况下为java mail internet MimeMessage 这个能理解成MIME类型和头的电子邮件消息 正如不同的RFC中定义的 虽然在某些头部域非ASCII字符也能被编译 但是Message头只能被限制用US ASCII字符 要创建一个Message请将Session对象传递给MimeMessage的构造器

  MimeMessage message = newMimeMessage(session);

  一旦获得消息 就可以设置各个部分了 最基本的就是setContent()方法 例如/

  message setContent( Hello text/plain );

  如果知道在实用MimeMessage 而且消息是纯文本格式 就可以用setText()方法 它只需要代表实际内容的参数 (Mime类型缺省为text/plain)

  用setSubject()方法设置subject(主题);

  message setSubject( 主题 );

  Address地址类 和Message一样也是一个抽象类 一旦创建了Session和Message并将内容填入消息后 就可以用Address确定信件的地址了 用javax mail internet

  InternetAddress类 若创建的地址只包含电子邮件地址 只要传递电子邮件地址给构造器就可以了 例如:Address address = new InternetAddress( );

  若希望名字挨着电子邮件现实 就可以把它传递给构造器 如下:

  Address address = new InternetAddress( 我心依旧 );

  需要为消息的from域和to域创建地址对象 除非邮件服务器阻止 没有什么能阻止你发送一段看上去是任何人的消息了呵呵 一旦创建address将他们域消息连接方法有两种 如要要识别发件人的就可以用setFrom()和setReplyTo方法 然后message setFrom(address);

  需要实用多个from地址的就用addFrom()方法 例子如下:

  Address[] address = ;    message addFrom(address);

  若要识别消息recipient收件人 就要实用addRecipient()方法了 例如:

  message addRecipient(type address)

  Authenticator与类一样 JavaMailAPI也可以利用Authentcator通过用户名密码访问受保护的资源 对于JavaMail来说 这些资源就是邮件服务器 Authentcator类在javax mail包中 要使用Authenticator 首先创建一个抽象的子类 并从

  GetPasswordAuthentication方法中返回passwordAuthentication实例 创建完成后 您必须向session注册Authenticator 然后在需要认证的时候会通知它 其实说白了就是把配置的用户名和密码返回给调用它的程序 例如:

  Properties props = new properties();

  Authenticator auth = new MailAuthenticator()//接口声明 创建自己新类的实例

  Session session = Session getDefauItInstance(props auth);

  Transport消息发送传输类 这个类用协议指定的语言发送消息 通常是SMTP 它是抽象类 它的工作方式与Session有些类似 尽调用静态方法send()方法 就OK了 例如:

  Transport send(message);

  或者也可以从针对协议的会话中获取一个特定的实例 传递用户名和密码 发送消息 然后关闭连接 例如:

  message saveChanges();

  transport transport = session getTreansport( smtp );//指定的协议

  nnect(host username password);

  transport sendMessage(message message getAllRecipients());

  transport close();

  如果要观察传到邮件服务器上的邮件命令 请用session setDubug(true)设置调试标志

  Store和folder用session获取消息 与发送消息开始很相似 但是在session得到后 很可能实用用户名和密码或实用Authenticator连接到一个Store 类似于Transport 也是一样要告诉store用什么协议 例如

  Store store = session getStore( pop );

  nnect(host username password);

  连接到Store之后 接下来 获得一个folder 必须打开它就可以读取里边的消息了

  Folder folder = store getFolder( INBOX );

  folder open(Folder READ_ONLY);

  Message[] message = folder getMessages();

  POP 唯一可用的文件夹就是INBOX 如果实用IMAP 还可以用其他的文件夹

  当读到了具体的message以后 就可以用getContent来获取内容 或者用writeTo()将内容写入流 getContent()方法只能得到消息内容 而writeTo()的输出却包含消息头

  System out println(((MimeMessage)message) getConntent());

  一旦读取完毕邮件 要关闭store和folder的连接

  lse(boolean);

  lse();

  传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder

  上面就是JavaMail邮件操作的基本的常用类 我觉得理解了这几个类的机制 基本就可以处理一般的邮件操作了 下面是一个我写的JavaMail实现邮件发送的代码

  首先是一个Authenticator类的实现:记录用户名和密码:

  import javax mail *;

  public class MailAuthenticator extends Authenticator

  

  //******************************

  //由于发送邮件的地方比较多

  //下面统一定义用户名 口令

  //******************************

  public static String HUAWEI_MAIL_USER = ;

  public static String HUAWEI_MAIL_PASSWORD = 密码 ;

  public MailAuthenticator()

  

  

  protected PasswordAuthentication getPasswordAuthentication()

  

  return new PasswordAuthentication(HUAWEI_MAIL_USER HUAWEI_MAIL_PASSWORD);

  

  

  这个类是发送邮件的类

  package mon mail;

  /**

  * 此处插入类型说明

  * 创建日期 ( : : )

  * @author 张宏亮

  */

  import java util *;

  import java io *;

  import javax mail *;

  import javax mail internet *;

  import javax activation *;

  public class SendMail

  //要发送Mail地址

  private String mailTo = null;

  //Mail发送的起始地址

  private String mailFrom = null;

  //SMTP主机地址

  private String smtpHost = null;

  //是否采用调试方式

  private boolean debug = false;

  private String messageBasePath = null;

  //Mail主题

  private String subject;

  //Mail内容

  private String msgContent;

  private Vector attachedFileList;

  private String mailAccount = null;

  private String mailPass = null;

  private String messageContentMimeType = text/; charset=gb ;

  private String mailbccTo = null;

cha138/Article/program/Java/hx/201311/26804

相关参考

知识大全 通过E-mail共享Java 对象

通过E-mail共享Java对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JDK的新功能序

知识大全 通过E-mail 共享Java 对象

通过E-mail共享Java对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JDK的新功能序

知识大全 编写可在线收发E-mail的Java Applet

编写可在线收发E-mail的JavaApplet  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 深入讨论JAVA字节码加密技术(1)

深入讨论JAVA字节码加密技术(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果把的cl

知识大全 学习深入Java 1.5枚举类型的内部

学习深入Java1.5枚举类型的内部  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  越来越多的人

知识大全 深入Java调试体系: 第1部分,JPDA体系概览

深入Java调试体系:第1部分,JPDA体系概览  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 深入浅出基于Java的建造设计模式

深入浅出基于Java的建造设计模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一引子  前几

知识大全 深入浅出Java设计之备忘录模式

深入浅出Java设计之备忘录模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一引子  俗话说

知识大全 深入Java核心 Java内存分配原理精讲

深入Java核心Java内存分配原理精讲  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java

知识大全 Java反射机制深入研究

Java反射机制深入研究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java反射是Java语