Springboot 项目 整合 邮件 发送模块

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

首先 ,了解一下 电子邮件协议

电子邮件协议

电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 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 测试一下
在这里插入图片描述
在这里插入图片描述

ok 完成了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Da.ge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值