JavaMail邮件发送-能发送附件和带背景音乐的邮件的小系统
这里使用的是JavaMail技术,前台使用了fckeditor做邮件美化,由于只是示例,后台发送时只是将邮件保存在本地,但是可以查看,如果需要实际发送,请参考我的其他博客文章,我写了很多关于邮件发送的示例!
JSP页面页面除了引用fckeditor外,要注意我们是需要发送附件的:
- <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
- <%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
- <%
- Stringpath=request.getContextPath();
- StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <basehref="<%=basePath%>">
- <title>发送邮件</title>
- <metahttp-equiv="pragma"content="no-cache">
- <metahttp-equiv="cache-control"content="no-cache">
- <metahttp-equiv="expires"content="0">
- <scripttype="text/javascript"src="fckeditor/fckeditor.js"></script>
- <scripttype="text/javascript">
- window.onload=function(){
- varoFCKeditor=newFCKeditor('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>
- <!--注意表单格式,这里需要上传附件-->
- <formaction="SendMailServlet"method="post"enctype="multipart/form-data">
- <table>
- <tr>
- <td>收件人:</td>
- <td><inputtype="text"name="to"/></td>
- </tr>
- <tr>
- <td>抄送:</td>
- <td><inputtype="text"name="copy"/></td>
- </tr>
- <tr>
- <td>主题:</td>
- <td><inputtype="text"name="title"/></td>
- </tr>
- <tr>
- <td>信件内容:</td>
- <td><textarearows="10"cols="20"name="content"id="content"></textarea></td>
- </tr>
- <tr>
- <td>附件:</td>
- <td><inputtype='file'name='ufile'/></td>
- </tr>
- <tr>
- <td>背景音乐:</td>
- <td><inputtype='file'name='umusic'/></td>
- </tr>
- <tr>
- <td>背景图片:</td><!--背景图片我们后台自己准备-->
- <td>
- <selectname="bgimg">
- <optionvalue="1">一号</option>
- <optionvalue="2">二号</option>
- </select>
- </td>
- </tr>
- <tralign="right">
- <tdcolspan="2"><inputtype="submit"value="发送"></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
为了防止乱码,会经过一个过滤器:
- packageorg.filter;
- importjava.io.IOException;
- importjavax.servlet.Filter;
- importjavax.servlet.FilterChain;
- importjavax.servlet.FilterConfig;
- importjavax.servlet.ServletException;
- importjavax.servlet.ServletRequest;
- importjavax.servlet.ServletResponse;
- /**
- *过滤器防止乱码
- *@说明
- *@authorcuisuqiang
- *@version1.0
- *@since
- */
- publicclassEncodingFilterimplementsFilter{
- publicvoiddestroy(){
- }
- publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
- FilterChainchain)throwsIOException,ServletException{
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
- chain.doFilter(request,response);
- }
- publicvoidinit(FilterConfigarg0)throwsServletException{
- }
- }
然后到Servlet处理附件和信息,这里就不做异常处理了,出错直接报错:
- packageorg.servlet;
- importjava.io.*;
- importjava.util.*;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importorg.apache.commons.fileupload.FileItem;
- importorg.apache.commons.fileupload.FileItemFactory;
- importorg.apache.commons.fileupload.FileUploadException;
- importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
- importorg.apache.commons.fileupload.servlet.ServletFileUpload;
- importorg.entity.MailModel;
- importorg.mail.SendMail;
- /**
- *接收表单,处理附件,组装邮件对象,并调用发送接口
- *@说明在C盘创建临时文件
- *@authorcuisuqiang
- *@version1.0
- *@since
- */
- @SuppressWarnings("serial")
- publicclassSendMailServletextendsHttpServlet{
- @SuppressWarnings({"unchecked","deprecation"})
- @Override
- protectedvoidservice(HttpServletRequestrequest,
- HttpServletResponseresponse)throwsServletException,IOException{
- //建立磁盘工厂
- FileItemFactoryfactory=newDiskFileItemFactory();
- //表单域
- ServletFileUploadupload=newServletFileUpload(factory);
- List<FileItem>items=null;
- Stringbgimg="1";//默认是第一个背景图片
- try{
- items=upload.parseRequest(request);
- }catch(FileUploadExceptione){
- e.printStackTrace();
- }
- MailModelmail=newMailModel();
- InputStreamis=null;
- for(FileItemitem:items){
- if(!item.isFormField()){//如果是附件
- if(item.getSize()>0){
- is=item.getInputStream();
- Stringfilename="";
- 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{
- Filefile=newFile(filename);
- FileOutputStreamfos=newFileOutputStream(file);//建立输出流
- byte[]buffer=newbyte[8192];//每次读8K字节,大文件上传没有问题
- intcount=0;
- while((count=is.read(buffer))>0){//循环写入到硬盘
- fos.write(buffer,0,count);
- }
- fos.close();//关闭输入输出流
- is.close();
- if(item.getFieldName().equals("ufile")){
- mail.setFilePath(filename);
- }elseif(item.getFieldName().equals("umusic")){
- mail.setMusicPath(filename);
- }
- }
- }
- }else{//处理文本信息
- if(item.getFieldName().equals("title")){
- mail.setTitle(item.getString("UTF-8"));
- }elseif(item.getFieldName().equals("content")){
- mail.setContext(item.getString("UTF-8"));
- }elseif(item.getFieldName().equals("to")){
- mail.setTo(item.getString("UTF-8"));
- }elseif(item.getFieldName().equals("copy")){
- mail.setCopy(item.getString("UTF-8"));
- }elseif(item.getFieldName().equals("bgimg")){
- bgimg=item.getString("UTF-8");
- }
- }
- }
- StringbgPath=request.getRealPath("/")+"\\images\\bg"+bgimg+".jpg";
- mail.setBgPath(bgPath);
- try{
- SendMail.sendMail(mail);
- }catch(Exceptione){
- e.printStackTrace();
- }
- response.sendRedirect(request.getContextPath()+"/sendmail.jsp");
- }
- }
这里也没有验证,接收到信息后组装一个邮件实体对象,传递到发送接口中发送:
实体,我就不写get和set方法了:
- packageorg.entity;
- /**
- *一封邮件的对象
- *@说明
- *@authorcuisuqiang
- *@version1.0
- *@since
- */
- publicclassMailModel{
- /**
- *主键
- */
- privateintid;
- /**
- *邮件标题
- */
- privateStringtitle;
- /**
- *发送给谁
- */
- privateStringto;
- /**
- *背景图片地址
- */
- privateStringbgPath;
- /**
- *抄送给谁
- */
- privateStringcopy;
- /**
- *邮件内容
- */
- privateStringcontext;
- /**
- *附件地址
- */
- privateStringfilePath;
- /**
- *背景音乐地址
- */
- privateStringmusicPath;
- }
然后我们来看看核心处理类:
- packageorg.mail;
- importjava.io.File;
- importjava.io.FileOutputStream;
- importjava.io.OutputStream;
- importjava.util.Date;
- importjava.util.Properties;
- importjavax.activation.DataHandler;
- importjavax.activation.DataSource;
- importjavax.activation.FileDataSource;
- importjavax.mail.Message;
- importjavax.mail.Session;
- importjavax.mail.internet.InternetAddress;
- importjavax.mail.internet.MimeBodyPart;
- importjavax.mail.internet.MimeMessage;
- importjavax.mail.internet.MimeMultipart;
- importjavax.mail.internet.MimeUtility;
- importorg.entity.MailModel;
- /**
- *发送一封邮件
- *@说明注意这里并没有实际发送而是保存在了C盘临时文件中,真是发送的话,请参考我的博客
- *@authorcuisuqiang
- *@version1.0
- *@since
- */
- publicclassSendMail{
- publicstaticvoidsendMail(MailModelmail)throwsException{
- Propertiesprops=newProperties();
- props.put("mail.smtp.auth","true");
- Sessionsession=Session.getInstance(props);
- Messagemessage=newMimeMessage(session);
- InternetAddressfrom=newInternetAddress();
- from.setPersonal(MimeUtility.encodeText("风中落叶<[email protected]>"));
- message.setFrom(from);
- InternetAddressto=newInternetAddress(mail.getTo());
- message.setRecipient(Message.RecipientType.TO,to);
- //是否抄送
- if(null!=mail.getCopy()&&!"".equals(mail.getCopy())){
- InternetAddresscopy=newInternetAddress(mail.getCopy());
- message.setRecipient(Message.RecipientType.CC,copy);
- }
- message.setSubject(MimeUtility.encodeText(mail.getTitle()));
- message.setSentDate(newDate());
- //指定为混合关系
- MimeMultipartmsgMultipart=newMimeMultipart("mixed");
- message.setContent(msgMultipart);
- MimeBodyPartcontent=newMimeBodyPart();
- msgMultipart.addBodyPart(content);
- //依赖关系
- MimeMultipartbodyMultipart=newMimeMultipart("related");
- content.setContent(bodyMultipart);
- MimeBodyParthtmlPart=newMimeBodyPart();
- //组装的顺序非常重要
- bodyMultipart.addBodyPart(htmlPart);
- MimeBodyPartin_bg=newMimeBodyPart();
- bodyMultipart.addBodyPart(in_bg);
- DataSourcebgsou=newFileDataSource(mail.getBgPath());
- DataHandlerbghd=newDataHandler(bgsou);
- in_bg.setDataHandler(bghd);
- in_bg.setHeader("Content-Location","bg.jpg");
- //是否使用了背景音乐
- if(null==mail.getMusicPath()||"".equals(mail.getMusicPath())){
- Stringstart="<html><bodybackground='bg.jpg'>";
- Stringend="</body></html>";
- htmlPart.setContent(start+mail.getContext()+end,"text/html;charset=UTF-8");
- }else{
- MimeBodyPartin_Part=newMimeBodyPart();
- bodyMultipart.addBodyPart(in_Part);
- DataSourcegifds=newFileDataSource(mail.getMusicPath());
- DataHandlergifdh=newDataHandler(gifds);
- in_Part.setDataHandler(gifdh);
- in_Part.setHeader("Content-Location","bg.mp3");
- Stringstart="<html><head><bgsoundsrc='bg.mp3'loop='-1'></head><bodybackground='bg.jpg'>";
- Stringend="</body></html>";
- htmlPart.setContent(start+mail.getContext()+end,"text/html;charset=UTF-8");
- }
- //组装附件
- if(null!=mail.getFilePath()&&!"".equals(mail.getFilePath())){
- MimeBodyPartfile=newMimeBodyPart();
- FileDataSourcefile_datasource=newFileDataSource(mail
- .getFilePath());
- DataHandlerdh=newDataHandler(file_datasource);
- file.setDataHandler(dh);
- file.setFileName(MimeUtility.encodeText(dh.getName()));
- msgMultipart.addBodyPart(file);
- }
- message.saveChanges();
- //保存邮件
- OutputStreamips=newFileOutputStream("C:\\tmp\\test.eml");
- message.writeTo(ips);
- ips.close();
- System.out.println("------------发送完毕------------");
- //删除临时文件
- if(null!=mail.getMusicPath()&&!"".equals(mail.getMusicPath())){
- Filefile=newFile(mail.getMusicPath());
- file.delete();
- }
- if(null!=mail.getFilePath()&&!"".equals(mail.getFilePath())){
- Filefile=newFile(mail.getFilePath());
- file.delete();
- }
- }
- }
我们把邮件发送了C盘,可以到C盘查看,如果需要实际发送,可以参考我的其他博客,有专门说明!
请您到ITEYE网站看原创,谢谢!