首先 ,了解一下 电子邮件协议
电子邮件协议
电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
然后 开始 sprigboot 整合 邮件 发送模块
pom.xml中 引入相关 组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在yml 文件中配置
spring:
mail:
default-encoding: UTF-8
host: smtp.126.com //建议 使用 126 或163 邮箱
username: xxxxxx@126.com //为发送人的邮箱
password: UHEYWOQGEBOICJEX //此为授权码 具体的工具自己的邮箱去申请
protocol: smtp
test-connection: false
//申请 授权码 步骤:
以126邮箱为列:
一。
二丶

三丶
四丶
数据库表 结构:

此表我将它命名为t_mail 记录邮件的信息 发送人,发送标题 ,还有 邮件正文

此表我将她 命名为t_mail_to 此表记录 邮件 是否发送完成
然后建立相关 实体类 用来接收参数 以及一些其他操作
一丶MailTo 来操作参数以及一些操作:
package com.boot.security.server.model;
public class MailTo extends BaseEntity<Long> {
private static final long serialVersionUID = -8238779033956731073L;
private Long mailId;
private String toUser;
private Boolean status;
public Long getMailId() {
return mailId;
}
public void setMailId(Long mailId) {
this.mailId = mailId;
}
public String getToUser() {
return toUser;
}
public void setToUser(String toUser) {
this.toUser = toUser;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
}
package com.boot.security.server.model;
public class Mail extends BaseEntity<Long> {
private static final long serialVersionUID = 5613231124043303948L;
private Long userId;
private String toUsers;
private String subject;
private String content;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getToUsers() {
return toUsers;
}
public void setToUsers(String toUsers) {
this.toUsers = toUsers;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
实现自动配置 时间 id
import java.io.Serializable;
import java.util.Date;
public abstract class BaseEntity<ID extends Serializable> implements Serializable {
private static final long serialVersionUID = 2054813493011812469L;
private ID id;
private Date createTime = new Date();
private Date updateTime = new Date();
public ID getId() {
return id;
}
public void setId(ID id) {
this.id = id;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
然后建立 相关的 controller 来进行 邮件的相关操作
@Api(tags = "邮件")
@RestController
@RequestMapping("/mails")
public class MailController {
@Autowired
private MailDao mailDao;
@Autowired
private MailService mailService;
@PostMapping
@ApiOperation(value = "保存邮件")
public Mail save(@RequestBody Mail mail) {
String toUsers = mail.getToUsers().trim();
if (StringUtils.isBlank(toUsers)) {
throw new IllegalArgumentException("收件人不能为空");
}
//这里的 邮件收件人 是可以输多个的 用,隔开的 所以要进行分割
toUsers = toUsers.replace(" ", "");
toUsers = toUsers.replace(";", ";");
String[] strings = toUsers.split(";");
//这个来转换 收件人
List<String> toUser = Arrays.asList(strings);
toUser = toUser.stream().filter(u ->
!StringUtils.isBlank(u)).map(u -> u.trim()).collect(Collectors.toList());
mailService.save(mail, toUser);
return mail;
}
//获取邮件发送的详情
@GetMapping("/{id}/to")
@ApiOperation(value = "根据id获取邮件发送详情")
public List<MailTo> getMailTo(@PathVariable Long id) {
return mailDao.getToUsers(id);
}
}
然后 service 层
public interface MailService {
void save(Mail mail, List<String> toUser);
}
service impl层
@Service
public class MailServiceImpl implements MailService {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@Autowired
private SendMailSevice sendMailSevice;
@Autowired
private MailDao mailDao;
@Override
@Transactional
public void save(Mail mail, List<String> toUser) {
// mail.setUserId(UserUtil.getLoginUser().getId());
//userid 为登录的用户id 如果不进行登录 可以随便设置一个值
mail.setUserId(1l);
mailDao.save(mail);
toUser.forEach(u -> {
int status = 1;
try {
//进行 邮件发送
sendMailSevice.sendMail(u, mail.getSubject(), mail.getContent());
} catch (Exception e) {
log.error("发送邮件失败", e);
status = 0;
}
mailDao.saveToUser(mail.getId(), u, status);
});
}
dao 层
@Mapper
public interface MailDao {
//这里 也放着 一些增删的方法 可以在controller 自行引用
@Select("select * from t_mail t where t.id = #{id}")
Mail getById(Long id);
// @Delete("delete from t_mail where id = #{id}")
// int delete(Long id);
// @Update("update t_mail t set subject = #{subject}, content = #{content}, updateTime = now() where t.id = #{id}")
// int update(Mail mail);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into t_mail(userId, subject, content, createTime, updateTime) values(#{userId}, #{subject}, #{content}, now(), now())")
int save(Mail mail);
@Insert("insert into t_mail_to(mailId, toUser, status) values(#{mailId}, #{toUser}, #{status})")
int saveToUser(@Param("mailId") Long mailId, @Param("toUser") String toUser, @Param("status") int status);
@Select("select t.* from t_mail_to t where t.mailId = #{mailId}")
List<MailTo> getToUsers(Long mailId);
}
这里为邮件发送的操作
public interface SendMailSevice {
/**
*
* @param toUser
* @param subject
* 标题
* @param text
* 内容(支持html格式)
*/
void sendMail(List<String> toUser, String subject, String text);
void sendMail(String toUser, String subject, String text) throws MessagingException;
}
@Service
public class SendMailSeviceImpl implements SendMailSevice {
//Spring提供的非常好用的JavaMailSender接口实现邮件发送 springboot相关引用
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")//发送者 在 yml 中配置完成的参数
private String serverMail;
//多个收件人
@Override
public void sendMail(List<String> toUser, String subject, String text) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//邮件的参数
helper.setFrom(serverMail);
helper.setTo(toUser.toArray(new String[toUser.size()]));
helper.setSubject(subject);
helper.setText(text, true);
javaMailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
//一个收件人
@Override
public void sendMail(String toUser, String subject, String text) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(serverMail);
helper.setTo(toUser);
helper.setSubject(subject);
helper.setText(text, true);
javaMailSender.send(message);
}
}
然后就完成了 最后就是 测试 用swagger 测试一下


本文详细介绍如何在SpringBoot项目中整合邮件发送模块,包括配置SMTP服务器,使用JavaMailSender接口发送邮件,以及通过实体类、DAO、Service和Controller实现邮件发送流程。
787

被折叠的 条评论
为什么被折叠?



