本文简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件,主要作为项目开发过程的记录,想要详细了解这其中的过程和原理可以参考这两篇文章,写得很详细很不错。
基于JavaMail的Java邮件发送:简单邮件发送
SpringBoot 发送邮件和附件(实用版)
1、前期准备
本文以 126邮箱 为例(其他邮箱大同小异),邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,然后会得到一个授权码,这个邮箱和授权码将用作登陆认证。

记下邮箱的 SMTP 服务器地址,如下所示:

2、相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3、构建邮件实体类
我一开始想直接用一个实体类接收前端传递过来的参数,但是发现其他属性都没问题,只有件属性为 null 接收不到。
实体类:
@Data
public class EmailDTO {
private String userEmail; // 发件人邮箱
private String receiveEmail; // 收件人邮箱
private String sendName; // 发件人名称
private String receiveName; // 收件人名称
private String subject; // 邮件主题
private String content; // 邮件内容
private MultipartFile[] attach; // 邮件附件
}
Postman传递的参数:

Controller中的方法:

参考这篇文章的说法,@RequestBody不能和Multipart同时用
传送门
然后我去问了gpt,他给的回答如下:
- 当使用 @RequestBody 注解接收实体类对象时,Spring MVC 默认使用的是 HttpMessageConverter,它将请求的内容转换为相应的对象。然而,MultipartFile 是一个特殊的类型,用于处理文件上传,不属于常规的请求参数。
- 由于 MultipartFile 是用于处理文件上传的类型,它的数据通常会以 multipart/form-data 的形式提交,而不是默认的 application/json 或 application/x-www-form-urlencoded 形式。因此,在通过 @RequestBody 接收实体类对象时,这些文件数据不会默认被转换为 MultipartFile 对象。
- 对于文件上传操作,推荐使用 @RequestParam 注解来接收文件参数,而不是 @RequestBody。
最后我用了一个笨办法

4、发送邮件
由于业务需求,邮件的信息不能写死,所以这里我是用set的方式来进行配置。如果不需要变化,也可以参考网上其他博客将这些信息配置在 application.yml 文件中,这里就不详细说了。
// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
// 网易126邮箱的 SMTP 服务器地址为: smtp.126.com
// SSL加密端口:465;非加密端口:25
public static final String EMAIL_SMTP_HOST = "smtp.126.com";
public static final String EMAIL_SMTP_PORT = "465";
// public static final String EMAIL_SMTP_PORT = "25";
// 构建复杂邮件信息类
public Result sendEmailWithAttach(EmailDTO emailDTO) {
try {
checkMail(emailDTO); //检查邮件信息完整性
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
// 初始化邮件发送sender
javaMailSender.setProtocol("smtp"); // 指定协议
javaMailSender.setHost(EMAIL_SMTP_HOST); // 指定服务器
javaMailSender.setUsername(emailDTO.getUserEmail()); // 邮件发信人
// 根据用户邮箱获取邮箱授权码
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("email",emailDTO.getUserEmail());
User user = userMapper.selectOne(userQueryWrapper);
if (user == null) {
return Result.fail("用户邮箱错误!");
}
javaMailSender.setPassword(user.getEmailCode()); // 邮件授权码
javaMailSender.setDefaultEncoding("utf-8");
// 初始化邮件发送properties
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true"); // 是否需要用户认证
properties.setProperty("mail.debug", "true"); // 启用调试
properties.setProperty("mail.smtp.port", EMAIL_SMTP_PORT); // 设置端口
properties.setProperty("mail.smtp.socketFactory.fallback", "false");
properties.setProperty("mail.smtp.socketFactory.port", EMAIL_SMTP_PORT); // 设置ssl端口
properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
javaMailSender.setJavaMailProperties(properties);
MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true,"UTF-8");//true表示支持复杂类型
messageHelper.setFrom(emailDTO.getUserEmail()); // 邮件发信人
messageHelper.setTo(emailDTO.getReceiveEmail()); // 收件人邮箱
messageHelper.setSubject(emailDTO.getSubject()); // 邮件主题
messageHelper.setText(emailDTO.getContent()); // 邮件内容
if (emailDTO.getAttach() != null) { // 添加邮件附件
for (MultipartFile multipartFile : emailDTO.getAttach()) {
messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
}
}
javaMailSender.send(messageHelper.getMimeMessage()); // 正式发送邮件
return Result.ok();
} catch (Exception e) {
return Result.fail(e.getMessage()); // 发送失败
}
}
最后的结果,发送成功~

本文介绍了如何使用Java和SpringBoot通过JavaMailAPI创建并发送电子邮件,包括SMTP设置、依赖管理、构建EmailDTO实体类、处理附件以及发送邮件的详细步骤。
3716

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



