【RuoYi-Vue-Plus】扩展笔记 01 - 集成 JavaMail 发送邮件(源码)

前言

前几天在群里听 狮子大佬框架 4.2+ 版本考虑集成邮件和短信,等出来之后会再学习一下框架中的写法(短信比较像OSS,有多个不同的供应商,因此我个人感觉写法可能会比较像OSS模块)。因为最近需要用到邮件发送的功能,所以在 3.5.0 版本中做了简单集成,当然新版本也同样适用。

参考目录

集成流程

集成的步骤和上面参考目录 Guide to Spring Email 差不多,功能不是特别难,所以比较容易实现。

1、Maven

在 common 模块引入:

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

版本是 Spring Boot 的默认版本:
在这里插入图片描述
点击进去也可以看到是 2.5.8 版本:
在这里插入图片描述

2、yaml 配置文件

配置文件的写法可以参考框架扩展模块 xxl-job 的 yaml 文件。

spring:
  # 邮件
  mail:
    # from 要和 username 一致, 否则报错
    from: xxx@qq.com
    # 邮件服务地址
    host: smtp.qq.com
    # 用户名
    username: xxx@qq.com
    # 授权码 (设置 - 账户 - POP3/SMTP服务)
    password: xxx
    # QQ邮箱加密端口,不同邮箱的端口不一样
    port: 465
    properties:
      mail:
        smtp:
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
          ssl:
            trust: smtp.qq.com
          # 是否需要用户认证
          auth: true
          starttls:
          	# 启用TLS加密
            enable: true
            required: true

需要注意的点:

  1. from 要和 username 一致,否则会报错
  2. password 不是邮箱的密码而是授权码,以QQ邮箱为例获取授权码:
    在这里插入图片描述
    在这里插入图片描述
    点击生成授权码:
    在这里插入图片描述
    手机发送短信,然后点击我已发送:
    在这里插入图片描述
    生成授权码,复制到 yaml 文件中:
    在这里插入图片描述
  3. 不同邮箱的加密端口不一样:

图片来源: 发送Email - 廖雪峰的官方网站
在这里插入图片描述

3、邮件属性 MailProperties

@Data
@Component
@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {
   
    private String host;

    private String username;

    private String password;

    private String from;

    private Integer port;

    @Value("${spring.mail.properties.mail.smtp.auth}")
    private Boolean auth;

    @Value("${spring.mail.properties.mail.smtp.starttls.enable}")
    private Boolean starttlsEnable;

    @Value("${spring.mail.properties.mail.smtp.ssl.trust}")
    private String sslTrust;

}

4、邮件配置 MailConfig

@Component
@Configuration
public class MailConfig {

    @Resource
    private MailProperties mailProperties;

    public String getFrom() {
        return mailProperties.getFrom();
    }

    public JavaMailSender getMailSender(String username, String password) {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(mailProperties.getHost());
        mailSender.setPort(mailProperties.getPort());
        // 如果没有自定义的用户,就使用配置类里面的用户
        mailSender.setUsername(StringUtils.blankToDefault(username, mailProperties.getUsername()));
        mailSender.setPassword(StringUtils.blankToDefault(password, mailProperties.getPassword()));

        Properties props = mailSender.getJavaMailProperties();
        // starttls.enable = true 时为 smtps
        props.put("mail.transport.protocol", "smtps");
        props.put("mail.smtp.auth", mailProperties.getAuth());
        props.put("mail.smtp.starttls.enable", mailProperties.getStarttlsEnable());
        props.put("mail.smtp.ssl.trust", mailProperties.getSslTrust());
        props.put("mail.debug", "true");

        return mailSender;
    }

}

关于邮件配置属性:(图片来源: Guide to Spring Email
在这里插入图片描述

5、简单邮件发送测试

 	@GetMapping("/sendSimpleMessage")
    public void sendSimpleMessage(String to, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        // 邮件发送人
        message.setFrom(mailConfig.getFrom());
        // 邮件接收人(可以使用 String[] 发送给多个用户)
        message.setTo(to);
        // 邮件标题
        message.setSubject(subject);
        // 邮件内容
        message.setText(text);
        // 发送邮件
        mailConfig.getMailSender(null, null).send(message);
    }

在这里插入图片描述
邮件发送成功:
在这里插入图片描述
控制台输出(隐去了邮箱地址):

DEBUG: Jakarta Mail version 1.6.7
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]}
DEBUG: Providers Listed By Protocol: {imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 465, isSSL true
220 newxmesmtplogicsvrszc7.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 465
EHLO PC-20180305GXML
250-newxmesmtplogicsvrszc7.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.qq.com, user=xxx@qq.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<xxx@qq.com>
250 OK
RCPT TO:<xxx@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   xxx@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
Date: Fri, 29 Apr 2022 11:16:40 +0800 (CST)
From: xxx@qq.com
To: xxx@qq.com
Message-ID: <237838440.0.1651202200219@PC-20180305GXML>
Subject: =?UTF-8?B?5rWL6K+V6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

5rWL6K+VIEphdmFNYWlsIOeugOWNlemCruS7tg==
.
250 OK: queued as.
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 Bye.

具体的信息解析可以参考廖雪峰老师的博客 发送Email - 廖雪峰的官方网站

6、复杂邮件发送

如果是需要发送带附件的邮件,需要使用 MimeMessage 以及 MimeMessageHelper,具体实现有多种,可以参考前面的参考目录自行实现。

图片来源: Guide to Spring Email这里是引用
图片来源: 发送Email - 廖雪峰的官方网站
在这里插入图片描述

底层调用流程

##、流程简图

在这里插入图片描述

#1、发送邮件请求 JavaMailSenderImpl#send

接口:
在这里插入图片描述
实现方法:
在这里插入图片描述

#2、JavaMailSenderImpl#doSend

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

#3、SMTPTransport#sendMessage

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

#4、MimeMessage#writeTo

在这里插入图片描述

#5、MimeBodyPart#writeTo

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

#6、DataHandler#writeTo

在这里插入图片描述

#7、ObjectDataContentHandler#writeTo

在这里插入图片描述

#8、text_plain#writeTo

在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
如果想将ruoyi-vue-plus项目中的文件上传至本地,可以按照以下步骤进行操作: 1. 首先,确保你已经成功搭建并运行了ruoyi-vue-plus项目,保证项目正常运行。 2. 在ruoyi-vue-plus项目的前端代码中,找到与文件上传相关的功能模块。通常,文件上传的代码会位于项目的"src/views"目录或者相关子目录中。 3. 打开相关文件,找到文件上传的逻辑代码。一般来说,文件上传功能会使用到Vue的组件和相关的API。你可以通过搜索关键词如"文件上传"、"upload"等来快速定位到相关代码。 4. 配置上传的目标路径。一般情况下,上传的文件会被保存在服务器的某个目录下。你需要查阅ruoyi-vue-plus项目的相关文档或代码,找到文件上传的目标路径配置项,一般是在项目的配置文件中。 5. 修改目标路径为本地路径。将目标路径的配置项修改为你想要保存文件的本地路径。确保该路径是本地文件系统中存在的,并且具备操作权限。 6. 保存修改并重新编译运行ruoyi-vue-plus项目。确保项目启动成功。 7. 现在,当你进行文件上传操作时,文件将会被上传至你所配置的本地路径中。 请注意,将文件上传至本地需要确保你的本地环境拥有足够的存储空间和相关权限。另外,该操作可能会导致项目的其他功能无法正常运行,请谨慎操作,并备份好原先的项目文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichelleChung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值