知识大全 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对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JDK的新功能序
通过E-mail共享Java对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JDK的新功能序
知识大全 编写可在线收发E-mail的Java Applet
编写可在线收发E-mail的JavaApplet 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
深入讨论JAVA字节码加密技术(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如果把的cl
学习深入Java1.5枚举类型的内部 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 越来越多的人
知识大全 深入Java调试体系: 第1部分,JPDA体系概览
深入Java调试体系:第1部分,JPDA体系概览 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
深入浅出基于Java的建造设计模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一引子 前几
深入浅出Java设计之备忘录模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一引子 俗话说
深入Java核心Java内存分配原理精讲 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java
Java反射机制深入研究 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java反射是Java语