【RuoYi

您所在的位置:网站首页 邮箱发送验证码代码 【RuoYi

【RuoYi

2024-07-12 17:01| 来源: 网络整理| 查看: 265

文章目录 前言参考目录集成流程1、Maven2、yaml 配置文件3、邮件属性 MailProperties4、邮件配置 MailConfig5、简单邮件发送测试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 模块引入:

org.springframework.boot spring-boot-starter-mail

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

2、yaml 配置文件

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

spring: # 邮件 mail: # from 要和 username 一致, 否则报错 from: [email protected] # 邮件服务地址 host: smtp.qq.com # 用户名 username: [email protected] # 授权码 (设置 - 账户 - 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

需要注意的点:

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

图片来源: 发送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, [email protected], password= 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: 250 OK RCPT TO: 250 OK DEBUG SMTP: Verified Addresses DEBUG SMTP: [email protected] DATA 354 End data with .. Date: Fri, 29 Apr 2022 11:16:40 +0800 (CST) From: [email protected] To: [email protected] Message-ID: 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

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3