利用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”。
157
|