我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Springboot整合实现邮件发送的原理详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Springboot整合实现邮件发送的原理详解

通常在实际项目中,也有其他很多地方会用到邮件发送,比如通过邮件注册账户/找回密码,通过邮件发送订阅信息等等。SpringBoot集成邮件服务非常简单,通过简单的学习即可快速掌握邮件业务类的核心逻辑和企业邮件的日常服务

开发前准备

首先注册发件邮箱并设置客户端授权码,这里以QQ 免费邮箱为例,其他的邮箱的配置也大同小异。

登录 QQ 邮箱,点击设置->账户,开启IMAP/SMTP服务,并生成授权码。

基础知识

电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议。下面我们分别简单介绍几种协议:

  • 什么是SMTP? SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证要求必须提供账号和密码才能登陆服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。
  • 什么是IMAP? IMAP全称为Internet Message Access Protocol(互联网邮件访问协议),IMAP允许从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。
  • 什么是POP3? POP3全称为Post Office Protocol 3(邮局协议),POP3支持客户端远程管理服务器端的邮件。POP3常用于“离线”邮件处理,即允许客户端下载服务器邮件,然后服务器上的邮件将会被删除。目前很多POP3的邮件服务器只提供下载邮件功能,服务器本身并不删除邮件,这种属于改进版的POP3协议。
  • IMAP和POP3协议有什么不同呢? 两者最大的区别在于,IMAP允许双向通信,即在客户端的操作会反馈到服务器上,例如在客户端收取邮件、标记已读等操作,服务器会跟着同步这些操作。而对于POP协议虽然也允许客户端下载服务器邮件,但是在客户端的操作并不会同步到服务器上面的,例如在客户端收取或标记已读邮件,服务器不会同步这些操作。

用户要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。这些邮件服务器就类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

邮件服务器就好像是互联网世界的邮局。按照功能划分,邮件服务器可以划分为两种类型:

SMTP邮件服务器:用户替用户发送邮件和接收外面发送给本地用户的邮件。 POP3/IMAP邮件服务器:用户帮助用户读取SMTP邮件服务器接收进来的邮件。

进阶知识

  • 什么是JavaMailSenderJavaMailSenderImplJavaMailSenderJavaMailSenderImpl 是Spring官方提供的集成邮件服务的接口和实现类,以简单高效的设计著称,目前是Java后端发送邮件和集成邮件服务的主流工具。
  • 如何通过JavaMailSenderImpl发送邮件? 非常简单,直接在业务类注入JavaMailSenderImpl并调用send方法发送邮件。其中简单邮件可以通过SimpleMailMessage来发送邮件,而复杂的邮件(例如添加附件)可以借助MimeMessageHelper来构建MimeMessage发送邮件。例如:

@Autowired
    private JavaMailSenderImpl mailSender;
    @Override
    public void sendInlineAndAttachMail(String to, String subject, String content,  String filePath,String                       rscPath, String rscId) {
        logger.info("发送带图片邮件开始:{},{},{},{},{}", to, subject, content, rscPath, rscId);
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper;
        try {
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = file.getFilename();
            helper.addAttachment(fileName, file);
            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);//重复使用添加多个图片
            mailSender.send(message);
            logger.info("发送带图片和附件邮件成功");
        } catch (MessagingException e) {
            logger.error("发送带图片和附件邮件失败", e);
        }
    }

为什么JavaMailSenderImpl 能够开箱即用 ? 所谓开箱即用其实就是基于官方内置的自动配置,翻看源码可知晓邮件自动配置类(MailSenderPropertiesConfiguration) 为上下文提供了邮件服务实例(JavaMailSenderImpl)。具体源码如下:


@Configuration
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
class MailSenderPropertiesConfiguration {
    private final MailProperties properties;
    MailSenderPropertiesConfiguration(MailProperties properties) {
        this.properties = properties;
    }
    @Bean
    @ConditionalOnMissingBean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        applyProperties(sender);
        return sender;
    }

其中MailProperties是关于邮件服务器的配置信息,具体源码如下:


@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {
    private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
    private String host;
    private Integer port;
    private String username;
    private String password;
    private String protocol = "smtp";
    private Charset defaultEncoding = DEFAULT_CHARSET;
    private Map<String, String> properties = new HashMap<>();
}

Spring Boot 集成邮件发送主要分为以下三步:

加入依赖

pom.xml依赖spring-boot-starter-mail模块:


<!--javax.mail 邮件发送-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

配置邮件

在配置文件 application.properties 中配置邮件的相关参数,其中指定了邮件的协议、端口以及邮件账户和授权码等。具体内容如下:


#邮件配置
#SMTP服务器地址
spring.mail.host=smtp.qq.com    
#登陆账号
spring.mail.username=2590742958@qq.com
#注意这里不是邮箱密码,而是SMTP授权密码
spring.mail.password=lvlpxkujplqbdh
spring.mail.default-encoding=UTF-8
#开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true
#以下项不用改动
spring.mail.properties.mail.smtp.starttls.enable: true
spring.mail.roperties.mail.smtp.starttls.required: true

编写邮件发送service,contorller类等。


public class MailServiceImpl implements MailService {
    private final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
    //使用@Value注入application.properties中指定的用户名
    @Value("${spring.mail.username}")
    private String from;
​
    @Autowired
    //用于发送文件
    private JavaMailSender mailSender;
     @Override
    public void sendAttachmentMail(String to, String subject, String content, String filePath) {
​
        logger.info("发送带附件邮件开始:{},{},{},{}", to, subject, content, filePath);
        MimeMessage message = mailSender.createMimeMessage();
​
        MimeMessageHelper helper;
        try {
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = file.getFilename();
            helper.addAttachment(fileName, file);//添加附件,可多次调用该方法添加多个附件
            mailSender.send(message);
            logger.info("发送带附件邮件成功");
        } catch (MessagingException e) {
            logger.error("发送带附件邮件失败", e);
        }

在发送邮件的同时,我们可以自定义参数从而生成丰富多彩的邮件,如下


public interface MailService {
    
    void sendSimpleMail(String to, String subject, String content);
    
    void sendHtmlMail(String to, String subject, String content);
    
    void sendAttachmentMail(String to, String subject, String content, String filePath);
    
    void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
    
    void sendInlineAndAttachMail(String to, String subject, String content,String filePath, String              rscPath, String rscId);
}

测试邮件发送

编写控制器层,这里使用的是Thymeleaf模板邮件,是常见的模板邮件,比如说我们注册账户,登录认证所收到的邮件即为模板邮件,特点就是内容不变,只是一些特点信息比如说验证码、认证链接等是动态变化的。在模板页面中,id是动态变化的,需要我们传参设置,其实就是传参后,将页面解析为HTML字符串,作为我们邮件发送的主体内容


@Controller
public class MailContorller {
​
    @Autowired
    private MailService mailService;
    @Autowired
    private TemplateEngine templateEngine;
    @Resource
    private UserService userService;
​
    //这一步是获取application.properties中设置的发件人邮箱地址
    @Value("${spring.mail.username}")
    private String Email;
​
    @RequestMapping("/sendTemplate")
    
    public String sendTemplate(@RequestParam("Email") String Email, Model model) {
        //具体的业务
        User usermail= userService.retrieve(Email);
        System.out.println(usermail);
        if (usermail !=null){
            //向Thymeleaf模板传值,并解析成字符串
            //通过Context构造模版中变量需要的值
            Context context = new Context();
            context.setVariable("id", "001");
            String emailContent = templateEngine.process("emailTemplate", context);
            mailService.sendHtmlMail(Email,"密码找回验证", emailContent);
            return "Login";
        }
        else if(StringUtils.isEmpty(Email)){
            model.addAttribute("yuoxiang","邮箱信息不能为空");
            return "Login";
        }
        else {
            model.addAttribute("yuoxiang","邮箱错误或者与绑定账号不一致");
            return "Login";
        }
    }

然后我们需要在template文件夹下创建emailTemplate.html,设计我们需求的模板样式


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>密码验证</title>
</head>
<body>
<span style="color:#5ed02b;font-weight:600;font-size: 18px">您好,欢迎您的查看,这是一封验证邮件,请根据下面系统找回的密码完成登录,感谢您的支持!</span><br>
</body>
</html>

调用发送复杂邮件方法后,根据获取动态输入的邮箱地址,成功后就可以在 QQ 邮箱中收到邮件:

总结:Springboot整合邮件发送的原理和实现

以上就是Springboot整合实现邮件发送的原理详解的详细内容,更多关于Springboot邮件发送的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Springboot整合实现邮件发送的原理详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot整合Javamail实现邮件发送的详细过程

日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等,下面这篇文章主要给大家介绍了关于SpringBoot整合Javamail实现邮件发送的详细过程,需要的朋友可以参考下
2022-11-13

JavaMail整合Spring实现邮件发送功能

这篇文章主要为大家详细介绍了JavaMail整合Spring实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

使用SpringBoot发送邮件的方法详解

这篇文章主要介绍了使用SpringBoot发送邮件的方法详解,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2023-05-19

如何使用springboot整合redis实现发送邮箱并验证

这篇文章主要为大家展示了“如何使用springboot整合redis实现发送邮箱并验证”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用springboot整合redis实现发送邮箱并验证”
2023-06-22

SpringBoot实现定时发送邮件的三种方法案例详解

这篇文章主要介绍了SpringBoot三种方法实现定时发送邮件的案例,Spring框架的定时任务调度功能支持配置和注解两种方式Spring Boot在Spring框架的基础上实现了继承,并对其中基于注解方式的定时任务实现了非常好的支持,本文给大家详细讲解,需要的朋友可以参考下
2023-03-06

springboot整合RabbitMQ发送短信的实现方法

这篇文章主要介绍springboot整合RabbitMQ发送短信的实现方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!RabbitMQ安装和运行# 安装rpm -ivh erlang-21.3.8.9-1.el7.
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录