利用 Springboot 发送邮件和附件

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

本文简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件,主要作为项目开发过程的记录,想要详细了解这其中的过程和原理可以参考这两篇文章,写得很详细很不错。
基于JavaMail的Java邮件发送:简单邮件发送
SpringBoot 发送邮件和附件(实用版)

1、前期准备

本文以 126邮箱 为例(其他邮箱大同小异),邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,然后会得到一个授权码,这个邮箱和授权码将用作登陆认证。
在这里插入图片描述
记下邮箱的 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()); // 发送失败
        }
    }

最后的结果,发送成功~
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值