我干软件开发也有一点的年头了回头想想也经历了不少的酸甜苦辣为解决了复杂的问题快乐过也为不分昼夜的加班赶工程郁闷过不过这些都没能减少我对计算机的热情我对程序的喜好以前对JavaMail也有一些学习性的认识不过一直没在实际的项目中应用过直到最近的一个项目需要JavaMail所以我打算认真的学习一下这种技术因为我目前擅长的是Struts而Struts又不具备邮件发送的功能所以我要深刻的学习一下JavaMailAPI所以在我学会了JavaMail的基本操作的同时也将这篇文章献给大家虽然技术含量不高但是希望能对一些刚刚接触JavaMail的同道中人有所帮助好了闲话少说进入正题首先介绍几个邮件传输协议虽然说不了解这些协议也可以实用JavaMailAPI但是我始终认为如果不透彻的了解一种技术的本质即使会用了也是照葫芦画瓢换一种模式也许就玩不转了
SMTP:简单邮件传输协议(Simple Mail Transfer ProtocolSMTP)由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可以到 进行下载并将mailjar添加到classpath即可
JAF框架可以到 进行下载并将activationjar添加到classpath即可
如果实用JEE就没由什么特定非要用基本的JavaMailAPI了JEE的类就能处理了只要确保jeejar文件在classpath中就Ok了
下面我用一个最简单的例子还演示第一条消息的发送
获取系统Properties
Properties props = SystemgetProperties();
将您的SMTP服务器名添加到mailsmtphost关键字的属性中
Propspout( mailsmtphost host);
获取基于Properties Session对象
Session session = SessiongetDefaultInstance(propsnull);
从Session创建一个MimeMessage
MimeMessage message = new MimeMessage(session);
设置消息from域
MessagesetForm(new InternetAddress(from));
设置to域
MessageaddRecipient(MessageRecipientTypeTOnew InternetAddress(to));
设置消息主题
messagesetSubject( HelloJavaMail );
设置消息内容
MessagesetText( Welcome to JavaMail );
发送消息
Transportsend(message);
在编译用运的时候传递MSTP服务器from地址to地址
通过简单的接触了JavaMail相信大家多邮件发送也有了简单的了解和认识下面我主要研究一下它的具体功能也就是说具体的接口或类的含义
Session类定义了一个基本的邮件会话所有的其他类都是由这个session才得意生效的Session对象用javautilProperties对象获取信息如邮件服务器用户名密码及整个应用程序中共享的其他信息类的构造器是此有的private它能用getDefaultInstance()方法来共享获取Session对象的方方法如下:
Properties props = new Properties();
Session session = SessiongetDefaultInstance(propsnull);
Null参数都是Authenticator对象在这里没有使用
对于大多数情况共享的session已经足够用了
Message消息类在获得了Session对象后就可以继续创建要发送的消息因为Message是个抽象类您必须用一个子类多数情况下为javamailinternetMimeMessage这个能理解成MIME类型和头的电子邮件消息正如不同的RFC中定义的虽然在某些头部域非ASCII字符也能被编译但是Message头只能被限制用USASCII字符要创建一个Message请将Session对象传递给MimeMessage的构造器
MimeMessage message = newMimeMessage(session);
一旦获得消息就可以设置各个部分了最基本的就是setContent()方法例如/
messagesetContent( Hello text/plain );
如果知道在实用MimeMessage而且消息是纯文本格式就可以用setText()方法它只需要代表实际内容的参数(Mime类型缺省为text/plain)
用setSubject()方法设置subject(主题);
messagesetSubject( 主题 );
Address地址类和Message一样也是一个抽象类一旦创建了Session和Message并将内容填入消息后就可以用Address确定信件的地址了用javaxmailinternet
InternetAddress类若创建的地址只包含电子邮件地址只要传递电子邮件地址给构造器就可以了例如:Address address = new InternetAddress( );
若希望名字挨着电子邮件现实就可以把它传递给构造器如下:
Address address = new InternetAddress( 我心依旧 );
需要为消息的from域和to域创建地址对象除非邮件服务器阻止没有什么能阻止你发送一段看上去是任何人的消息了呵呵一旦创建address将他们域消息连接方法有两种如要要识别发件人的就可以用setFrom()和setReplyTo方法然后messagesetFrom(address);
需要实用多个from地址的就用addFrom()方法例子如下:
Address[] address = ; messageaddFrom(address);
若要识别消息recipient收件人就要实用addRecipient()方法了例如:
messageaddRecipient(typeaddress)
Authenticator与类一样JavaMailAPI也可以利用Authentcator通过用户名密码访问受保护的资源对于JavaMail来说这些资源就是邮件服务器Authentcator类在javaxmail包中要使用Authenticator首先创建一个抽象的子类并从
GetPasswordAuthentication方法中返回passwordAuthentication实例创建完成后您必须向session注册Authenticator然后在需要认证的时候会通知它其实说白了就是把配置的用户名和密码返回给调用它的程序例如:
Properties props = new properties();
Authenticator auth = new MailAuthenticator()//接口声明创建自己新类的实例
Session session = SessiongetDefauItInstance(propsauth);
Transport消息发送传输类这个类用协议指定的语言发送消息通常是SMTP它是抽象类它的工作方式与Session有些类似尽调用静态方法send()方法就OK了例如:
Transportsend(message);
或者也可以从针对协议的会话中获取一个特定的实例传递用户名和密码发送消息然后关闭连接例如:
messagesaveChanges();
transport transport = sessiongetTreansport( smtp );//指定的协议
nnect(hostusernamepassword);
transportsendMessage(messagemessagegetAllRecipients());
transportclose();
如果要观察传到邮件服务器上的邮件命令请用sessionsetDubug(true)设置调试标志
Store和folder用session获取消息与发送消息开始很相似但是在session得到后很可能实用用户名和密码或实用Authenticator连接到一个Store类似于Transport也是一样要告诉store用什么协议例如
Store store = sessiongetStore( pop );
nnect(hostusernamepassword);
连接到Store之后接下来获得一个folder必须打开它就可以读取里边的消息了
Folder folder = storegetFolder(INBOX);
folderopen(FolderREAD_ONLY);
Message[] message = foldergetMessages();
POP唯一可用的文件夹就是INBOX如果实用IMAP还可以用其他的文件夹
当读到了具体的message以后就可以用getContent来获取内容或者用writeTo()将内容写入流getContent()方法只能得到消息内容而writeTo()的输出却包含消息头
Systemoutprintln(((MimeMessage)message)getConntent());
一旦读取完毕邮件要关闭store和folder的连接
lse(boolean);
lse();
传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder
上面就是JavaMail邮件操作的基本的常用类我觉得理解了这几个类的机制基本就可以处理一般的邮件操作了下面是一个我写的JavaMail实现邮件发送的代码
首先是一个Authenticator类的实现:记录用户名和密码:
import javaxmail*;
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 monmail;
/**
* 此处插入类型说明
* 创建日期( ::)
* @author张宏亮
*/
import javautil*;
import javaio*;
import javaxmail*;
import javaxmailinternet*;
import javaxactivation*;
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/html; charset=gb;
private String mailbccTo = null;
private String mailccTo = null;