当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    JavaWeb实现邮件发送功能

    栏目:win服务器问题汇总 时间:2019-12-21 15:48

    基于JavaWeb的邮件发送功能(多附件),供大家参考,具体内容如下

    本次学习主要目的是为了测试由QQ邮箱发送到任意一个有效邮箱的功能实现,附带多个附件。学习者可以借鉴其他邮箱的格式,梳理一下要写的内容。项目把文件内容放到了MimeMessage 邮件对象里,其中包含了如发件人、收件人、抄送人、邮件主题、邮件内容、邮件时间和邮件附件等一些内容。

    项目中遇到的问题:

    1、在执行到 File file = new File(“D:\Chat_Software\sky.JPG”);时出现错误,之前写的时xlsx文件,测试期间可以对.xls,jpg,文本,.doc文件进行发送。发送xlsx文件时出现报错。
    问题解决方案:
    .xls文件扩展名对应的是Microsoft Office EXCEL 2003及以前的版本。
    .xlsx文件扩展名对应的是Microsoft Office EXCEL 2007及后期的版本。
    有可能时你下载的mai不是1.6以上版本的,建议下载1.6以上版本的mail

    2、在执行到 message.saveChanges(); 方法报错无法进行保存设置,也有可能时你的mail版本较低造成的。

    在书写 File file = new File(); 时注意修改正确的路径,也可以写在form表单里用file进行传值,主题和内容也写在了方法里因人而异如果其他需求可以需改参数进行传值。

    本次用到的主要jar包如下:

    javax.mail-1.6.0.jar activation.jar

    代码如下:

    EmailSendController.java

    package com.yang.controller;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.yang.util.Email_Send_Util;
    
    @Controller
    @RequestMapping("/email")
    public class EmailSendController {
    
     @RequestMapping(value = "/send.do")
     @ResponseBody
     public boolean impotr(HttpServletRequest request) {
     String toMail = request.getParameter("toMail");
     String myMail = request.getParameter("myMail");
     String userPwd = request.getParameter("userPwd");
    
     System.out.println( toMail+myMail+userPwd);
     boolean bool=Email_Send_Util.send( toMail,myMail, userPwd);
     return bool ;
     }
    
    }

    Authentication.java

    package com.yang.util;
    
    import javax.mail.Authenticator;
    import javax.mail.PasswordAuthentication;
    
    public class Authentication extends Authenticator {
     String username = null;
     String password = null;
    
     public Authentication() {
     }
    
     public Authentication(String username, String password) {
      this.username = username;
     this.password = password;
     }
    
     protected PasswordAuthentication getPasswordAuthentication(){
     PasswordAuthentication pa = new PasswordAuthentication(username, password);
     return pa;
     }
    }

    CreateMimeMessage.java

    package com.yang.util;
    
    import java.io.File;
    import java.util.Date;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message.RecipientType;
    import javax.mail.Address;
    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;
    
    /**
     * 创建一封复杂邮件(文本+图片+附件)
     */
    public class CreateMimeMessage {
     public static MimeMessage createMimeMessage(Session session, String myMail, String toMail) throws Exception {
     // 1. 创建邮件对象
     MimeMessage message = new MimeMessage(session);
    
     // 2. From: 发件人
     message.setFrom(new InternetAddress(myMail, "我的测试邮件_发件人昵称", "UTF-8"));
    
     // 3. To: 收件人(可以增加多个收件人、抄送、密送)
     message.addRecipient(RecipientType.TO, new InternetAddress(toMail, "我的测试邮件_收件人昵称", "UTF-8"));
    
     // 4. Subject: 邮件主题
     message.setSubject("TEST邮件主题(文本+图片+附件)", "UTF-8");
    
     // 抄送人
     Address ccAddress = new InternetAddress("*********@qq.com", "我的测试邮件_抄送人昵称", "UTF-8");
     message.addRecipient(Message.RecipientType.CC, ccAddress);
    
     /*
     * 下面是邮件内容的创建:
     */
    
     // 5. 创建图片“节点”
     MimeBodyPart image = new MimeBodyPart();
     File file = new File("D:\\Chat_Software\\sky.JPG");
     DataHandler dh = new DataHandler(new FileDataSource(file)); // 读取本地文件
     image.setDataHandler(dh); // 将图片数据添加到“节点”
     // image.setContentID("image_fairy_tail");// 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
     image.setFileName(MimeUtility.encodeText(file.getName()));
     
     // 6. 创建文本“节点”
     MimeBodyPart text = new MimeBodyPart();
     // text.setContent("这是一张图片<br/>测试图片<br/><img
     // src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");
     text.setContent("这是一张图片<br/>测试图片", "text/html;charset=UTF-8");
    
     // 7. (文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
     MimeMultipart mm_text_image = new MimeMultipart();
     mm_text_image.addBodyPart(text);
     mm_text_image.addBodyPart(image);
     mm_text_image.setSubType("related"); // 关联关系
    
     // 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
     // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
     // 上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
     MimeBodyPart text_image = new MimeBodyPart();
     text_image.setContent(mm_text_image);
    
     // 9. 创建附件“节点”
     MimeBodyPart attachment = new MimeBodyPart();
     File file2 = new File("E:\\boHaiBank\\Test\\test.xlsx");
     DataHandler dh2 = new DataHandler(new FileDataSource(file2)); // 读取本地文件
     attachment.setDataHandler(dh2); // 将附件数据添加到“节点”
     attachment.setFileName(MimeUtility.encodeText(dh2.getName())); // 设置附件的文件名
    
     // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
     MimeMultipart mm = new MimeMultipart();
     mm.addBodyPart(text_image);
     mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加
     mm.setSubType("mixed"); // 混合关系
    
     // 11. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
     message.setContent(mm);
    
     // 12. 设置发件时间
     message.setSentDate(new Date());
    
     // 13. 保存上面的所有设置
     message.saveChanges();
    
     return message;
     }
    
    }