我干软件开发也有一点的年头了,回头想想,也经历了不少的酸甜苦辣,为解决了复杂的问题快乐过.也为不分昼夜的加班赶工程郁闷过.不过这些都没能减少我对计算机的热情,我对程序的喜好.以前对javamail也有一些学习性的认识,不过一直没在实际的项目中应用过.直到最近的一个项目,需要javamail所以我打算认真的学习一下这种技术,因为我目前擅长的是struts,而struts又不具备邮件发送的功能,所以我要深刻的学习一下javamailapi.所以在我学会了javamail的基本操作的同时也将这篇文章献给大家,虽然技术含量不高,但是希望能对一些刚刚接触javamail的同道中人有所帮助.好了闲话少说进入正题,首先介绍几个邮件传输协议,虽然说不了解这些协议也可以实用javamailapi,但是我始终认为,如果不透彻的了解一种技术的本质,即使会用了也是照葫芦画瓢,换一种模式也许就玩不转了.
smtp:简单邮件传输协议(simple mail transfer protocol,smtp)由rfc821定义,它定义了发送邮件的机制,在javamail环境中,基于javamail的程序将和因特网服务供应商isp(internet service provider
’
s)smtp服务器通信.smtp服务器会中转消息给接收方smtp服务器以便最终让用户经由pop或者imap获得.
pop:代表邮局协议(post office protocol).目前的版本是3.所以一般都称之为pop3.这个协议是由rfc1939定义的.pop是一种机制,因特网上多大数用户用它得到邮件.它规定每个用户一个邮箱的支持.使用pop协议的时候,用户的许多性能并不是由pop协议支持的,如查看几封新邮件消息这个功能,这些功能内建在如eudora或microsoftoutlook之类的程序中,它们记住一些事.所以在用javamail的时候,如果你想要这些信息,你就必须自己算了.
imap:是更高级的用户接收消息的协议,被定义在rfc2060中,imap代表因特网消息访问协议(internet message access protocol),目前用的版本是4,所以也叫做imap4.在用到imap的时候,邮件服务器必须支持这个协议,不能仅仅把使用pop的程序用于imap,并指望它支持imap所有性能.
mime:是因特网邮件扩展标准(multipurpose internet mail extensions).它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可以理解成一个定义合适的标准.
就是网络新闻传输协议.
javamailapi可以到
进行下载,并将mail.jar添加到classpath即可.
jaf框架可以到
进行下载,并将activation.jar添加到classpath即可.
如果实用j2ee就没由什么特定非要用基本的javamailapi了.j2ee的类就能处理了.只要确保j2ee.jar文件在classpath中就ok了.
下面我用一个最简单的例子还演示第一条消息的发送.
1,获取系统properties.
properties props = system.getproperties();
2,将您的smtp服务器名添加到mail.smtp.host关键字的属性中.
props.pout(
“
mail.smtp.host
”
,host);
3,获取基于properties session对象.
session session = session.getdefaultinstance(props,null);
4,从session创建一个mimemessage.
mimemessage message = new mimemessage(session);
5,设置消息from域.
message.setform(new internetaddress(from));
6,设置to域.
message.addrecipient(message.recipienttype.to,new internetaddress(to));
7,设置消息主题.
message.setsubject(
“
hellojavamail
”
);
8,设置消息内容.
message.settext(
“
welcome to javamail
”
);
9发送消息.
transport.send(message);
10,在编译用运的时候传递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(
“
it5719@163.com
”
);
若希望名字挨着电子邮件现实,就可以把它传递给构造器,如下:
address address = new internetaddress(
“
it5719@163.com
”
,
”
我心依旧
”
);
需要为消息的from域和to域创建地址对象,除非邮件服务器阻止,没有什么能阻止你发送一段看上去是任何人的消息了呵呵.一旦创建address将他们域消息连接方法有两种,如要要识别发件人的就可以用setfrom()和setreplyto方法.然后message.setfrom(address);
需要实用多个from地址的就用addfrom()方法.例子如下:
address[] address = ,.,. ; message.addfrom(address);
若要识别消息recipient收件人,就要实用addrecipient()方法了.例如:
message.addrecipient(type,address)
authenticator与java.net类一样,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
”
);//指定的协议
transport.connect(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(
“
pop3
”
);
store.connect(host,username,password);
连接到store之后,接下来,获得一个folder,必须打开它就可以读取里边的消息了.
folder folder = store.getfolder("inbox");
folder.open(folder.read_only);
message[] message = folder.getmessages();
pop3唯一可用的文件夹就是inbox,如果实用imap,还可以用其他的文件夹.
当读到了具体的message以后,就可以用getcontent来获取内容,或者用writeto()将内容写入流,getcontent()方法只能得到消息内容,而writeto()的输出却包含消息头.
system.out.println(((mimemessage)message).getconntent());
一旦读取完毕邮件,要关闭store和folder的连接.
folder.colse(boolean);
store.colse();
传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder.
上面就是javamail邮件操作的基本的常用类,我觉得理解了这几个类的机制,基本就可以处理一般的邮件操作了.下面是一个我写的javamail实现邮件发送的代码.
首先是一个authenticator类的实现:记录用户名和密码:
import javax.mail.*;
public class mailauthenticator extends authenticator
{
//******************************
//由于发送邮件的地方比较多,
//下面统一定义用户名,口令.
//******************************
public static string huawei_mail_user = "it5719@163.com";
public static string huawei_mail_password = "密码";
public mailauthenticator()
{
}
protected passwordauthentication getpasswordauthentication()
{
return new passwordauthentication(huawei_mail_user, huawei_mail_password);
}
}
这个类是发送邮件的类.
package com.deepdo.common.mail;
/**
* 此处插入类型说明。
* 创建日期:(2006-4-21 14:57:16)
* @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/html; charset=gb2312";
private string mailbccto = null;
private string mailccto = null;
/**
* sendmailservice 构造子注解。
*/
public sendmail() {
super();
}
private void fillmail(session session,mimemessage msg) throws ioexception, messagingexception{
string filename = null;
multipart mpart = new mimemultipart();
if (mailfrom != null) {
msg.setfrom(new internetaddress(mailfrom));
system.out.println("发送人mail地址:" mailfrom);
} else {
system.out.println("没有指定发送人邮件地址!");
return;
}
if (mailto != null) {
internetaddress[] address = internetaddress.parse(mailto);
msg.setrecipients(message.recipienttype.to, address);
system.out.println("收件人mail地址:" mailto);
} else {
system.out.println("没有指定收件人邮件地址!");
return;
}
if (mailccto != null) {
internetaddress[] ccaddress = internetaddress.parse(mailccto);
system.out.println("ccmail地址:" mailccto);
msg.setrecipients(message.recipienttype.cc, ccaddress);
}
if (mailbccto != null) {
internetaddress[] bccaddress = internetaddress.parse(mailbccto);
system.out.println("bccmail地址:" mailbccto);
msg.setrecipients(message.recipienttype.bcc, bccaddress);
}
msg.setsubject(subject);
internetaddress[] replyaddress = { new internetaddress(mailfrom)};
msg.setreplyto(replyaddress);
// create and fill the first message part
mimebodypart mbodycontent = new mimebodypart();
if (msgcontent != null)
mbodycontent.setcontent(msgcontent, messagecontentmimetype);
else
mbodycontent.setcontent("", messagecontentmimetype);
mpart.addbodypart(mbodycontent);
// attach the file to the message
if (attachedfilelist != null) {
for (enumeration filelist = attachedfilelist.elements(); filelist.hasmoreelements();) {
filename = (string) filelist.nextelement();
mimebodypart mbodypart = new mimebodypart();
// attach the file to the message
filedatasource fds = new filedatasource(messagebasepath filename);
system.out.println("mail发送的附件为:" messagebasepath filename);
mbodypart.setdatahandler(new datahandler(fds));
mbodypart.setfilename(filename);
mpart.addbodypart(mbodypart);
}
}
msg.setcontent(mpart);
msg.setsentdate(new date());
}
/**
* 此处插入方法说明。
*/
public void init()
{
}
/**
* 发送e_mail,返回类型为int
* 当返回值为0时,说明邮件发送成功
* 当返回值为3时,说明邮件发送失败
*/
public int sendmail() throws ioexception, messagingexception {
int loopcount;
properties props = system.getproperties();
props.put("mail.smtp.host", smtphost);
props.put("mail.smtp.auth", "true");
mailauthenticator auth = new mailauthenticator();
session session = session.getinstance(props, auth);
session.setdebug(debug);
mimemessage msg = new mimemessage(session);
transport trans = null;
try {
fillmail(session,msg);
// send the message
trans = session.gettransport("smtp");
try {
trans.connect(smtphost, mailauthenticator.huawei_mail_user, mailauthenticator.huawei_mail_password);//, huawei_mail_password);
} catch (authenticationfailedexception e) {
e.printstacktrace();
system.out.println("连接邮件服务器错误:");
return 3;
} catch (messagingexception e) {
system.out.println("连接邮件服务器错误:");
return 3;
}
trans.send(msg);
trans.close();
} catch (messagingexception mex) {
system.out.println("发送邮件失败:");
mex.printstacktrace();
exception ex = null;
if ((ex = mex.getnextexception()) != null) {
system.out.println(ex.tostring());
ex.printstacktrace();
}
return 3;
} finally {
try {
if (trans != null && trans.isconnected())
trans.close();
} catch (exception e) {
system.out.println(e.tostring());
}
}
system.out.println("发送邮件成功!");
return 0;
}
public void setattachedfilelist(java.util.vector filelist)
{
attachedfilelist = filelist;
}
public void setdebug(boolean debugflag)
{
debug=debugflag;
}
public void setmailaccount(string straccount) {
mailaccount = straccount;
}
public void setmailbccto(string bccto) {
mailbccto = bccto;
}
public void setmailccto(string ccto) {
mailccto = ccto;
}
public void setmailfrom(string from)
{
mailfrom=from;
}
public void setmailpass(string strmailpass) {
mailpass = strmailpass;
}
public void setmailto(string to)
{
mailto=to;
}
public void setmessagebasepath(string basepath)
{
messagebasepath=basepath;
}
public void setmessagecontentmimetype(string mimetype)
{
messagecontentmimetype = mimetype;
}
public void setmsgcontent(string content)
{
msgcontent=content;
}
public void setsmtphost(string host)
{
smtphost=host;
}
public void setsubject(string sub)
{
subject=sub;
}
public static void main(string[] argv) throws exception
{
for(int i = 0;i<10;i ) {
sendmail sm = new sendmail();
sm.setsmtphost("smtp地址");
sm.setmailfrom("发送地址");
sm.setmailto("目标地址");
sm.setmsgcontent("内容");
sm.setsubject("标题");
sm.sendmail();
}
}
}
posted on 2006-04-24 11:05
我心依旧 阅读(29993)
评论(28)