写这个是因为项目的需求,网上的教程实在是难的看不懂,简单的又不合适,搞了好久终于搞出来一套可以的,分享给大家,也防止我以后忘记。
语言: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;
}
}
原本以为很难的带附件发送邮件就这样完成啦★,°:.☆( ̄▽ ̄)/$:.°★ 。 感谢您的耐心地看到最后。