使用Java发送带附件的附件的示例

这里使用的是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盘查看,如果需要实际发送,可以参考我的其他博客,有专门说明!

(0)

相关推荐

  • java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

  • Java程序中使用JavaMail发送带图片和附件的邮件

    我们常常在邮件中添加附件,以达到传输较大文件的目的.而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩.我们想要一封正文部分图文并茂,而游客附带若干附件的邮件. 下面是代码结构中3个重要的方法: MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回: MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并

  • Java发送带html标签内容的邮件实例代码

    如下所示: package test; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import javax.mail.Session; import javax.mail.MessagingException; import javax.mail.Transport; public class

  • java 发送带Basic Auth认证的http post请求实例代码

    构造http header private static final String URL = "url"; private static final String APP_KEY = "key"; private static final String SECRET_KEY = "secret"; /** * 构造Basic Auth认证头信息 * * @return */ private String getHeader() { String

  • 使用Java发送带附件的附件的示例

    这里使用的是JavaMail技术,前台使用了fckeditor做邮件美化,由于只是示例,后台发送时只是将邮件保存在本地,但是可以查看,如果需要实际发送,请参考我的其他博客文章,我写了很多关于邮件发送的示例! JSP页面页面除了引用fckeditor外,要注意我们是需要发送附件的: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ ta

  • Python中Django发送带图片和附件的邮件

    最近需要做集团的SRC系统.暂无安全研发,所以只能找我这个小菜兼职开发.系统使用Django框架,在整个过程中,有许多奇特的需求.在某项需求中,需要给厂商用户发送富文本邮件,漏洞详情,这个折腾了一下,感觉略有收获,所以记一篇随笔. 首先我在网上搜索了一些资料,发现都是python通过smtplib发送,使用MIME格式来生成富文本邮件:传送门 我想的是,使用Django框架,框架带了邮件模块,没必要引入smtplib吧.我就想,向上文传送门那样,生成一个MIME文件,然后通过 from djan

  • java发送get请求和post请求示例

    java向服务端发送GET和POST请求 复制代码 代码如下: package com.hongyuan.test; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.HttpURLConnection;import java.net.URL; public class HttpCl

  • Java实现批量发送带附件的邮件代码

    目录 前言 实体类(注意注释) 实现类 方法中调用,详情如下: 总结 前言 新功能上线时要经常发包到测试或生产服务器进行模块部署,但由于安全限制只能通过邮件传输小于10M的附件这种方式把jar包上传到服务器.所以往往要发送几十个邮件手动发送比较麻烦,偷懒写了个粘贴即用的Demo,如有不足,请多指教! 实体类(注意注释) 代码详情如下: package Email; /* * 参数实体类 * */ public class EmailParameter { //发信邮箱 private Strin

  • JavaMail发送(带图片和附件)和接收邮件实现详解(四)

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等.我们这里所讲的就是利用 JavaMail 完成邮件的发送和接收功能. PS:本篇博客源码下载链接:https://github.com/YSOcean/cnblogs 1.JavaMail 介绍 JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现

  • Java Web stmp发送带附件邮件(附SSL版)

    本文实例为大家分享了Java Web stmp发送带附件邮件的具体代码,供大家参考,具体内容如下 public class MailFileSendUtils { private Properties props; //系统属性 private Session session; //邮件会话对象 private MimeMessage mimeMsg; //MIME邮件对象 private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成Mi

随机推荐