利用sun公司提供的javamail api可以很方便的开发邮件发送程序。也许你已经可以利用它来发送一段简单的文本了,但想不想使你的程序像outlook一样也能发送附件呢?本文在简单介绍了javamail之后,详细讲解了一段完整的送信的javabean及一个十分轻巧的servlet。
(没有装载javamail api的读者,可以到此站点下载,并按照readme.txt设置好classpath)
一、javamail中一些我们需要的类
1.properties
javamail需要properties来创建一个session对象,其属性值就是发送邮件的主机,如:
properties props = new properties ();
props.put("mail.smtp.host", "smtp.xxxx.com");//可以换上你的smtp主机名,就像你在outlook中设置smtp主机名一样。
2.session
所有的基于javamail的程序都至少需要一个或全部的对话目标。
session session = session.getinstance(props, null);
3.mimemessage
信息对象将把你所发送的邮件真实的反映出来。
mimemessage msg = new mimemessage(session);
4.transport
邮件的发送是由transport来完成的:
transport.send(msg);
二、我们自己创建的可发送附件的类
import java.util.* ;
import java.io.* ;
import javax.mail.* ;
import javax.mail.internet.* ;
import javax.activation.* ;
public class mail {
//定义发件人、收件人、主题等
string to="";
string from="";
string host="";
string filename="";
string subject="";
//用于保存发送附件的文件名的集合
vector file = new vector();
//做一个可以传发件人等参数的构造
public mail (string to,string from,string smtpserver,string subject){
//初始化发件人、收件人、主题等
this.to=to;
this.from=from;
this.host=smtpserver;
this.subject=subject;
}
//该方法用于收集附件名
public void attachfile(string fname){
file.addelement(fname);
}
//开始发送信件的方法
public boolean startsend(){
//创建properties对象
properties props = system.getproperties();
//创建信件服务器
props.put("mail.smtp.host", host);
//得到默认的对话对象
session session=session.getdefaultinstance(props, null); try {
//创建一个消息,并初始化该消息的各项元素
mimemessage msg = new mimemessage(session);
msg.setfrom(new internetaddress(from));
internetaddress[] address={new internetaddress(to)};
msg.setrecipients(message.recipienttype.to,address);
msg.setsubject(subject);
//后面的bodypart将加入到此处创建的multipart中
multipart mp = new mimemultipart();
//利用枚举器方便的遍历集合
enumeration efile=file.elements();
//检查序列中是否还有更多的对象
while(efile.hasmoreelements()){
mimebodypart mbp=new mimebodypart();
//选择出每一个附件名
filename=efile .nextelement().tostring();
//得到数据源
filedatasource fds=new filedatasource(filename);
//得到附件本身并至入bodypart
mbp.setdatahandler(new datahandler(fds));
//得到文件名同样至入bodypart
mbp.setfilename(fds.getname());
mp.addbodypart(mbp);
}
//移走集合中的所有元素
file.removeallelements();
//multipart加入到信件
msg.setcontent(mp);
//设置信件头的发送日期
msg.setsentdate(new date());
//发送信件
transport.send(msg);
} catch (messagingexception mex) {
mex.printstacktrace();
exception ex = null;
if ((ex=mex.getnextexception())!=null){
ex.printstacktrace();
}
return false;
}
return true;
}
}
三、一个简单的servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class sendmail extends
httpservlet implements singlethreadmodel{
public void init(servletconfig conf)
throws servletexception {
super.init(conf);
}
public void dopost(httpservletrequest
req, httpservletresponse res)
throws servletexception, ioexception {
try{
//实例化刚才我们做的类,并按其构造传进相应的参数
mail sendmail=newmail("zhang@263.net",
"chtwoy@21cn.com","smtp.21cn.com","test");
sendmail.attachfile("table.pdf");
sendmail.startsend();
}catch(exception e){
e.printstacktrace();
}
}
public void destroy() {
}
}
四、小结
至此,你已经可以在邮件中添加附件了,而且可以是多个。像这样,将响应与逻辑相分离对代码的扩展和维护是相当有好处的。若beans与servlet不在同一个包下,别忘了“import”。
