Springboot邮箱发送
一、导入所需依赖
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
二、创建工具类
(发送qq邮箱为例)
package com.zqs.springboot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
* @ClassName
* @Description TODO
* @Author ZQS
* @Date 2020/8/31 0031 19:36
* @Version 1.0
**/
@RestController
@RequestMapping("test")
public class MailController {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
@GetMapping("mail")
public String mail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo("742558797@qq.com");
mimeMessageHelper.setSubject("期末考试成绩");
StringBuffer sb = new StringBuffer();
sb.append("<html><h1>大标题-h1</h1>")
.append("<p style='color:#F00'>红色字</p>")
.append("<p style='text-align:right'>右对齐</p></html>");
mimeMessageHelper.setText(sb.toString());
//mimeMessage.addHeader();
javaMailSender.send(mimeMessage);
return "发送成功";
}
}
三、申请网易邮箱设置开启服务
四、创建邮箱服务器
用来得到一个像秘钥的一串字符串
UOYKNXZLJLWMQWZL
spring.profiles.active=prod
#javaMail配置(下面的 spring.mail.host 为发送邮箱的邮箱服务器)
spring.mail.host=smtp.163.com
spring.mail.username=zqs19981855235@163.com
spring.mail.password=UOYKNXZLJLWMQWZL
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
五、验证
六、对垃圾邮箱的处理
(主要是防止系统误判我们的邮件是垃圾邮件)
message.addHeader("X-Mailer","Microsoft Outlook Express 6.00.2900.2869");
七、多线程邮箱工具类
package com.springboot_001.mail;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
/**
* @ClassName
* @Description 多线程发邮箱工具类
* @Author ZQS
* @Date 2020/8/31 0031 22:41
* @Version 1.0
**/
@Service
@Slf4j
public class MailServiceImpl implements MailService {
//默认编码
public static final String DEFAULT_ENCODING = "UTF-8";
//本身邮件的发送者,来自邮件配置
@Value("${spring.mail.username}")
private String userName;
@Value("${spring.mail.nickname}")
private String nickname;
//模板引擎解析对象,用于解析模板
@Autowired(required = false)
private JavaMailSender mailSender;
@Override
@Async("getAsyncExecutor")
public void sendSimpleTextMailActual(String subject,String content,String[] toWho,String[] ccPeoples,String[] bccPeoples,String[] attachments){
//检验参数:邮件主题、收件人、邮件内容必须不为空才能够保证基本的逻辑执行
if(subject == null||toWho == null||toWho.length == 0||content == null){
log.error("邮件-> {} 无法继续执行,因为缺少基本的参数:邮件主题、收件人、邮件内容",subject);
throw new RuntimeException("模板邮件无法继续发送,因为缺少必要的参数!");
}
log.info("开始发送简单文本邮件:主题->{},收件人->{},抄送人->{},密送人->{},附件->{}",subject,toWho,ccPeoples,bccPeoples,attachments);
//附件处理,需要处理附件时,需要使用二进制信息,使用 MimeMessage 类来进行处理
if(attachments != null&&attachments.length > 0){
try{
//附件处理需要进行二进制传输
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,DEFAULT_ENCODING);
//设置邮件的基本信息:这些函数都会在后面列出来
boolean continueProcess = handleBasicInfo(helper,subject,content,toWho,ccPeoples,bccPeoples,false);
//如果处理基本信息出现错误
if(!continueProcess){
log.error("邮件基本信息出错: 主题->{}",subject);
return;
}
//处理附件
handleAttachment(helper,subject,attachments);
//发送该邮件
mailSender.send(mimeMessage);
log.info("发送邮件成功: 主题->{}",subject);
} catch (MessagingException e) {
e.printStackTrace();
log.error("发送邮件失败: 主题->{}",subject);
}
}else{
//创建一个简单邮件信息对象
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//设置邮件的基本信息
handleBasicInfo(simpleMailMessage,subject,content,toWho,ccPeoples,bccPeoples);
//发送邮件
mailSender.send(simpleMailMessage);
log.info("发送邮件成功: 主题->{}",subject,toWho,ccPeoples,bccPeoples,attachments);
}
}
@Async("getAsyncExecutor")
@Override
public void sendHtmlMail(String subject, String content, String[] toWho) {
//检验参数:邮件主题、收件人、邮件内容必须不为空才能够保证基本的逻辑执行
if(subject == null||toWho == null||toWho.length == 0||content == null){
log.error("邮件-> {} 无法继续执行,因为缺少基本的参数:邮件主题、收件人、邮件内容",subject);
throw new RuntimeException("模板邮件无法继续发送,因为缺少必要的参数!");
}
log.info("开始发送Html邮件:主题->{},收件人->{}",subject,toWho);
//html
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,DEFAULT_ENCODING);
//设置邮件的基本信息
handleBasicInfo(helper,subject,content,toWho);
//发送邮件
mailSender.send(mimeMessage);
log.info("html邮件发送成功");
} catch (MessagingException e) {
log.error("发送邮件出错->{}",subject);
}
log.info("发送邮件成功: 主题->{}",subject,toWho);
}
@Override
public boolean handleBasicInfo(MimeMessageHelper mimeMessageHelper,String subject,String content,String[] toWho,String[] ccPeoples,String[] bccPeoples,boolean isHtml){
try{
//设置必要的邮件元素
//设置发件人
mimeMessageHelper.setFrom(nickname+'<'+userName+'>');
//设置邮件的主题
mimeMessageHelper.setSubject(subject);
//设置邮件的内容,区别是否是HTML邮件
mimeMessageHelper.setText(content,isHtml);
//设置邮件的收件人
mimeMessageHelper.setTo(toWho);
//设置非必要的邮件元素,在使用helper进行封装时,这些数据都不能够为空
if(ccPeoples != null)
//设置邮件的抄送人:MimeMessageHelper # Assert.notNull(cc, "Cc address array must not be null");
mimeMessageHelper.setCc(ccPeoples);
if(bccPeoples != null)
//设置邮件的密送人:MimeMessageHelper # Assert.notNull(bcc, "Bcc address array must not be null");
mimeMessageHelper.setBcc(bccPeoples);
return true;
}catch(MessagingException e){
e.printStackTrace();
log.error("邮件基本信息出错->{}",subject);
}
return false;
}
@Override
public void handleBasicInfo(SimpleMailMessage simpleMailMessage,String subject,String content,String[] toWho,String[] ccPeoples,String[] bccPeoples){
//设置发件人
simpleMailMessage.setFrom(nickname+'<'+userName+'>');
//设置邮件的主题
simpleMailMessage.setSubject(subject);
//设置邮件的内容
simpleMailMessage.setText(content);
//设置邮件的收件人
simpleMailMessage.setTo(toWho);
//设置邮件的抄送人
simpleMailMessage.setCc(ccPeoples);
//设置邮件的密送人
simpleMailMessage.setBcc(bccPeoples);
}
@Override
public void handleBasicInfo(MimeMessageHelper mimeMessageHelper,String subject,String content,String[] toWho){
try {
//设置发件人
mimeMessageHelper.setFrom(nickname+'<'+userName+'>');
//设置邮件的主题
mimeMessageHelper.setSubject(subject);
//设置邮件的内容
mimeMessageHelper.setText(content,true);
//设置邮件的收件人
mimeMessageHelper.setTo(toWho);
} catch (MessagingException e) {
log.error("html邮件基本信息出错->{}",subject);
}
}
@Override
public void handleAttachment(MimeMessageHelper mimeMessageHelper,String subject,String[] attachmentFilePaths){
//判断是否需要处理邮件的附件
if(attachmentFilePaths != null&&attachmentFilePaths.length > 0) {
FileSystemResource resource;
String fileName;
//循环处理邮件的附件
for (String attachmentFilePath : attachmentFilePaths) {
//获取该路径所对应的文件资源对象
resource = new FileSystemResource(new File(attachmentFilePath));
//判断该资源是否存在,当不存在时仅仅会打印一条警告日志,不会中断处理程序。
// 也就是说在附件出现异常的情况下,邮件是可以正常发送的,所以请确定你发送的邮件附件在本机存在
if (!resource.exists()) {
log.warn("邮件->{} 的附件->{} 不存在!", subject, attachmentFilePath);
//开启下一个资源的处理
continue;
}
//获取资源的名称
fileName = resource.getFilename();
try {
//添加附件
mimeMessageHelper.addAttachment(fileName, resource);
} catch (MessagingException e) {
e.printStackTrace();
log.error("邮件->{} 添加附件->{} 出现异常->{}", subject, attachmentFilePath, e.getMessage());
}
}
}
}
}
线程池配置
测试类
@RestController
@RequestMapping("mail")
public class MailController {
@Autowired
private MailService mailService;
@GetMapping("mailText")
public String mailText(){
String[] add = ArrayUtils.add(new String[0], "742558797@qq.com");
mailService.sendSimpleTextMailActual("关于春节放假须知","最终定于2020年春节放假时间,请各部门做好放假相关事宜"
,add ,ArrayUtils.add(new String[0],"5201314@qq.com"),
null,ArrayUtils.add(new String[0],"F://timg.jpg"));
return "mail text success";
}
}