这里使用的是JavaMail技术,前台使用了fckeditor做邮件美化,由于只是示例,后台发送时只是将邮件保存在本地,但是可以查看,如果需要实际发送,请参考我的其他博客文章,我写了很多关于邮件发送的示例!
JSP页面页面除了引用fckeditor外,要注意我们是需要发送附件的:
<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"UTF-8\"%>
<%@ taglib prefix=\"c\" uri=\"http://java.sun.com/jsp/jstl/core\" %>
<%
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>
<meta http-equiv=\"pragma\" content=\"no-cache\">
<meta http-equiv=\"cache-control\" content=\"no-cache\">
<meta http-equiv=\"expires\" content=\"0\">
<script type=\"text/javascript\" src=\"fckeditor/fckeditor.js\"></script>
<script type=\"text/javascript\">
window.onload=function(){
var oFCKeditor = new FCKeditor( \'content\' ) ;
//编译器基本路径
oFCKeditor.BasePath = \"/pro_04/fckeditor/\";
//高度
oFCKeditor.Width=800;
//宽度
oFCKeditor.Height=300;
//工具条集合名称(Default,Basic或自己制定,关于FCK的使用,博客内有专门文章)
//具体的配置可以将默认显示出来然后到FCK目录里的fckconfig.js里
//FCKConfig.ToolbarSets[\"Default\"]数组中去除不要的功能一共63个功能属性
//oFCKeditor.ToolbarSet=\"Basic\";
oFCKeditor.ReplaceTextarea() ;
}
</script>
</head>
<body>
<!-- 注意表单格式,这里需要上传附件 -->
<form action=\"SendMailServlet\" method=\"post\" enctype=\"multipart/form-data\">
<table>
<tr>
<td>收件人:</td>
<td><input type=\"text\" name=\"to\" /></td>
</tr>
<tr>
<td>抄送:</td>
<td><input type=\"text\" name=\"copy\" /></td>
</tr>
<tr>
<td>主题:</td>
<td><input type=\"text\" name=\"title\" /></td>
</tr>
<tr>
<td>信件内容:</td>
<td><textarea rows=\"10\" cols=\"20\" name=\"content\" id=\"content\"></textarea></td>
</tr>
<tr>
<td>附件:</td>
<td><input type=\'file\' name=\'ufile\' /></td>
</tr>
<tr>
<td>背景音乐:</td>
<td><input type=\'file\' name=\'umusic\' /></td>
</tr>
<tr>
<td>背景图片:</td><!-- 背景图片我们后台自己准备 -->
<td>
<select name=\"bgimg\">
<option value=\"1\">一号</option>
<option value=\"2\">二号</option>
</select>
</td>
</tr>
<tr align=\"right\">
<td colspan=\"2\"><input type=\"submit\" value=\"发 送\"></td>
</tr>
</table>
</form>
</body>
</html>
为了防止乱码,会经过一个过滤器:
package org.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 过滤器防止乱码
* @说明
* @author cuisuqiang
* @version 1.0
* @since
*/
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(\"UTF-8\");
response.setCharacterEncoding(\"UTF-8\");
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
然后到Servlet处理附件和信息,这里就不做异常处理了,出错直接报错:
package org.servlet;
import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.entity.MailModel;
import org.mail.SendMail;
/**
* 接收表单,处理附件,组装邮件对象,并调用发送接口
* @说明 在C盘创建临时文件
* @author cuisuqiang
* @version 1.0
* @since
*/
@SuppressWarnings(\"serial\")
public class SendMailServlet extends HttpServlet {
@SuppressWarnings( { \"unchecked\", \"deprecation\" })
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 建立磁盘工厂
FileItemFactory factory = new DiskFileItemFactory();
// 表单域
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
String bgimg = \"1\"; // 默认是第一个背景图片
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
MailModel mail = new MailModel();
InputStream is = null;
for (FileItem item : items) {
if (!item.isFormField()) { // 如果是附件
if (item.getSize() > 0) {
is = item.getInputStream();
String filename = \"\";
if (item.getName().indexOf(\"\\\\\") == -1) {
filename = \"c:\\\\tmp\\\\\" + item.getName();
} else {
filename = \"c:\\\\tmp\\\\\" + item.getName().substring(item.getName().lastIndexOf(\"\\\\\"));
}
if (is.markSupported()) {
System.out.println(\"没有上传文件或文件已经删除\");
} else {
File file = new File(filename);
FileOutputStream fos = new FileOutputStream(file); // 建立输出流
byte[] buffer = new byte[8192]; // 每次读8K字节,大文件上传没有问题
int count = 0;
while ((count = is.read(buffer)) > 0) { // 循环写入到硬盘
fos.write(buffer, 0, count);
}
fos.close(); // 关闭输入输出流
is.close();
if (item.getFieldName().equals(\"ufile\")) {
mail.setFilePath(filename);
} else if (item.getFieldName().equals(\"umusic\")) {
mail.setMusicPath(filename);
}
}
}
} else { // 处理文本信息
if (item.getFieldName().equals(\"title\")) {
mail.setTitle(item.getString(\"UTF-8\"));
} else if (item.getFieldName().equals(\"content\")) {
mail.setContext(item.getString(\"UTF-8\"));
} else if (item.getFieldName().equals(\"to\")) {
mail.setTo(item.getString(\"UTF-8\"));
} else if (item.getFieldName().equals(\"copy\")) {
mail.setCopy(item.getString(\"UTF-8\"));
} else if (item.getFieldName().equals(\"bgimg\")) {
bgimg = item.getString(\"UTF-8\");
}
}
}
String bgPath = request.getRealPath(\"/\") + \"\\\\images\\\\bg\" + bgimg + \".jpg\";
mail.setBgPath(bgPath);
try {
SendMail.sendMail(mail);
} catch (Exception e) {
e.printStackTrace();
}
response.sendRedirect(request.getContextPath() + \"/sendmail.jsp\");
}
}
这里也没有验证,接收到信息后组装一个邮件实体对象,传递到发送接口中发送:
实体,我就不写get和set方法了:
package org.entity;
/**
* 一封邮件的对象
* @说明
* @author cuisuqiang
* @version 1.0
* @since
*/
public class MailModel {
/**
* 主键
*/
private int id;
/**
* 邮件标题
*/
private String title;
/**
* 发送给谁
*/
private String to;
/**
* 背景图片地址
*/
private String bgPath;
/**
* 抄送给谁
*/
private String copy;
/**
* 邮件内容
*/
private String context;
/**
* 附件地址
*/
private String filePath;
/**
* 背景音乐地址
*/
private String musicPath;
}
然后我们来看看核心处理类:
package org.mail;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import org.entity.MailModel;
/**
* 发送一封邮件
* @说明 注意这里并没有实际发送而是保存在了C盘临时文件中,真是发送的话,请参考我的博客
* @author cuisuqiang
* @version 1.0
* @since
*/
public class SendMail {
public static void sendMail(MailModel mail) throws Exception {
Properties props = new Properties();
props.put(\"mail.smtp.auth\", \"true\");
Session session = Session.getInstance(props);
Message message = new MimeMessage(session);
InternetAddress from = new InternetAddress();
from.setPersonal(MimeUtility.encodeText(\"风中落叶<cuisuqiang@163.com>\"));
message.setFrom(from);
InternetAddress to = new InternetAddress(mail.getTo());
message.setRecipient(Message.RecipientType.TO, to);
// 是否抄送
if (null != mail.getCopy() && !\"\".equals(mail.getCopy())) {
InternetAddress copy = new InternetAddress(mail.getCopy());
message.setRecipient(Message.RecipientType.CC, copy);
}
message.setSubject(MimeUtility.encodeText(mail.getTitle()));
message.setSentDate(new Date());
// 指定为混合关系
MimeMultipart msgMultipart = new MimeMultipart(\"mixed\");
message.setContent(msgMultipart);
MimeBodyPart content = new MimeBodyPart();
msgMultipart.addBodyPart(content);
// 依赖关系
MimeMultipart bodyMultipart = new MimeMultipart(\"related\");
content.setContent(bodyMultipart);
MimeBodyPart htmlPart = new MimeBodyPart();
// 组装的顺序非常重要
bodyMultipart.addBodyPart(htmlPart);
MimeBodyPart in_bg = new MimeBodyPart();
bodyMultipart.addBodyPart(in_bg);
DataSource bgsou = new FileDataSource(mail.getBgPath());
DataHandler bghd = new DataHandler(bgsou);
in_bg.setDataHandler(bghd);
in_bg.setHeader(\"Content-Location\", \"bg.jpg\");
// 是否使用了背景音乐
if (null == mail.getMusicPath() || \"\".equals(mail.getMusicPath())) {
String start = \"<html><body background=\'bg.jpg\'>\";
String end = \"</body></html>\";
htmlPart.setContent(start + mail.getContext() + end,\"text/html;charset=UTF-8\");
} else {
MimeBodyPart in_Part = new MimeBodyPart();
bodyMultipart.addBodyPart(in_Part);
DataSource gifds = new FileDataSource(mail.getMusicPath());
DataHandler gifdh = new DataHandler(gifds);
in_Part.setDataHandler(gifdh);
in_Part.setHeader(\"Content-Location\", \"bg.mp3\");
String start = \"<html><head><bgsound src=\'bg.mp3\' loop=\'-1\'></head><body background=\'bg.jpg\'>\";
String end = \"</body></html>\";
htmlPart.setContent(start + mail.getContext() + end,\"text/html;charset=UTF-8\");
}
// 组装附件
if (null != mail.getFilePath() && !\"\".equals(mail.getFilePath())) {
MimeBodyPart file = new MimeBodyPart();
FileDataSource file_datasource = new FileDataSource(mail
.getFilePath());
DataHandler dh = new DataHandler(file_datasource);
file.setDataHandler(dh);
file.setFileName(MimeUtility.encodeText(dh.getName()));
msgMultipart.addBodyPart(file);
}
message.saveChanges();
// 保存邮件
OutputStream ips = new FileOutputStream(\"C:\\\\tmp\\\\test.eml\");
message.writeTo(ips);
ips.close();
System.out.println(\"------------发送完毕------------\");
// 删除临时文件
if (null != mail.getMusicPath() && !\"\".equals(mail.getMusicPath())) {
File file = new File(mail.getMusicPath());
file.delete();
}
if (null != mail.getFilePath() && !\"\".equals(mail.getFilePath())) {
File file = new File(mail.getFilePath());
file.delete();
}
}
}
我们把邮件发送了C盘,可以到C盘查看,如果需要实际发送,可以参考我的其他博客,有专门说明!
本文地址:https://www.stayed.cn/item/15152
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我