SpringBoot三十一:集成邮件服务

发送邮件是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息。

pom.xml引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

application.yml配置

spring: 
  mail:
    host: smtp.qq.com #设置邮箱主机
    username: 931750352@qq.com #设置用户名
    password: 123456 #设置密码,该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码

接口

public interface MailService {
	/**
	 * 简单邮件
	 * 
	 * @param mailTo         邮件接收人
	 * @param subject        邮件主题
	 * @param activationCode 邮件内容
	 * @throws Exception
	 */
	void sendSimpleMail(String mailTo, String subject, String activationCode) throws Exception;

	/**
	 * 复杂邮件
	 * 
	 * @param mailTo         邮件接收人
	 * @param subject        邮件主题
	 * @param activationCode 邮件内容
	 * @throws Exception
	 */
	void sendMimeMail(String mailTo, String subject, String activationCode);

}

}

实现类

@Service
public class MailServiceImpl implements MailService {

	@Value("${spring.mail.username}")
	private String MAIL_SENDER;

	@Autowired
	private JavaMailSender javaMailSender;

	public void sendSimpleMail(String mailTo, String subject, String activationCode) {
		try {
			SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
			// 邮件发送人
			simpleMailMessage.setFrom(MAIL_SENDER);
			simpleMailMessage.setTo(mailTo);
			simpleMailMessage.setSubject(subject);
			simpleMailMessage.setText(activationCode);
			javaMailSender.send(simpleMailMessage);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void sendMimeMail(String mailTo, String subject, String activationCode) {
		try {
			MimeMessage mimeMessage = javaMailSender.createMimeMessage();
			MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
			// 邮件发送人
			messageHelper.setFrom(MAIL_SENDER);
			messageHelper.setTo(mailTo);
			messageHelper.setSubject(subject);
			messageHelper.setText(activationCode);
			messageHelper.addInline("image.png", new File("F:\\mail\\image.png"));
			messageHelper.addAttachment("work.pdf", new File("F:\\mail\\word.pdf"));
			javaMailSender.send(mimeMessage);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class MailTest {

	@Autowired
	private MailService MailService;

	@Test
	public void testSimpleMail() {
		try {
			MailService.sendSimpleMail("[email protected]", "测试邮箱发送【主题】",
					"邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容!!!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testMimeMail() {
		try {
			MailService.sendMimeMail("[email protected]", "测试邮箱发送【主题2】",
					"邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容邮件内容!!!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

应用

application.yml

spring: 
  mail:
    host: smtp.qq.com #设置邮箱主机
    username: 931750352@qq.com #设置用户名
    password: 123456 #设置密码,该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码
  servlet:
    multipart:
      max-file-size: 10MB #限制单个文件大小
      max-request-size: 50MB #限制请求总量
#spring:
#  mail:
#    host: smtp.163.com #SMTP服务器地址
#    username:  [email protected] #登陆账号
#    password: 123456 #登陆密码(或授权码)

邮件信息类

@Data
//邮件信息
public class MailInfo {

	private String id;// 邮件id
	private String from;// 邮件发送人
	private String to;// 邮件接收人(多个邮箱则用逗号","隔开)
	private String subject;// 邮件主题
	private String text;// 邮件内容
	private Date sentDate;// 发送时间
	private String cc;// 抄送(多个邮箱则用逗号","隔开)
	private String bcc;// 密送(多个邮箱则用逗号","隔开)
	private String status;// 状态
	private String error;// 报错信息
	@JsonIgnore
	private MultipartFile[] multipartFiles;// 邮件附件

}

发送邮件

/**
 * 邮件业务类 MailService
 */
@Slf4j
@Service
public class MailService2 {

	@Value("${spring.mail.username}")
	private String MAIL_SENDER;// 邮件发送人

	@Autowired
	private JavaMailSender javaMailSender;// 注入邮件工具类

	/**
	 * 发送邮件
	 * 
	 * @param mailInfo
	 * @return
	 */
	public MailInfo sendMail(MailInfo mailInfo) {
		try {
			// 1.检测邮件
			checkMail(mailInfo);
			// 2.发送邮件
			sendMimeMail(mailInfo);
			// 3.保存邮件
			return saveMail(mailInfo);
		} catch (Exception e) {
			// 打印错误信息
			log.error("发送邮件失败:", e);
			mailInfo.setStatus("fail");
			mailInfo.setError(e.getMessage());
			return mailInfo;
		}

	}

	/**
	 * 检测邮件信息
	 * 
	 * @param mailInfo
	 */
	private void checkMail(MailInfo mailInfo) {
		if (StringUtils.isEmpty(mailInfo.getTo())) {
			throw new RuntimeException("邮件收信人不能为空");
		}
		if (StringUtils.isEmpty(mailInfo.getSubject())) {
			throw new RuntimeException("邮件主题不能为空");
		}
		if (StringUtils.isEmpty(mailInfo.getText())) {
			throw new RuntimeException("邮件内容不能为空");
		}
	}

	/**
	 * 构建复杂邮件信息类
	 * 
	 * @param mailInfo
	 */
	private void sendMimeMail(MailInfo mailInfo) {
		try {
			MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);// true表示支持复杂类型
			// 邮件发信人从配置项读取
			mailInfo.setFrom(MAIL_SENDER);
			// 邮件发信人
			messageHelper.setFrom(mailInfo.getFrom());
			// 邮件收信人
			messageHelper.setTo(mailInfo.getTo().split(","));
			// 邮件主题
			messageHelper.setSubject(mailInfo.getSubject());
			// 邮件内容
			messageHelper.setText(mailInfo.getText());
			// 抄送
			if (!StringUtils.isEmpty(mailInfo.getCc())) {
				messageHelper.setCc(mailInfo.getCc().split(","));
			}
			// 密送
			if (!StringUtils.isEmpty(mailInfo.getBcc())) {
				messageHelper.setCc(mailInfo.getBcc().split(","));
			}
			// 添加附件
			if (mailInfo.getMultipartFiles() != null) {
				for (MultipartFile multipartFile : mailInfo.getMultipartFiles()) {
					messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
				}
			}
			// 发送时间
			if (StringUtils.isEmpty(mailInfo.getSentDate())) {
				mailInfo.setSentDate(new Date());
				messageHelper.setSentDate(mailInfo.getSentDate());
			}
			// 发送邮件
			javaMailSender.send(messageHelper.getMimeMessage());
			mailInfo.setStatus("ok");
			log.info("发送邮件成功:{}->{}", mailInfo.getFrom(), mailInfo.getTo());
		} catch (Exception e) {
			// 发送失败
			throw new RuntimeException(e);
		}
	}

	/**
	 * 保存邮件
	 * 
	 * @param mailInfo
	 * @return
	 */
	private MailInfo saveMail(MailInfo mailInfo) {
		// 将邮件保存到数据库
		return mailInfo;
	}

}

QQ邮箱授权码获取

在这里插入图片描述
在这里插入图片描述

163邮箱授权码获取

登陆网易邮箱163,在设置中打开并勾选POP3/SMTP/IMAP服务,然后会得到一个授权码,这个邮箱和授权码将用作登陆认证。

代码托管:springboot_mail

发布了160 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45730091/article/details/105580346