Java发送邮件 SpringBoot
配置和目录结构
配置预览
spring.application.name
:设置应用程序的名称为"demo-mail"。spring.mail.host
:设置SMTP服务器的地址为"smtp.qq.com",这是QQ邮箱的SMTP服务器地址。spring.mail.port
:设置SMTP服务器的端口号为465,这是QQ邮箱的SMTP服务器端口号。spring.mail.username
:设置发送邮件的邮箱地址为"3324855376@qq.com",这是发送邮件的QQ邮箱地址。spring.mail.password
:设置发送邮件的邮箱密码为"axyqbvfuxkdqdaai",这是发送邮件的QQ邮箱密码。注意,如果密码是纯数字,需要将其用引号括起来。spring.mail.default-encoding
:设置邮件的默认编码格式为UTF-8。spring.mail.properties.mail.debug
:设置是否开启debug模式发送邮件,这里设置为true,表示开启debug模式。spring.mail.properties.smtp.connectionTimeout
:设置连接延迟时间为5000毫秒。spring.mail.properties.smtp.timeout
:设置延迟时间为5000毫秒。spring.mail.properties.smtp.writeTimeout
:设置写入邮箱延迟时间为5000毫秒。spring.mail.properties.smtp.allow8BitMime
:设置是否允许8位编码的MIME。spring.mail.properties.smtp.sendPartial
:设置是否发送部分内容。spring.mail.properties.smtp.ssl.enabled
:设置是否开启SSL连接,这里设置为true,表示开启SSL连接。spring.mail.properties.smtp.socketFactory.class
:设置SSL连接时的SocketFactory类为"javax.net.ssl.SSLSocketFactory"。
yml
spring:
application:
name: demo-mail
mail:
host: smtp.qq.com # 邮箱地址
port: 465 # 邮箱端口号
username: 3324855376@qq.com # 设置发送邮箱
password: axyqbvfuxkdqdaai # 如果是纯数字要加引号
default-encoding: UTF-8 # 设置编码格式
properties:
mail:
debug: true # 是否开启debug模式发送邮件
smtp:
connectionTimeout: 5000 # 设置连接延迟
timeout: 5000 # 延迟时间
writeTimeout: 5000 # 写入邮箱延迟
allow8BitMime: true
sendPartial: true
ssl:
enabled: true # 是否开启SSL连接
socketFactory:
class: javax.net.ssl.SSLSocketFactory # 必要设置!!!
可以设置发送邮件debug模式这样在发送时可以在控制台中输出相关信息。
目录结构
需要导入的包
SpringBoot版本为3.2.3
java
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version>
<relativePath/>
</parent>
邮件配置说明
xml
<dependencies>
<!-- 邮箱 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- knife4j -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.47</version>
</dependency>
</dependencies>
发送简单邮件
Controller层
在服务中调用sendSimpleEmail
方法
java
@RestController
@RequiredArgsConstructor
@RequestMapping("/email")
@Tag(name = "邮箱发送接口", description = "邮箱发送接口")
@Slf4j
public class EmailController {
private final EmailService emailService;
@Operation(summary = "发送简单邮件", description = "发送简单邮件")
@PostMapping("/send-text")
public void sendText(@RequestBody EmailSend emailSend) {
log.info("发送简单邮件");
emailService.sendSimpleEmail(emailSend);
}
}
实现类
因为要保持配置中的发件人和邮箱中发件人是同一个,所以在上面直接读取配置文件中的发件人,这样也比较灵活点。
如果不知道配置文件内容请看上面部分。
xml
// 因为要设置setFrom邮箱,但是又和配置邮箱username相同所以采取读取配置文件方式
@Value("${spring.mail.username}")
private String emailFrom;
实现方法
SimpleMailMessage
对象mailMessage
,用于设置邮件的各个属性。mailMessage.setFrom(emailFrom)
设置邮件发送人,其中emailFrom
是发送人的地址,在配置文件中已经定义mailMessage.setTo(emailSend.getSendTo())
设置邮件接收者,其中emailSend.getSendTo()
设置了邮件接收者的地址。mailMessage.setSubject(emailSend.getSubject())
设置邮件主题,其中emailSend.getSubject()
获取了邮件的主题。mailMessage.setText(emailSend.getMessage())
设置邮件消息内容,其中emailSend.getMessage()
获取了邮件的消息内容。- 调用
javaMailSender.send(mailMessage)
发送邮件,javaMailSender
是一个JavaMailSender
对象,可能在代码的其他地方定义。
java
@Service
@RequiredArgsConstructor
public class EmailServiceImpl implements EmailService {
private final JavaMailSender javaMailSender;
// 因为要设置setFrom邮箱,但是又和配置邮箱username相同所以采取读取配置文件方式
@Value("${spring.mail.username}")
private String emailFrom;
/**
* 发送邮件-简单
*
* @param emailSend 邮件消息
*/
@Override
public void sendSimpleEmail(EmailSend emailSend) {
// 创建邮件消息体 SimpleMailMessage 发送简单邮件
SimpleMailMessage mailMessage = new SimpleMailMessage();
// 设置邮件发送人
mailMessage.setFrom(emailFrom);
// 设置邮件接受者
mailMessage.setTo(emailSend.getSendTo());
// 设置邮件主题
mailMessage.setSubject(emailSend.getSubject());
// 设置邮件消息
mailMessage.setText(emailSend.getMessage());
// 发送邮件
javaMailSender.send(mailMessage);
}
}
调试方法
发送带附件邮件
需要注意,附件可以发送多个,在下文中也会说到。
发送注意点
因为在SpringBoot中只能有一个请求体@RequestBody
所以在发送时,要想实现这个格式有两种方式。
- 如果想要两个一起用需要将JSON对象当成字符串发送之后在后端解析
@RequestBody MultipartFile file, @RequestParam String emailSend
- 如果就是将
EmailSend
对象拆成一个一个字段进行解析
在这我还是觉得当成整个文本解析比较好,所以就采取了解析整个字段方式,之后使用JSON转换下即可。
Controller层
直接调用实现类中方法即可sendAttachmentEmail()
在这里将字符串解析成JSONEmailSend send = JSON.parseObject(emailSend, EmailSend.class);
java
@RestController
@RequiredArgsConstructor
@RequestMapping("/email")
@Tag(name = "邮箱发送接口", description = "邮箱发送接口")
@Slf4j
public class EmailController {
private final EmailService emailService;
@Operation(summary = "发送带附件邮件", description = "发送带附件邮件")
@PostMapping("send-attachment")
public String sendAttachment(@RequestBody MultipartFile file, @RequestParam String emailSend) {
log.info("发送带附件邮件");
try {
EmailSend send = JSON.parseObject(emailSend, EmailSend.class);
emailService.sendAttachmentEmail(send, file);
return "发送成功";
} catch (MessagingException e) {
return e.getMessage();
}
}
}
实现类
MimeMessage
对象mailMessage
,用于发送带附件或富文本内容的邮件。MimeMessageHelper
对象helper
,用于设置邮件的各个属性和添加附件。helper.setFrom(emailFrom)
设置邮件发送人,其中emailFrom
是发送人的地址,可能在代码的其他地方定义。helper.setTo(emailSend.getSendTo())
设置邮件接收者,其中emailSend.getSendTo()
获取了邮件接收者的地址。helper.setText(emailSend.getMessage())
设置邮件消息内容,其中emailSend.getMessage()
获取了邮件的消息内容。helper.setSubject(emailSend.getSubject())
设置邮件主题,其中emailSend.getSubject()
获取了邮件的主题。helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file)
添加附件,其中file.getOriginalFilename()
获取了附件的原始文件名,file
表示要添加的附件文件。- 调用
javaMailSender.send(mailMessage)
发送邮件,javaMailSender
是一个JavaMailSender
对象,可能在代码的其他地方定义。
java
@Service
@RequiredArgsConstructor
public class EmailServiceImpl2 implements EmailService {
private final JavaMailSender javaMailSender;
// 因为要设置setFrom邮箱,但是又和配置邮箱username相同所以采取读取配置文件方式
@Value("${spring.mail.username}")
private String emailFrom;
/**
* 发送带附件邮件
*
* @param emailSend 邮件消息
*/
@Override
public void sendAttachmentEmail(EmailSend emailSend, MultipartFile file) throws MessagingException {
// 创建 MimeMessage 对象用户发送附件或者是富文本内容
MimeMessage mailMessage = javaMailSender.createMimeMessage();
// 创建 MimeMessageHelper
MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true);
// 奢姿邮件发送人
helper.setFrom(emailFrom);
// 设置邮件接受者
helper.setTo(emailSend.getSendTo());
// 设置邮件消息
helper.setText(emailSend.getMessage());
// 设置邮件主题
helper.setSubject(emailSend.getSubject());
// 邮件添加附件
helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file);
// 发送邮件
javaMailSender.send(mailMessage);
}
}
发送多个附件
附件可以设置多个
发送富文本邮件
富文本其实就是HTML邮件,只要在发送邮件设置一个true
即可。
helper.setText(emailSend.getMessage(), true);
message中设置HTML内容即可
Controller层
java
@Operation(summary = "发送富文本邮件", description = "发送富文本邮件")
@PostMapping("send-rich")
public String sendRich(@RequestBody EmailSend emailSend) {
log.info("发送富文本邮件");
try {
emailService.sendRich(emailSend);
return "发送成功";
} catch (MessagingException e) {
return e.getMessage();
}
}
实现类
MimeMessage
对象message
,用于发送富文本或附件的邮件。MimeMessageHelper
对象helper
,用于设置邮件的各个属性和富文本内容。helper.setFrom(emailFrom)
设置邮件发送人,其中emailFrom
是发送人的地址,可能在代码的其他地方定义。helper.setTo(emailSend.getSendTo())
设置邮件接收者,其中emailSend.getSendTo()
获取了邮件接收者的地址。helper.setSubject(emailSend.getSubject())
设置邮件主题,其中emailSend.getSubject()
获取了邮件的主题。helper.setText(emailSend.getMessage(), true)
设置邮件富文本内容,其中emailSend.getMessage()
获取了邮件的富文本内容,第二个参数true
表示以HTML格式发送邮件。- 调用
javaMailSender.send(message)
发送邮件,javaMailSender
是一个JavaMailSender
对象,可能在代码的其他地方定义。
java
/**
* 发送富文本邮件
*
* @param emailSend 邮件消息
*/
@Override
public void sendRich(EmailSend emailSend) throws MessagingException {
// 创建 MimeMessage 对象用于发送邮件富文本或者附件
MimeMessage message = javaMailSender.createMimeMessage();
// 创建 MimeMessageHelper
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置邮件发送者
helper.setFrom(emailFrom);
// 设置邮件接受者
helper.setTo(emailSend.getSendTo());
// 设置邮件主题
helper.setSubject(emailSend.getSubject());
// 设置邮件富文本,后面跟true 表示HTML格式发送
helper.setText(emailSend.getMessage(), true);
// 发送邮件
javaMailSender.send(message);
}
测试结果
带抄送邮件
调用helper.setCc()
即可
Controller层
java
@Operation(summary = "发送带抄送的邮件", description = "发送带抄送的邮件")
@PostMapping("send-cc")
public String sendCC(@RequestBody EmailSend emailSend, @RequestParam String ccParam) {
log.info("发送带抄送的邮件");
try {
emailService.sendCC(emailSend, ccParam);
return "发送成功";
} catch (MessagingException e) {
return e.getMessage();
}
}
实现类
helper.setCc
可以设置多个,需要传入string的数组,或者是单个。
java
/**
* 发送带抄送的邮件
*
* @param emailSend 邮件消息
* @param ccParam 抄送人
*/
@Override
public void sendCC(EmailSend emailSend, String ccParam) throws MessagingException {
// 创建 MimeMessage 对象用于发送邮件富文本或者附件
MimeMessage message = javaMailSender.createMimeMessage();
// 创建 MimeMessageHelper
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置发送人
helper.setFrom(emailFrom);
// 设置邮件接受者
helper.setTo(emailSend.getSendTo());
// 设置邮件主题
helper.setSubject(emailSend.getSubject());
// 设置发送消息 为富文本
helper.setText(emailSend.getMessage(), true);
// 设置抄送人
helper.setCc(ccParam.split(","));
// 发送邮件
javaMailSender.send(message);
}
lper helper = new MimeMessageHelper(message, true);
// 设置发送人
helper.setFrom(emailFrom);
// 设置邮件接受者
helper.setTo(emailSend.getSendTo());
// 设置邮件主题
helper.setSubject(emailSend.getSubject());
// 设置发送消息 为富文本
helper.setText(emailSend.getMessage(), true);
// 设置抄送人
helper.setCc(ccParam.split(","));
// 发送邮件
javaMailSender.send(message);
}