使用javamail 发送邮件:正文、图片、附件

可以先写一个properties文件
mail.properties

mail.smtpServer=XXX.qq.com
mail.username=xxxxx@qq.com
//密码是去邮箱设置的授权码
mail.password=xxxxx

再写一个静态的配置类,为了吧发件信息写活,到时候代码好获取,测试也可以直接写死

private static final Properties props;
    static {
        InputStream in = RemoteFileConfigUtils.class.getClassLoader().getResourceAsStream("mail.properties");
        props = new Properties();
        try {
            props.load(in);
        } catch (IOException ex) {
            throw new RuntimeException(ex.getMessage(), ex);
        } finally {
            IOUtils.closeQuietly(in);
        }
    }


/**
     * 得到某一属性的值.
     * 
     * @param key
     *            取得其值的键
     * @return key的值
     */
    public static String getValue(String key) {
        if (props.containsKey(key)) {
            // 得到某一属性的值
            String value = props.getProperty(key);
            return value;
        } else
            return "";
    }

具体的代码:

public static MimeMessage imageMail(Session session,HttpServletRequest request,String emailAdd) throws MessagingException, UnsupportedEncodingException {
          //emailAdd 是收件人的邮箱地址
          //消息的固定信息
          MimeMessage mimeMessage = new MimeMessage(session);
          //邮件发送人
          mimeMessage.setFrom(new InternetAddress(CommonUtils.getValue("mail.username")));
          //邮件接收人
          mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(emailAdd));
          //标题
          mimeMessage.setSubject("标题提醒", "UTF-8");
          /*
           *  	下面是邮件内容的创建:
           */
          //创建图片“节点”
          String realPath=request.getSession().getServletContext()
                  .getRealPath("add_icon.png");
          String realPath1=request.getSession().getServletContext()
                  .getRealPath("search2.png");
          MimeBodyPart image = new MimeBodyPart();
          MimeBodyPart image1 = new MimeBodyPart();
          DataHandler dh = new DataHandler(new FileDataSource(realPath)); // 读取本地文件
          image.setDataHandler(dh);                            // 将图片数据添加到“节点”
          image.setContentID("add_icon.png");            // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
          DataHandler dh1 = new DataHandler(new FileDataSource(realPath1)); // 读取本地文件
          image1.setDataHandler(dh1);                            // 将图片数据添加到“节点”
          image1.setContentID("search2.png");            // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
          //创建文本“节点”
          MimeBodyPart text = new MimeBodyPart();
          text.setContent("提醒:正文标题 <br> <font color=\"red\"><b>【提示】</b></font><br><br></br> " +
                 传的第一张图片 -><img src='cid:search2.png'/> 传第二张图片<img src='cid:add_icon.png'/>上。<br>" +
                       
                  ,"text/html;charset=UTF-8");
          //(文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
          MimeMultipart mm_text_image = new MimeMultipart();
          mm_text_image.addBodyPart(text);
          mm_text_image.addBodyPart(image);
          mm_text_image.addBodyPart(image1);
          mm_text_image.setSubType("related");        // 关联关系
          //将 文本+图片 的混合“节点”封装成一个普通“节点”
          //    最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
          //    上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
          MimeBodyPart text_image = new MimeBodyPart();
          text_image.setContent(mm_text_image);
          //创建附件“节点”
          String path=request.getSession().getServletContext()
                  .getRealPath("附件-流程.zip");
          MimeBodyPart attachment = new MimeBodyPart();
          DataHandler dh2 = new DataHandler(new FileDataSource(path));  // 读取本地文件
          attachment.setDataHandler(dh2);                                                            // 将附件数据添加到“节点”
          attachment.setFileName(MimeUtility.encodeText(dh2.getName()));                    // 设置附件的文件名(需要编码)

          //设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
          MimeMultipart mm = new MimeMultipart();
          mm.addBodyPart(text_image);
          mm.addBodyPart(attachment);                // 如果有多个附件,可以创建多个多次添加
          mm.setSubType("mixed");                        // 混合关系

          //设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
          mimeMessage.setContent(mm);
          //设置发件时间
          mimeMessage.setSentDate(new Date());
          //保存上面的所有设置
          mimeMessage.saveChanges();
          return mimeMessage;
   }

再写一个配置类,放所有的邮件发送方式的

public static void sendImageMail(String emailAdd, Map<String, String> paramMap,HttpServletRequest request) throws MessagingException, UnsupportedEncodingException {
          //创建一个配置文件保存并读取信息
    Properties properties = new Properties();
    //设置邮件服务器
    properties.setProperty("mail.host",CommonUtils.getValue("mail.smtpServer"));
    //设置发送的协议
    properties.setProperty("mail.transport.protocol","smtp");
    //设置用户是否需要验证
    properties.setProperty("mail.smtp.auth","true");
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.timeout", 25000);
    //1.创建一个session会话对象;
    Session session = Session.getDefaultInstance(properties, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(CommonUtils.getValue("mail.username"),CommonUtils.getValue("mail.password"));
        }
    });
    //可以通过session开启Dubug模式,查看所有的过程
    session.setDebug(true);
    //2.获取连接对象,通过session对象获得Transport,需要捕获或者抛出异常;
    Transport tp = session.getTransport();
    //3.连接服务器,需要抛出异常;
    tp.connect(CommonUtils.getValue("mail.smtpServer"),CommonUtils.getValue("mail.username"),CommonUtils.getValue("mail.password"));
    //4.连接上之后我们需要发送邮件;
    MimeMessage mimeMessage =ItemFormalReviewAction.imageMail(session,request, emailAdd, paramMap);
    //5.发送邮件
    tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    //6.关闭连接
    tp.close();
 }

仅供参考,本人也是小学生一枚,请大神多指教-_-!!!;