1.创建邮件对象
@Data
public class EmailBean implements Serializable {
/*
* 发件人邮箱
*/
private String mailFrom;
/*
* 发件人昵称
*/
private String mailFromNick;
/*
* 收件人邮箱
*/
private List<String> mailToList;
/*
* 抄送人邮箱
*/
private List<String> ccList;
/*
* 主题
*/
private String subject;
/*
* 内容
*/
private String content;
/*
* 图片路径
*/
private List<String> imagePaths;
/*
* 图片id
*/
private List<String> imageId;
/*
* 附件
*/
private List<File> files;
}
2.创建接口
public interface EmailService {
/**
* 邮件发送 flag:是否开启thymeleaf模板引擎
*/
Boolean sendSimpleMail(EmailBean emailBean, boolean flag);
}
3.创建接口实现类
#如下为集成邮件的相关配置
# 腾讯的,个人smtp.qq.com, 企业的:smtp.exmail.qq.com
spring.mail.host=smtp.exmail.qq.com
spring.mail.username=XX
# 口令是QQ邮箱开通的smtp服务后得到的客户端授权码,不是邮箱登录密码
#spring.mail.password=XX
spring.mail.password=XX
spring.mail.default-encoding=utf-8
# 开启debug,方便查看邮件发送日志
spring.mail.properties.mail.debug=true
spring.mail.sender.nickname=测试
spring.mail.properties.mail.smtp.auth=true
#spring.mail.properties.mail.smtp.auth.class=javax.net.ssl.SSLSocketFactory
#spring.mail.properties.mail.smtp.auth.port=465
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# SSL Config
spring.mail.port=465
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
#配置thymeleaf备用邮件格式
spring.thymeleaf.cache=false
spring.thymeleaf.mode=XX
@Service("emailService")
//@RestController
public class EmailServiceImpl implements EmailService {
private static final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class);
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.sender.nickname}")
private String nickname;
@Autowired
private JavaMailSender javaMailSender;
@Override
public Boolean sendSimpleMail(EmailBean emailBean, boolean flag) {
/*
第二个参数true表示构造一个multipart message类型的邮件,multipart message类型的邮件包含多个正文、附件以及内嵌资源,
邮件的表现形式更丰富
*/
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
//封装发送人邮箱与昵称
mimeMessageHelper.setFrom(new InternetAddress(nickname + " <" + username + ">"));
//封装收件人信息,先判断是否为空
if (!StringUtils.isEmpty(emailBean.getMailToList())) {
//判断收件人是否为多个
List<String> mailToList = emailBean.getMailToList();
String[] toArr = new String[mailToList.size()];
for (int i = 0; i < mailToList.size(); i++) {
toArr[i] = mailToList.get(i);
}
//setTo方法指的是传递收件人信息
mimeMessageHelper.setTo(toArr);
}
//封装抄送人信息
if (!StringUtils.isEmpty(emailBean.getCcList())) {
//判断抄送人是否为多个
List<String> ccListList = emailBean.getCcList();
String[] toCC = new String[ccListList.size()];
for (int i = 0; i < ccListList.size(); i++) {
toCC[i] = ccListList.get(i);
}
//setCc方法指的是传递抄送人信息
mimeMessageHelper.setCc(toCC);
}
//封装附件
if (null != emailBean.getFiles()) {
//判断当前附件是否为空
for (File file : emailBean.getFiles()) {
mimeMessageHelper.addAttachment(file.getName(), file);
}
}
//封装图片
if (null != emailBean.getImagePaths() && emailBean.getImagePaths().size() != 0) {
for (int i = 0; i < emailBean.getImageId().size() - 1; i++) {
// 通过FileSystemResource构造静态资源此处传的为图片路径
FileSystemResource fileSystemResource = new FileSystemResource(new File(emailBean.getImagePaths().get(i)));
// 调用addInline方法将资源加入邮件对象中此处第一个参数为图片id也就是图片名
mimeMessageHelper.addInline(emailBean.getImageId().get(i), fileSystemResource);
}
}
//封装邮件主题
mimeMessageHelper.setSubject(emailBean.getSubject());
//封装邮件内容
// setText方法第二个参数为true表示邮件正文是html格式的,默认是false
mimeMessageHelper.setText(emailBean.getContent(), flag);
javaMailSender.send(mimeMessage);
}catch (MailSendException mail){
logger.error("发送邮件时发生异常!{}", mail.getMessage());
this.detectInvalidAddress(mail);
return false;
}
catch (Exception e) {
logger.error("发送邮件时发生异常!{}", e.getMessage());
return false;
}
return true;
}
/**
* 无效的邮件地址
*/
private void detectInvalidAddress(MailSendException mail){
Exception[] messageExceptions = mail.getMessageExceptions();
if (messageExceptions.length > 0) {
Exception messageException = messageExceptions[0];
if (messageException instanceof SendFailedException) {
SendFailedException sfe = (SendFailedException) messageException;
Address[] invalidAddresses = sfe.getInvalidAddresses();
if (invalidAddresses != null) {
StringBuilder addressStr = new StringBuilder();
for (Address address : invalidAddresses) {
addressStr.append(address.toString()).append("; ");
}
logger.error("发送邮件时发生异常!可能有无效的邮箱:{}", addressStr);
return;
}
}
}
}
public void demo(){
EmailBean emailBean = new EmailBean();
emailBean.setContent("测试");
//封装收件人信息
List<String> mailToList = new ArrayList<>();
// mailToList.add("wxh_15596038206@163.com");
mailToList.add("1289581172@qq.com");
//封装抄送人信息
/*List<String> CcList = new ArrayList<>();
CcList.add("2327545889@qq.com");
String image01Path = "D:\\sendmailTest\\1.png";
String image02Path = "D:\\sendmailTest\\2.png";*/
//封装图片路径
/*List<String> imagePathList = new ArrayList<>();
imagePathList.add(image01Path);
imagePathList.add(image02Path);*/
//封装图片id
/*List<String> imageIdList = new ArrayList<>();
imageIdList.add("1");
imageIdList.add("1");*/
//封装附件信息
/*File imgFile = new File("D:\\sendmailTest\\001.txt");
File txtFile = new File("D:\\sendmailTest\\002.md");
List<File> fileList = new ArrayList<>();
fileList.add(imgFile);
fileList.add(txtFile);*/
//确认是否开启thymeleaf模板引擎默认为false 如不需要下方的thymeleaf参数也不需要配置
boolean flag = false;
//注意:以下内容如果需要使用thymeleaf引擎则传递不使用可不传递参数
//传入thymeleaf模板数据
//注意导入的包是org.thymeleaf.context
/*Context context = new Context();
context.setVariable("username", "北京盛世华人");
context.setVariable("age", "18");
//如果thymeleaf的模板不存在会报错
String content = templateEngine.process("mailTemplate01.html", context);*/
emailBean.setMailToList(mailToList);
//emailBean.setImageId(imageIdList);
//emailBean.setImagePaths(imagePathList);
//emailBean.setFiles(fileList);
//emailBean.setCcList(CcList);
emailBean.setContent("测试邮件");
//主题为必填
emailBean.setSubject("测试主题");
// emailService.sendSimpleMail(emailBean,flag);
}
}