SpringBoot邮件发送(抄送、密送、图片、多文件等一应俱全哦)
人生若只如初见,何事秋风悲画扇。
下班回去听到室友讲到他们项目正在写一个邮件发送,突然手痒写此功能,后来总结形成该文,希望对大家有帮助!
本文非常详细且实用,是不是干货你说了算!
所用:springboot、maven、jpa
目录
先来看看配置文件
对应依赖
邮件发送人
发送记录相关
邮件相关人员设置
全功能汇聚
效果棒棒
先来看看配置文件
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=truespring.datasource.url = jdbc:mysql://localhost:3308/mailsend
spring.datasource.username = root
spring.datasource.password = wl
spring.datasource.driverClassName = com.mysql.jdbc.Driver#其他类型邮箱都可以
spring.mail.host=smtp.qq.com
spring.mail.username=1234567@qq.com
spring.mail.password=yitmkgakdggbbceg(qq邮箱开启服务生成的密文,注意不是qq密码)
spring.mail.default-encoding=UTF-8server.port = 8095
spring.devtools.restart.enabled=true
对应依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wl</groupId><artifactId>MailSendDes</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>MailSendDes</name><description>MailSendDes</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
邮件发送人
所用到的实体类(本文代码均自己设计,实体类你也可以自行设计哦):
package com.wl.eo;import java.io.Serializable;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;/*** @author WangLan* 邮件发送人表:配置发送人的属性表*/
@Entity
public class Sender implements Serializable{@Id@GeneratedValueprivate Long id ;private Long sid ; //发件人员工IDprivate String position ; //发件人职位private String email ; //发件人邮箱public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getSid() {return sid;}public void setSid(Long sid) {this.sid = sid;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
发送记录相关
package com.wl.eo;import java.io.Serializable;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;/*** @author WangLan* 邮件发送记录表:只要发送一个邮件,就在此产生一个记录*/
@Entity
public class Recoder implements Serializable{@Id@GeneratedValueprivate Long id ; //主键,记录IDprivate Long mid ; //每一个邮件对应一个mid,201810110001private String mail ; //邮件内容:包括收件人、主题、内容private String status ; //每发送一个邮件,不论成功还是失败,都要插入一条记录private String persons ; //相关人员列表private String files ; //邮件中的文件对象public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getMid() {return mid;}public void setMid(Long mid) {this.mid = mid;}public String getMail() {return mail;}public void setMail(String mail) {this.mail = mail;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getPersons() {return persons;}public void setPersons(String persons) {this.persons = persons;}public String getFiles() {return files;}public void setFiles(String files) {this.files = files;}
}
邮件相关人员设置
package com.wl.eo;import java.io.Serializable;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;/*** @author WangLan* 邮件相关人员表:配置所有相关人员的的属性表,一个人一个记录*/
@Entity
public class Personnel implements Serializable{@Id@GeneratedValueprivate Long id ; //序列IDprivate Long mid ; //邮件记录idprivate String email ; //邮箱地址private Integer type ; //所在的本次邮件是作为发送人0,收件人1,抄送人2,密送人3public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getMid() {return mid;}public void setMid(Long mid) {this.mid = mid;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getType() {return type;}public void setType(Integer type) {this.type = type;}
}
全功能汇聚
service层(重点在这)
package com.wl.service;import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.wl.eo.Personnel;
import com.wl.eo.Recoder;
import com.wl.eo.Sender;
import com.wl.repostory.PersonnelRepostory;
import com.wl.repostory.RecordRepostory;
import com.wl.repostory.SenderRepostory;
import com.wl.util.MyUtils;@Service
public class MailSendService {@Value("${spring.mail.host}")private String host ;@Value("${spring.mail.username}")private String from ;@Autowiredprivate JavaMailSender mailSender ;@Autowiredprivate PersonnelRepostory personnelRepostory ;@Autowiredprivate SenderRepostory senderRepostory ;@Autowiredprivate RecordRepostory recordRepostory ;private static final Logger logger = LoggerFactory.getLogger(MailSendService.class);public static String getCurrentDate() {long currentTime = System.currentTimeMillis();Date date = new Date(currentTime);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDateFormat.format(date);}
// public static void setNewHost(String newHost) {
// MailSendService.host = newHost;
// }
// public static void setSender(String newSender) {
// MailSendService.from = newSender;
// }
/**多文件发送、抄送、密送
*/@Transactionalpublic String sendV1Mail(Sender senderFrom,Long mid,Map<Integer,List<String>> peoMap,String subject,String content,List<String> filePathList) {String responseStr = "" ;MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = null ;//传输对象Recoder recoder = new Recoder() ;Sender sender = new Sender() ;Personnel sendPersonnel = new Personnel() ; //发送人//存放相关人员的集合Map<Integer,List<String>> personnelMap = new HashMap<Integer,List<String>>();//存放mail的集合Map<String,Object> mailMap = new HashMap<String,Object>();try {helper = new MimeMessageHelper(message,true);} catch (MessagingException e1) {e1.printStackTrace();}try {//解析文件for (String filePath : filePathList) {FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = file.getFilename();helper.addAttachment(fileName, file);}recoder.setFiles(MyUtils.convertObjectToJSONStr(filePathList));//解析收件人1、抄送2、密送3Integer num = 0 ; Iterator<Map.Entry<Integer,List<String>>> entries = peoMap.entrySet().iterator(); while(entries.hasNext()) {Map.Entry<Integer,List<String>> entry = entries.next() ;num = entry.getKey() ;if(num==1) {for (String ss : entry.getValue()) {if(ss!=null) {Personnel personnel1 = new Personnel() ;personnel1.setMid(mid);personnel1.setEmail(ss);personnel1.setType(1);personnelRepostory.save(personnel1);helper.addTo(ss);logger.info("已获取收件人:"+ss);}}mailMap.put("收件人", entry.getValue());personnelMap.put(1, entry.getValue());}if(num==2) {for (String cc : entry.getValue()) {if(cc!=null) {Personnel personnel2 = new Personnel() ;personnel2.setMid(mid);personnel2.setEmail(cc);personnel2.setType(2);personnelRepostory.save(personnel2);helper.addCc(cc);
// helper.setCc(cc);logger.info("已获取抄送人:"+cc);}}mailMap.put("抄送人", entry.getValue());personnelMap.put(2, entry.getValue());}if(num==3) {for (String bcc : entry.getValue()) {if(bcc!=null) {Personnel personnel3 = new Personnel() ;personnel3.setMid(mid);personnel3.setEmail(bcc);personnel3.setType(3);personnelRepostory.save(personnel3);helper.addBcc(bcc);logger.info("已获取密送人:"+bcc);}}mailMap.put("密送人", entry.getValue());personnelMap.put(3, entry.getValue());}}mailMap.put("主题", subject);mailMap.put("内容", content);recoder.setPersons(MyUtils.convertObjectToJSONStr(personnelMap));recoder.setStatus("Y");recoder.setMid(mid);recoder.setMail(MyUtils.convertObjectToJSONStr(mailMap));recordRepostory.save(recoder);Sender newsender = senderRepostory.findByEmail(senderFrom.getEmail());if(newsender==null) {senderRepostory.save(senderFrom);}sendPersonnel.setEmail(senderFrom.getEmail());sendPersonnel.setMid(mid);sendPersonnel.setType(0);personnelRepostory.save(sendPersonnel);helper.setFrom(from);helper.setText(content,true);helper.setSubject(subject);responseStr = "发送成功!";//开始入库操作:邮件记录入库、人员入库、判断发件人如果不存在则也入库} catch (MessagingException e) {logger.error("发送失败!"+e+";失败时间:"+getCurrentDate());e.printStackTrace();}mailSender.send(message);logger.info("发送成功!人物:{}\n主题:{}\n内容:{}\n文件列表:{}\n",peoMap,subject,content,filePathList);return responseStr ;}/**其他简单格式
*//*** 发送多个图片* @throws MessagingException */@SuppressWarnings("unused")public String sendInlineResource(String to, String subject, String content, Map<String, String> map) {String resultStr = "";if(map.size()>3) {try {resultStr = "最多只能发送三张图片,更多请以附件形式发送!";} catch (Exception e) {e.printStackTrace();}}if(map==null) {resultStr = "待发送内容为空!";}try {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);Map<String, String> picmap = new HashMap<String, String>();Set<Map.Entry<String, String>> entry = picmap.entrySet();for (Map.Entry<String, String> stringEntry : entry) {FileSystemResource resource = new FileSystemResource(new File(stringEntry.getValue()));logger.info("读取中-->图片标识:"+stringEntry.getKey()+",图片路径:"+stringEntry.getValue());try {helper.addInline(stringEntry.getKey(), resource);} catch (MessagingException e) {logger.error("加入图片失败!失败时间:"+getCurrentDate());e.printStackTrace();}}
// picmap.forEach((rscId,rscPath)->{
// FileSystemResource resource = new FileSystemResource(new File(rscPath));
// logger.info("读取中-->图片标识:"+rscId+",图片路径:"+picmap.get(rscId));
// try {
// helper.addInline(rscId, resource);
// } catch (MessagingException e) {
// logger.info("加入图片失败!失败时间:"+getCurrentDate());
// e.printStackTrace();
// }
// });helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true); logger.info("正在发送...");mailSender.send(message);resultStr = "发送成功!";logger.info("本次图片邮件("+map.size()+"个)发送成功!");} catch (MessagingException e) {logger.error("发送失败!失败时间:"+getCurrentDate());e.printStackTrace();}
// int count = 3;
// if(entry.length<4) {
// Entry []pic = new Entry[count] ;
// }else {
// Entry []pic = new Entry[5] ;
// }
// List<Entry> list = new ArrayList<Entry>();return resultStr ;}/*** 发送单个图片* @return */public String sendInlineResource(String to,String subject,String content,String rscPath,String rscId) {String resultStr = "";MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper;try {helper = new MimeMessageHelper(message,true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content,true); //第二个参数,是否带HTML格式FileSystemResource resource = new FileSystemResource(new File(rscPath));helper.addInline(rscId, resource);mailSender.send(message);resultStr = "发送成功!";logger.info("本次图片邮件发送成功!");} catch (MessagingException e) {logger.info("发送失败!失败时间:"+getCurrentDate());e.printStackTrace();} return resultStr ;}/*** 发送多个带文件的邮件*/public String sendAttachmentMail(String to,String subject,String Content,List<String> filePathList) {String resultStr = "";//多个List<String> list = new ArrayList<String>();MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = null ;try {helper = new MimeMessageHelper(message,true);} catch (MessagingException e1) {e1.printStackTrace();}try {for (String filePath : filePathList) {FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = file.getFilename();helper.addAttachment(fileName, file);}helper.setTo(to);helper.setFrom(from);helper.setText(Content,true);helper.setSubject(subject);resultStr = "发送成功!";logger.info("本次附件邮件("+filePathList.size()+"个)发送成功!");} catch (MessagingException e) {logger.info("发送失败!失败时间:"+getCurrentDate());e.printStackTrace();}mailSender.send(message);return resultStr ;}/**&* 发送带附件的邮件*/public String sendAttachmentMail(String to,String subject,String Content,String filePath) {String resultStr = "";MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = null ;try {helper = new MimeMessageHelper(message,true);helper.setTo(to);helper.setFrom(from);helper.setText(Content,true);helper.setSubject(subject);FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = file.getFilename();helper.addAttachment(fileName, file);mailSender.send(message);resultStr = "发送成功!";logger.info("本次附件邮件发送成功!");} catch (MessagingException e) {logger.info("发送失败!失败时间:"+getCurrentDate());e.printStackTrace();}return resultStr ;}/*** 发送HTML*/public String sendHTMLMail(String to,String subject,String content) {String resultStr = "";logger.info("发送邮件开始...\n 收件人:{}\n邮件主题:{}\n内容:{}\n", to,subject,content);MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = null ;try {helper = new MimeMessageHelper(message,true);helper.setTo(to);helper.setFrom(from);helper.setText(content,true);helper.setSubject(subject);mailSender.send(message);resultStr = "发送成功!";logger.info("本次HTML邮件发送成功!");} catch (MessagingException e) {logger.error("发送失败!"+e+";失败时间:"+getCurrentDate());e.printStackTrace();}return resultStr ;}/*** 发送文本* @param to* @param subject* @param Content*/public void sendSimpleMail(String to,String subject,String Content) {SimpleMailMessage sml = new SimpleMailMessage();sml.setFrom(from);sml.setSubject(subject);sml.setText(Content);sml.setTo(to);mailSender.send(sml);}
}
效果棒棒
进邮箱查看
其实不必须存入数据库,但为了综合多个技术点也加入了,持久层很简单几个方法就不贴了,到此邮件发送功能已经实现~~
写该博文时距写该功能那时候已经过去十个月,时光荏苒,希望java常在你我身边!
SpringBoot邮件发送(抄送、密送、图片、多文件等一应俱全哦)相关推荐
- spring-boot邮件发送功能演示(163邮箱与QQ邮箱互发)
背景:使用 Spring Boot 发送邮件,演示的邮箱为 163邮箱与QQ邮箱,两者可以实现互发邮件. 问题:自己可以实现一下 QQ邮箱 发 QQ邮箱,163发163,是什么样的. 演示 :163 ...
- domino获取邮件中的密送的收件人-字段:Recipients
比如QQ-formail提供邮件密送服务.密送收件人不会出现邮件数据中sendto.copyto字段中.密送的中的收件人存储在 Recipients字段中. 如果你的服务器发现空邮件,可以 检查Rec ...
- 邮件群发之一封邮件发给多个收件人?抄送密送设置
有的发件箱限制登陆次数只能用几次,那么一次发送多个邮箱地址可以大大提高发送量和速度,伯勒邮件群发机,支持一次一封邮件发送多送多个邮箱地址.首先搞明白这几点: 单次发送(To): 收件人 抄送邮件(CC ...
- springboot邮件发送 端口587/465不同配置
Spring Boot教程(26) – 如何发送邮件 - 知乎 大体上来说,发送的方式有两种,一种是使用SMTP协议,连上SMTP服务器发送邮件,一种是使用第三方的邮件发送服务,调调API就行.我们先 ...
- springboot邮件发送以及thyemleaf生成邮件模板
一.基础知识 邮件常见的三大协议:SMTP.POP3.IMAP SMTP 是一个基于 TCP/IP 的应用层协议,江湖地位有点类似于 HTTP,SMTP 服务器默认监听的端口号为 25 .由于SMTP ...
- SpringBoot邮件发送-maven项目(禁止水贴001)
1.maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www. ...
- SpringBoot ~ 邮件发送
添加pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s ...
- Python 技术篇-用smtplib和email库实现邮件发送并展示本地图片实例演示
qq账号发送邮箱登陆密码需要用授权码. 可以看我的这个文章: Python 技术篇-qq邮箱授权码开通 实现原理 将本地图片加入到邮件的附件中. m_img.add_header('Content-I ...
- SpringBoot邮件发送(QQ邮箱)
1,导入mail依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId&g ...
最新文章
- Origin对于标注点
- 日常工作问题解决:rhel7下配置多路径设备
- MySQL从主从到代理
- java cmd copy_使用Java中的cmd复制文件的问题
- 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )
- getheaderfields java_java – HttpsURLConnection getHeaderFields没有返回set-cookie
- Redis的使用原理
- oracle 11g r2 的jdk 版本,java 连接 oracle 11gr2 出错 泪求大神
- Hercules配置文件HERCULES.CNF范本
- php和html怎么链接,PHP(6)只记录我的学习历程 html(链接和框架标志)
- FeedingBottle3.2的下载网站
- 锐浪报表,用脚本处理字段
- dell台式计算机恢复出厂设置,戴尔Win10电脑怎么恢复出厂设置?
- 回答朋友关于美团点评业务线工作体验
- tcpdump 文件权限相关问题
- XV6源代码阅读-虚拟内存管理
- 如何在linux下解压缩rar和zip格式的文件压缩包
- hiveserver2 和beeline_Beeline连接Hiveserver2错误
- 加权黑猩猩优化算法(WChOA)附Matlab代码
- Flutter - flutter_bloc状态管理
热门文章
- 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结
- 如何优雅的将Mybatis日志中的Preparing与Parameters转换为可执行SQL
- XDOJ 235-月份判断
- leetcode系列-链表
- win10怎样获得计算机管理员权限,详细教你获取win10管理员权限
- 绝地求生发生错误服务器维护,绝地求生更新时发生错误无法连接服务器解决办法最新版...
- JavaFX开发的地图编辑器WiTKMapEditor(更新GitHub地址)
- mybatis和mybatis-plus集成springboot的配置区别
- ftp服务器连接数修改,ftp服务器连接数设置
- 【UE】Unreal Engine虚幻引擎自己的入门记录