JAVA利用MimeMessage实现发送正文加多个附件Excel的邮件

1,632 阅读3分钟

写这个是因为项目的需求,网上的教程实在是难的看不懂,简单的又不合适,搞了好久终于搞出来一套可以的,分享给大家,也防止我以后忘记。

语言:Java 软件:idea 项目:springBoot maven 使用发件的邮箱:QQ邮箱

1,首先我们需要在pom.xml添加

 <!-- 邮件 -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.6</version>
        </dependency>

2,先看前端给我们的数据

email是收件人邮箱(这里我保密一下),logs是json数组格式的,所以可能有多个附件需要发送

3,看controller层

  @Autowired
    private SendEmailAndExcle sendEmailAndExcle;

    //发送邮件
    @PostMapping("/api/v1/cook/pushLog")
    public ResultData sendEmails(String email,String logs){
        String tit = "【GrillAid】Cooking temperature history";
        String te = "Dear user \n <br>" +
                "\n" +
                "Thanks for your support! <br> "+
                "\n" + " For your information, attached is your cooking temperature history data. <br> "
                +"\n"
                +"-GrillAid Team-!";
        sendEmailAndExcle.send(email,logs,tit,te);
        return ResultData.success();
    }

4,看我们的邮件发送class

package com.ruoyi.app.controller.sendEmail;
import com.ruoyi.app.common.request.ToCookLogTwo;
import net.sf.json.JSONArray;
import org.springframework.stereotype.Service;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

@Service
public class SendEmailAndExcle {
    public static boolean sendEmail(String to, List<ByteArrayOutputStream> baosss,String tit,String te) {
        // 发件人电子邮箱
        String from = "发件人电子邮箱";
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器 ->QQ 邮件服务器
        properties.setProperty("mail.smtp.host", "smtp.qq.com");
        properties.put("mail.smtp.auth", "true");
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties,new Authenticator(){
            public PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication("发件人电子邮箱", "16位授权码"); //发件人邮件用户名、授权码
            }
        });

        try{
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
            // Set From: 头部头字段
            message.setFrom(new InternetAddress(from));
            // Set To: 头部头字段
            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
            // Set Subject: 头部头字段
            message.setSubject("This is the Subject Line!");
            //邮件标题
            message.setSubject(tit);
            //邮件内容

            //【因为要发送正文和邮件所以
            // 1,设置邮件内容,混合模式
            MimeMultipart msgMultipart = new MimeMultipart("mixed");
            message.setContent(msgMultipart);

            // 2,设置消息正文
            MimeBodyPart content = new MimeBodyPart();
            msgMultipart.addBodyPart(content);

            // 3,设置正文格式
            MimeMultipart bodyMultipart = new MimeMultipart("related");
            content.setContent(bodyMultipart);

            // 4,设置正文内容
            MimeBodyPart htmlPart = new MimeBodyPart();
            bodyMultipart.addBodyPart(htmlPart);
            htmlPart.setContent(te, "text/html;charset=UTF-8");

            //添加这些】

             /*如果只发附件不要正文的话用这个*/
            //  Multipart multipart = new MimeMultipart();

            for(int i=0;i<baosss.size();i++){
                MimeBodyPart fileBody = new MimeBodyPart();
                DataSource source = new ByteArrayDataSource(baosss.get(i).toByteArray(), "application/msexcel");
                fileBody.setDataHandler(new DataHandler(source));

                // 中文乱码问题
                fileBody.setFileName(MimeUtility.encodeText("ww.xlsx"));
                msgMultipart.addBodyPart(fileBody);
                // 只发送附件的话
                // multipart.addBodyPart(fileBody);
            }

            // 发送消息
            Transport.send(message,message.getAllRecipients());

            // 只发送附件的话
            // Transport.send(message);

            System.out.println("Sent message successfully....");
        }catch (MessagingException mex) {
            mex.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }


    //发送方法
    public static void send(String email, String logs, String tit, String te) {

        JSONArray jsonArr = JSONArray.fromObject(logs);//将前端传来的数据转换成JSONArray格式
        List<ToCookLogTwo> toCookLogs = JSONArray.toList(jsonArr, ToCookLogTwo.class);//获得数组

        String sd1 = "";//开始时间
        String sd2 = "";//结束时间

        //新建list表格
        List<ByteArrayOutputStream> baosss = new ArrayList<>();

        //循环传来的数组,这样有几条数据生成几个表格
        for (ToCookLogTwo toCookLog:toCookLogs) {
            //时间戳转时间
            SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
            //yyyy-MM-dd
            if(toCookLog.getStart_time()!=null){
                sd1 = sdf.format(new Date(Long.parseLong(String.valueOf(toCookLog.getStart_time()))));
            }
            //时间戳转时间
            if(toCookLog.getEnd_time()!=null){
                sd2 = sdf.format(new Date(Long.parseLong(String.valueOf(toCookLog.getEnd_time()))));
            }
            //表格第一行是
            String[] title = {"start time","end time","type","practice","medium","temp","remark"};
            //表格第二行是
            String[] text = {sd1,sd2,toCookLog.getType(),toCookLog.getPractice(),toCookLog.getMedium(), String.valueOf(toCookLog.getTemp()),toCookLog.getRemark()};

            //生成表格
            ByteArrayOutputStream  baos = CreatExcel.creatExcel(title,text);
            //加到表格list里面
            baosss.add(baos);
        }
        //发送邮件 收件人邮箱,附件,邮件标题,邮件内容
        SendEmailAndExcle.sendEmail(email,baosss,tit,te);
    }

}

5,必不可少的生成表格class

package com.ruoyi.app.controller.sendEmail;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class CreatExcel {
    public static ByteArrayOutputStream creatExcel(String[] title, String[] text) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //创建一个表格
        Workbook workbook = new XSSFWorkbook();
        // 创建一个工作薄对象
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1");
        //设置首行
        XSSFRow row0 = sheet.createRow(0);
        for(int i=0;i<title.length;i++) {
            XSSFCell cell = (XSSFCell) row0.createCell(i);
            cell.setCellValue(title[i]);
        }
        //设置第二行
        XSSFRow row1 = sheet.createRow(1);
        for(int i=0;i<text.length;i++) {
            XSSFCell cell = (XSSFCell) row1.createCell(i);
            cell.setCellValue(text[i]);
        }
        try {
            workbook.write(baos); // write excel data to a byte array
            baos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("创建成功 office excel");
        return baos;
    }
}

原本以为很难的带附件发送邮件就这样完成啦★,°:.☆( ̄▽ ̄)/$:.°★ 。 感谢您的耐心地看到最后。