利用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 该E-mail地址已受到防止垃圾邮件机器人的保护,您必须启用浏览器的Java Script才能看到。 ", 

" chtwoy@21cn.com 该E-mail地址已受到防止垃圾邮件机器人的保护,您必须启用浏览器的Java Script才能看到。 ","smtp.21cn.com","test"); 

sendmail.attachfile("table.pdf"); 

sendmail.startSend(); 

}catch(Exception e){ 

e.printStackTrace(); 

} 

} 

public void destroy() { 

} 

}




四、小结


至此,你已经可以在邮件中添加附件了,而且可以是多个。像这样,将响应与逻辑相分离对代码的扩展和维护是相当有好处的。若Beans与servlet不在同一个包下,别忘了“import”。