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

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

文章目录
    • 前言
    • 参考目录
    • 集成流程
      • 1、Maven
      • 2、yaml 配置文件
      • 3、邮件属性 MailProperties
      • 4、邮件配置 MailConfig
      • 5、简单邮件发送测试
      • 6、复杂邮件发送
    • 底层调用流程
      • ##、流程简图
      • #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`

前言

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

参考目录
  • 发送Email - 廖雪峰的官方网站
    有关于发送邮件的过程说明和集成用法说明,通俗易懂。
  • Spring 官方文档 - Email
    有详细的 Demo 可以参考。
  • Guide to Spring Email
    本文是参考这里的步骤实现。
集成流程

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

1、Maven

在 common 模块引入:


<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-mailartifactId>
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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/789492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存