Springboot整合邮件服务
springboot版本 - 2.4.0
引入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
</dependency>
配置邮件相关参数
spring:
mail:
host: smtp.qq.com
username: xxxx@qq.com # 邮箱账号
password: nbproigvuoyybbdd # 邮箱账号授权码: 设置-账户-生成授权码
password不是邮箱真正的登陆密码,而是该邮箱的授权码。
代码
package com.example.demo.dto;
import java.io.File;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Mail {
private String to;
private String text;
private String subject;
private boolean attached;
private Map<String, File> attachments;
}
package com.example.demo.service;
import com.example.demo.dto.Mail;
import com.example.demo.exception.MyException;
public interface MailService {
void sendMail(Mail mail) throws MyException;
}
package com.example.demo.service.impl;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
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.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 com.example.demo.constant.MyExceptionMessage;
import com.example.demo.dto.Mail;
import com.example.demo.exception.MyException;
import com.example.demo.service.MailService;
@Service
public class MailServiceImpl implements MailService {
@Autowired
private JavaMailSender javaMailSender;
private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
@Override
@Async // 标记这是一个异步任务。
/**
* controller调用service后立即返回,不会等service的代码执行结束后才返回,
* @Async 注解可用来标记一个耗时操作为异步任务
*/
public void sendMail(Mail mail) throws MyException{
if (mail.isAttached()) {
sendMimeMailMessage(mail);
} else {
sendSimpleMailMessage(mail);
}
}
private void sendSimpleMailMessage(Mail mail) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom("from@qq.com"); // 发送者的邮箱
simpleMailMessage.setTo(mail.getTo());
simpleMailMessage.setSubject(mail.getSubject());
simpleMailMessage.setText(mail.getText());
javaMailSender.send(simpleMailMessage);
logger.info("send simple mail message successfully.");
}
private void sendMimeMailMessage(Mail mail) throws MyException {
// 手动添加附件内容
Map<String, File> attachments = new HashMap<>();
attachments.put("a.txt", new File("D:\\test\\a.txt"));
attachments.put("b.txt", new File("D:\\test\\b.txt"));
mail.setAttachments(attachments);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(customConfig.getFrom());
mimeMessageHelper.setTo(mail.getTo());
mimeMessageHelper.setSubject(mail.getSubject());
mimeMessageHelper.setText(mail.getText());
Set<Entry<String, File>> entrySet = mail.getAttachments().entrySet();
for (Entry<String, File> each : entrySet) {
mimeMessageHelper.addAttachment(each.getKey(), each.getValue());
}
javaMailSender.send(mimeMessage);
logger.info("send mime mail message successfully.");
} catch (MessagingException e) {
e.printStackTrace();
logger.info(e.getMessage());
throw new MyException(MyExceptionMessage.MailException);
}
}
}
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.constant.ResponseMessage;
import com.example.demo.dto.Mail;
import com.example.demo.dto.ResponseObject;
import com.example.demo.exception.MyException;
import com.example.demo.service.MailService;
@RestController
@RequestMapping("/mail")
public class MailController {
@Autowired
private MailService mailService;
@PostMapping
public ResponseEntity<ResponseObject> sendMail(@RequestBody Mail mail) {
try {
mailService.sendMail(mail);
return ResponseEntity.ok(new ResponseObject(ResponseMessage.SUCCESS));
} catch (MyException e) {
return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
}
}
}
package com.example.demo.constant;
public enum ResponseMessage {
SUCCESS("SUCCESS"), FAILED("FAILED"), EMPTY("No Record found");
private String message;
ResponseMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
@Override
public String toString() {
return message;
}
}
package com.example.demo.dto;
import com.example.demo.constant.ResponseMessage;
import lombok.Data;
@Data
public class ResponseObject {
private Object data;
private String message;
public ResponseObject(Object data, ResponseMessage responseMessage) {
this.data = data;
this.message = responseMessage.getMessage();
}
public ResponseObject(ResponseMessage responseMessage) {
this.message = responseMessage.getMessage();
}
}
运行项目,使用postman访问http://localhost:9090/dev/mail
访问API后会立即返回,而不会等到邮件发送后才返回。
邮件发送成功