本程序利用Apache commons Email、Apache commons IO、Apache commons FileUpload组件,并使用MyEclipse6.0、JDK6.0、Tomcat6.0调试通过。
commons-email是apache提供的一个开源的API,主要包括SimpleEmail,MultiPartEmail,HtmlEmail,EmailAttachment四个类。
SimpleEmail:发送简单的email,不能添加附件
MultiPartEmail:文本邮件,可以添加多个附件
HtmlEmail:HTML格式邮件,同时具有MultiPartEmail类所有“功能”
EmailAttchment:附件类,可以添加本地资源,也可以指定网络上资源,在发送时自动将网络上资源下载发送
使用Apache commons Email组件发送邮件时,要求有一个可支持Email发送的邮件服务器,并且有合法的帐号及密码,本例中使用163提供的smtp.163.com服务器。具体步骤如下:
1. 在MyEclipse中创建Web项目
在MyEclipse中创建Web项目JavaMail,在WebRoot中创建用于保存上传文件的目录
uploads。
2. 到http://www.apache.org下载相关的组件
到http://www.apache.org下载相关的组件,下载后解压缩,并找到下面本个JAR文件,复制到Web项目的WEB-INF/lib目录中。
commons-email-1.1.jar
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
3. 创建显示消息的JSP文件message.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>消息提示</title>
</head>
<body>
${requestScope['sendmail.message'] }
</body>
</html>
4 带附件的电子邮件
4.1 创建JSP文件sendMail2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>带附件的电子邮件</title>
</head>
<body>
使用Apache 组件发送带附件的邮件
<hr/>
<form action="<%=request.getContextPath()%>/servlet/SendMailController2" method="post" enctype="multipart/form-data" name="form1">
<table width="600" border="1">
<tr>
<td>发邮件地址:</td>
<td><label>
<input name="from" type="text" id="from" size="50" value="${requestScope.userName}@163.com">
</label></td>
<td> </td>
</tr>
<tr>
<td>收件邮件地址:</td>
<td>
<label>
<input name="to" type="text" id="to" size="50">
</label> </td>
<td> </td>
</tr>
<tr>
<td>邮件主题:</td>
<td><label>
<input name="subject" type="text" id="subject" size="50">
</label></td>
<td> </td>
</tr>
<tr>
<td>邮件内容:</td>
<td><label>
<textarea name="content" id="content" cols="50" rows="8"></textarea>
</label></td>
<td> </td>
</tr>
<tr>
<td>附件:</td>
<td><label>
<input name="file" type="file" id="file" size="43">
</label></td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><label>
<input type="submit" name="button" id="button" value="提交">
</label>
<label>
<input type="reset" name="button2" id="button2" value="重置">
</label></td>
<td> </td>
</tr>
</table>
</form>
</body>
</html>
4.2 创建用于发送邮件的sevlet,SendMailController2.jsp
/**********************************************************
* 文件名: SendMailController2.java
* Copyright (c) 2008-2009 长春信息技术职业学院
* 文件编号:
* 创 建 人: 孙丰伟 E-mail:
[email protected]
* 日 期: 2008-7-26
* 修 改 人:
* 日 期:
* 描 述: 保存SendMailController2类.发送带附件的邮件
* ********************************************************/
package com.sunfengwei.mail.controller;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.MultiPartEmail;
/***********************************************************
* 类编号:
* 类名 : SendMailController2
* 作 用 : 接受客户请求,完成邮件发送
* 作 者 : 孙丰伟
* 日 期 : 2008-7-26
* 方 法 : init 初始Servlet中声明的私有成员
* doPost 接收客户端请求,完成邮件发送
* doSave 发送带附件的邮件时,完成邮件上传及接收客户端参数
************************************************************/
public class SendMailController2 extends HttpServlet {
private ServletContext cx;
private String savePath;
private Map<String,String> parameters;
/********************************************************
* 函数名: doPost
* 功能描述: 获取客户端请求,根据客户端请求发送邮件
* 输入参数: request,response
* 返 回 值: 无
* 作 者: 孙丰伟
* 日 期: 2008-7-26
********************************************************/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//
//复杂邮件发送对象
//
MultiPartEmail mail=new MultiPartEmail();
//
//邮件对象编码
//
mail.setCharset("UTF-8");
//
//设置邮件服务器
//
mail.setHostName("smtp.163.com");
//
//邮件身份认证,必须是在邮件服务器上注册的合法身份
//
mail.setAuthentication("sunfengweimail", "password");
File file=this.doSave(request);
try {
//
//收邮件地址
//
mail.addTo(parameters.get("to"));
//
//发邮件地址
//
mail.setFrom(parameters.get("from"));
//
//邮件主题
//
mail.setSubject(parameters.get("subject"));
//
//邮件内容
//
mail.setMsg(parameters.get("content"));
//
//附加邮件附件
//
if(file!=null)
{
EmailAttachment attachment=new EmailAttachment();
//
//设置邮件附件物理路径
//
attachment.setPath(file.getPath());
//
//邮件附件为从服务器加载的邮件,还有另一个值为ONLINE,表示附件来自INTENET网
//
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setName(file.getName());
//
//绑定附件
//
mail.attach(attachment);
}
//
//发送邮件
//
mail.send();
request.setAttribute("sendmail.message", "邮件发送成功!");
} catch (EmailException e) {
// TODO Auto-generated catch block
e.printStackTrace();
request.setAttribute("sendmail.message", "邮件发送失败!");
}
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
/********************************************************
* 函数名: doSave
* 功能描述: 完成文件上传,把客户端提交的参数保存到Map中
* 输入参数: request
* 返 回 值: File
* 作 者: 孙丰伟
* 日 期: 2008-7-26
********************************************************/
private File doSave(HttpServletRequest request)
{
File file=null;
//
//实例化commons Upload组件提供的磁盘文件工厂
//
DiskFileItemFactory factory=new DiskFileItemFactory();
//
//专用于Servlet中上传文件
//
ServletFileUpload upload=new ServletFileUpload(factory);
//
//实例化参数集合parameters,此处使用JDK1.5提供的范型
//
parameters=new HashMap<String,String>();
try{
//
//通过upload对象,获取所有的请求列表
//
List<FileItem> list=upload.parseRequest(request);
//
//使用foreach循环遍历请求列表
//
for(FileItem item:list)
{
//
// 如果是普通字段
//
if(item.isFormField())
{
//
// getFieldName为客户端字段名,getString为值,另外需处理汉字编码
//
parameters.put(item.getFieldName(), item.getString("UTF-8"));
}
//
// 如果是上传的文件,则将文件保存到服务器目录中
//
else
{
if(null!=item.getName()&&(!item.getName().equals("")))
{
File tempFile=new File(item.getName());
file=new File(cx.getRealPath("/")+savePath,tempFile.getName());
item.write(file);
}
}
}
}
catch(Exception ex)
{
request.setAttribute("upload.message", "文件上传失败!");
}
return file;
}
/********************************************************
* 函数名: init
* 功能描述: 初始化Servlet中私有成员值
* 输入参数: 无
* 返 回 值: 无
* 作 者: 孙丰伟
* 日 期: 2008-7-26
********************************************************/
public void init() throws ServletException {
//
// 从web.xml配置文件上读取当前Servlet中参数savePath的值
//
savePath=this.getInitParameter("savePath");
//
// 获取当前上下文
//
cx=this.getServletContext();
}
}
5 web.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>SendMailController2</servlet-name>
<servlet-class>com.sunfengwei.mail.controller.SendMailController2</servlet-class>
<init-param>
<param-name>savePath</param-name>
<param-value>/uploads</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SendMailController2</servlet-name>
<url-pattern>/servlet/SendMailController2</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
6. 在Tomcat6.0中发布运行