文章目录
前言
在现代的Web应用程序中,邮件发送功能是非常常见且重要的一部分。Spring Boot框架提供了简单且强大的方式来实现邮件发送功能,本文将介绍如何在Spring Boot项目中集成邮件发送功能,并通过示例展示其基本用法。
本文发送到的邮件是Microsoft Outlook
pom.xml
xml
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>
bootstrap.yml
yml
spring:
mail:
default-encoding: utf-8
# 主机地址
host: xx.xx.xx.xx
# 设置用户名
username: xxx
# 授权码
password: xxx
#端口
port: 25
#配置
properties:
mail:
smtp:
ssl:
enable: true
timeout: 25000
auth: true
starttls:
enable: true
required: true
#发送方
from: Qixiansheng@xxx.com
#接收方
to:
- QiFei@xxx.com
#邮件主题
warehouse-subject: 每日统计
protocol: smtp
enableMailSend: true
配置相关类
java
package com.ctf.ics.constant;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
@Component
@Data
@ConfigurationProperties(prefix = "spring.mail")
public class MailConstant {
private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private String host;
private Integer port;
private String username;
private String password;
private String protocol = "smtp";
private Charset defaultEncoding = DEFAULT_CHARSET;
private Map<String, String> properties = new HashMap<>();
private String from;
private String[] to;
private Boolean enableMailSend=Boolean.FALSE;
@Bean(value = "mailSender")
public JavaMailSenderImpl mailSender() {
JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost(this.host);
sender.setDefaultEncoding(DEFAULT_CHARSET.name());
sender.setPassword(this.password);
sender.setUsername(this.username);
sender.setProtocol(this.protocol);
sender.setPort(this.port);
return sender;
}
}
java
package com.ctf.ics.util;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.ctf.ics.constant.MailConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Component(value = "mailUtils")
@Slf4j
public class MailUtils {
@Resource
private JavaMailSender mailSender;
@Resource
private MailConstant mailConstant;
/*
*发送邮件异常时则重试
*/
@Retryable(value = {Exception.class},maxAttempts = 5)
public void sendMail(String subject,Object obj){
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setTo(mailConstant.getTo());
helper.setFrom(mailConstant.getFrom());
helper.setSubject(subject);
helper.setText("<html>\n"+
"<body>\n"+
"保存失败时间:<b>" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:dd:ss")) + "</b><br>"+
"保存失败消息数据:<p>" + JSON.toJSONString(obj) + "</p>"+
"</body>\n"+
"</html>",true);
mailSender.send(mimeMessage);
log.info("发送成功,邮件内容:{}",JSON.toJSONString(obj));
} catch (MessagingException e) {
log.info("发送失败,邮件内容:{}",JSON.toJSONString(obj));
}
}
public void sendMail(String subject,String body,String to){
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setTo(mailConstant.getTo());
helper.setFrom(mailConstant.getFrom());
helper.setSubject(subject);
helper.setText(body,true);
mailSender.send(mimeMessage);
log.info("发送成功,邮件内容:{}",body);
} catch (MessagingException e) {
log.info("发送失败,邮件内容:{}",body);
}
}
/**
* 发送普通邮件信息
*
* @param subject 邮件主题
* @param content 邮件内容(发送内容)
*/
public void sendMail(String subject, String content) throws MessagingException {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
if (mailConstant.getTo().length == 0) {
return;
}
for (String to : mailConstant.getTo()) {
if (StringUtils.isNotEmpty(to)) {
//设置接收方
helper.addTo(to);
}
}
helper.setFrom(mailConstant.getFrom());
helper.setSubject(subject);
helper.setText(content, true);
log.info("邮件开始发送");
// 发送邮件
if (mailConstant.getEnableMailSend()) {
mailSender.send(mimeMessage);
}
log.info("发送成功,邮件内容:{}", content);
} catch (Exception e) {
log.info("发送失败,邮件内容:{},异常信息:{}", content, e.getMessage());
throw e;
}
}
public void sendMail(String subject, String content,List<String> tos,List<String> ccs) throws MessagingException {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
if (CollUtil.isEmpty(tos)) {
return;
}
for (String to : tos) {
if (StringUtils.isNotEmpty(to)) {
helper.addTo(to);
}
}
if(CollUtil.isNotEmpty(ccs)){
for (String cc : ccs) {
if (StringUtils.isNotEmpty(cc)) {
helper.addCc(cc);
}
}
}
helper.setFrom(mailConstant.getFrom());
helper.setSubject(subject);
helper.setText(content, true);
log.info("邮件开始发送");
// 发送邮件
if (mailConstant.getEnableMailSend()) {
mailSender.send(mimeMessage);
}
log.info("发送成功,邮件内容:{}", content);
} catch (Exception e) {
log.info("发送失败,邮件内容:{},异常信息:{}", content, e.getMessage());
throw e;
}
}
/**
* 发送带附件的邮件信息
*
* @param subject 邮件主题
* @param content 邮件内容(发送内容)
* @param files 文件数组 // 可发送多个附件
*/
public void sendMessageCarryFiles(String subject, String content, File[] files, List<String> tos,List<String> ccs) throws MessagingException {
try {
log.info("subject:\n{}, content:\n{}", subject, content);
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 设置发送发
helper.setFrom(mailConstant.getFrom());
if (CollUtil.isEmpty(tos)) {
return;
}
for (String to : tos) {
if (StringUtils.isNotEmpty(to)) {
helper.addTo(to);
}
}
if(CollUtil.isNotEmpty(ccs)){
for (String cc : ccs) {
if (StringUtils.isNotEmpty(cc)) {
helper.addCc(cc);
}
}
}
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件内容
helper.setText(content, true);
// 添加附件(多个)
if (files != null && files.length > 0) {
for (File file : files) {
helper.addAttachment(file.getName(), file);
}
}
log.info("附件邮件开始发送");
// 发送邮件
if (mailConstant.getEnableMailSend()) {
mailSender.send(mimeMessage);
}
log.info("附件邮件发送成功,邮件内容:{}", content);
} catch (Exception e) {
log.info("发送失败,邮件内容:{},异常信息:{}", content, e.getMessage());
throw e;
}
}
}
测试
java
@Resource
private MailUtils mailUtils;
@GetMapping("/test")
public void test() {
String content = "<html>\n"+ "<body>\n"+ "<br>"+ "<p>每日统计</p>\n"+ "</body>\n"+ "</html>";
try {
mailUtils.sendMail("每日统计",content);
} catch (MessagingException e) {
//异常相关处理
}
}