springboot发送邮件

很久之前就想写一个总结的,一直没写,今天刚好又碰见了发送邮箱验证码的需求,刚好记录一波

一.核心依赖如下:

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.2.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<!--spring boot web的依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
		
<!-- mail 依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<!--thymeleaf模版依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<!--freemarker模版依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

二.获取QQ邮箱授权码(QQ邮箱-设置-账户-POP3/SMTP服务开启,发送短信即可获取,记得保存好)

三、配置application.yml文件

spring:
  mail:
    host: smtp.qq.com
    username: 发件的邮箱
    password: 发件邮箱的授权码
    properties:
      mail:
        smtp:
          auth: true
          port: 587      
          starttls:
            enable: true
            required: true

这里不指定properties.mail.smtp.port的话在windons下面可以直接发送,但是到我linux上面就没法了,我猜测不写的话可能就会默认到25号端口,但是我linux又没法连上25号端口,只能 连上587,因此我手动指定。

linux上面测试可以连通邮箱服务的命令:

1.sudo yum install telnet

2.telnet smtp.qq.com 25

像我这样25端口一直卡到超时,那肯定没办法连通了。

不过587就很顺畅得连上了。

大家可以自己测试一下,否则java是抓异常得一直等到超时才会抓到,很浪费时间!!

四、EmailService和EmailServiceImpl

public interface EmailService {

    /**
     * 发送模版邮件
     * @param receiverName
     * @param information 模版参数名(html页面)
     */
    void sendTemplateEmail(String receiverName, String code,String information);
}
package com.exam.serviceimpl.common;


import com.exam.conf.EmailConfig;
import com.exam.service.common.EmailService;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.thymeleaf.TemplateEngine;

import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.HashMap;
import java.util.Map;

@Service
public class EmailServiceImpl implements EmailService {

    @Autowired
    private EmailConfig emailConfig;

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private TemplateEngine templateEngine;

    @Autowired
    private FreeMarkerConfigurer markerConfigurer;

    //发送模版邮件
    @Override
    public void sendTemplateEmail(String receiverName,String code, String information) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message,true);
            helper.setFrom(new InternetAddress(emailConfig.getEmailFrom(),"xxxxxxx","UTF-8"));
            helper.setTo(receiverName);
            helper.setSubject("Online Exam");
            //封装模版使用的数据
            Map<String,Object> map = new HashMap<>();
            map.put("code",code);

//            1.FreeMarker
//            1-1 获取FreeMarker模版
            Template markertemplate = markerConfigurer.getConfiguration().getTemplate(information);
//            1-2 将模版内容转为字符串类型并将参数传入
            String markertTtml = FreeMarkerTemplateUtils.processTemplateIntoString(markertemplate, map);
//            1-3 将字符串作为邮件内容
            helper.setText(markertTtml,true);

//            //2.Thymeleaf
//            //2-1 获取Thymeleaf模版
//            Context context = new Context();
//            context.setVariable("username","瑶");
//            //2-2 将模版内容转为字符串类型并将参数传入
//            String thymeleafHtml = templateEngine.process("thymeleafTemplate", context);
//            helper.setText(thymeleafHtml,true);

        }catch (Exception e){
            e.printStackTrace();
        }

        mailSender.send(message);
    }

}
helper.setFrom(new InternetAddress(emailConfig.getEmailFrom(),"xxxxxx","UTF-8"));指定发件人得时候,可以给发件人改成自己想要的字符串,类似于,将xxx替换成自己想要的字符串

五.EmailConfig

package com.exam.conf;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Data
@Component
public class EmailConfig {
    /**
     * 发件人
     */
    @Value("${spring.mail.username}")
    private String emailFrom;
}

六、在resources/templates下新建freemarkerTemplate.htmlthymeleafTemplate.html用来做文件模版。由于我使用的freemarkerTemplate,因此可能存在一定样式,大家可以自行修改。

当前freemarkerTemplate渲染出来得样式是这个样子

freemarkerTemplate.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>freemarkerTemplate</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
            line-height: 1.6;
        }
        .container {
            max-width: 600px;
            margin: 0 auto;
            background-color: #f9f9f9;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        .verification-code {
            display: block;
            font-size: 28px;
            font-weight: bold;
            color: #333;
            background-color: rgba(166, 165, 160, 0.2);
            padding: 8px 12px;
            border-radius: 5px;
            margin-bottom: 10px;
        }
        .thanks {
            font-size: 16px;
            color: #666;
        }
    </style>
</head>
<body>
<div class="container">
    <p>Verification Code:</p>
    <p><span class="verification-code">${code}</span></p>
    <p>Please use this code within <strong>10 minutes</strong>.</p>
    <p class="thanks">Thank you for using our service.</p>
</div>
</body>
</html>
thymeleafTemplate.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>thymeleafTemplate</title>
</head>
<body>
<span th:text="${username}"></span>,你好,感谢您的使用,这是你的激活邮件,请点击下面的链接进行激活。<br>

</body>
</html>

最后就是使用了,很简单

emailService.sendTemplateEmail(email, code, "freemarkerTemplate.html");

注意,"freemarkerTemplate.html"这个就是对应得resources/templates的模板名字

至此,就可以把邮件发送融合入自己需要用的地方了。

参考博客:使用Springboot发送邮件(QQ邮箱)整合笔记_springboot mail qq邮箱发送邮件-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537574.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 全栈体系【四阶】(二十九)

第五章 深度学习 四、TensorFlow 5. 张量及基本运算 5.1 张量的阶与形状 阶&#xff1a;张量的维度&#xff08;数方括号的层数&#xff09; 形状表示方法 0 维&#xff1a;( )1 维&#xff1a;(5)&#xff0c;1 行 5 个元素2 维&#xff1a;(2,3)&#xff0c;2 行 3 列3…

redis数据类型介绍

Redis是一种开源的高性能内存数据存储系统&#xff0c;支持多种数据结构的操作。下面是Redis支持的五种数据类型介绍&#xff1a; 1. 字符串&#xff08;string&#xff09;&#xff1a;Redis中字符串是二进制安全的&#xff0c;允许存储任何格式的数据&#xff0c;如图片、视频…

Springboot集成RabbitMq+延时队列

1. 引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml 2.1 配置生产者yml spring:rabbitmq:host: localhostport: 5672virtual-host: …

UE 模型学习

1. UE中任何模型都是有多个三角面构成的&#xff0c;模型有一个顶点数组&#xff0c;根据右手螺旋定则和三个顶点顺序确定三角面的法线。 注&#xff1a;当三角面的法线方向与相机法线方向相同时&#xff0c;此时看不见三角面&#xff1b;当两法线方向相反&#xff0c;此时才能…

数据结构DAY5--二叉树相关流程

流程有&#xff1a;创建->遍历->得到信息->销毁 创建 根据先序遍历的流程以及对叶子结点的左后驱结点和右后驱结点以#号替代的原则&#xff0c;写出一个数组&#xff0c;并建立一个结构体&#xff0c;包括数据域&#xff0c;结构体类型的左后驱结点和右后驱结点指针…

数字证书在网络安全中的关键作用与日常应用

在当今数字化的时代&#xff0c;网络安全问题日益凸显&#xff0c;保护数据安全和用户隐私成为了人们关注的焦点。数字证书作为一种重要的网络安全技术&#xff0c;其在网络安全中扮演着关键的角色&#xff0c;并且在我们的日常生活中有着广泛的应用。现在给大家介绍简单介绍下…

blender怎么用GPU渲染?blender GPU云渲染推荐

在三维建模和渲染领域&#xff0c;Blender以其强大的功能和免费开源的特点广受好评。GPU渲染作为提升渲染效率的关键技术&#xff0c;越来越受到用户的关注。本文将详细介绍如何在Blender中设置并利用GPU进行渲染&#xff0c;以及探索其云渲染的可能性&#xff0c;助力用户高效…

装机指导。

everything winrar snipaste cmake git tortoisegit tortoisesvn inno setup vs2022 安装的时候注意sdk路径一定要默认&#xff01;&#xff01; 否则你会发现在你的sdk安装路径的根盘符下会多出一个Windows Kits&#xff0c;强迫症接受不了 默认的会跟已有的装在一起…

无法用raven-js,如何直接使用TraceKit标准化错误字符串(一次有趣的探索)

引子&#xff1a;网上三年前&#xff08;2020&#xff09;的文章介绍了一个raven-js 简单说就是把堆栈信息格式化兼容各浏览器&#xff0c;便于查看错误来源。 **but&#xff1a;**到处找了一下raven-js&#xff0c;已经没有官方出处了&#xff0c;只在Sentry的源码仓库里发现…

林江院长赴长沙见证爱尔眼科巩膜镜技术诊疗门诊启动仪式

近日&#xff0c;爱尔眼科“巩膜镜技术诊疗门诊、视觉康复及训练门诊”启动会在湖南长沙顺利举行。旨在通过成立爱尔眼科巩膜镜技术诊疗门诊、视觉康复及训练门诊&#xff0c;为有需要的疑难屈光不正患者提供全新的诊疗途径&#xff0c;为各年龄阶段人群视觉问题提供更全面的个…

[数据结构初阶]二叉树

我们在前两篇博客中主要介绍了堆及其应用&#xff0c;针对的对象堆是完全二叉树&#xff0c;存储方式采用顺序结构存储的方式。 那么好的&#xff0c;这篇博客我们浅谈二叉树的链式存储&#xff0c;针对的对象是二叉树&#xff0c;并不局限于完全二叉树了&#xff01; 我们先来…

PlayerSettings.WebGL.emscriptenArgs设置无效的问题

1&#xff09;PlayerSettings.WebGL.emscriptenArgs设置无效的问题 2&#xff09;多个小资源包合并为大资源包的疑问 3&#xff09;AssetBundle在移动设备上丢失 4&#xff09;Unity云渲染插件RenderStreaming&#xff0c;如何实现多用户分别有独立的操作 这是第381篇UWA技术知…

MySOL之旅--------MySQL数据库基础( 3 )

本篇碎碎念:要相信啊,胜利就在前方,要是因为一点小事就停滞不前,可能你也不适合获取胜利,成功的路上会伴有泥石,但是走到最后,你会发现身上的泥泞皆是荣耀的勋章! 今日份励志文案: 凡是发生皆有利于我 目录 查询(select) 1.全列查询 2.指定列查询 3.查询字段为表达式 ​编…

PVE系统的安装

一.PVE系统的安装 前置准备环境:windows电脑已安装Oracle VM VirtualBox,电脑支持虚拟化,且已经开启,按住ctrl+shift+ESC打开任务管理器查看是否开启,如果被禁用,可进入BIOS开启虚拟化,重启电脑后再进行后续操作。本步骤选用windows10安装VirtualBox,版本为7.0.8。 …

被拒绝的职场空窗期,到底该怎么办?

打工人的心头刺 最近&#xff0c;一则新闻在网上炸开了锅&#xff1a;一位求职者因职场空窗期超过三个月&#xff0c;竟被无情拒绝应聘。消息一出&#xff0c;瞬间引起了广大职场人的共鸣。在这个快节奏的时代&#xff0c;我们似乎被一种无形的力量推着&#xff0c;不敢休息&am…

高性能代码如何编写?

引言&#xff1a; 性能优化一直是一个至关重要的议题。随着应用程序规模的不断增长和用户对性能的不断提升的要求&#xff0c;开发人员需要更加关注如何编写高性能的代码&#xff0c;以确保应用程序能够在各种情况下都能保持稳定和高效。编写高性能代码需要从多个方面入手&…

编译Nginx配置QUIC/HTTP3.0

1. 安装BoringSSL sudo apt update sudo apt install -y build-essential ca-certificates zlib1g-dev libpcre3 \ libpcre3-dev tar unzip libssl-dev wget curl git cmake ninja-build mercurial \ libunwind-dev pkg-configgit clone --depth1 https://github.com/google/b…

耐受强酸碱PFA试剂瓶高纯实验级进口聚四氟乙烯材质取样瓶

PFA取样瓶作为实验室中常备器皿耗材之一&#xff0c;主要用来盛放、储存和运输样品&#xff0c;根据使用条件不同&#xff0c;也可叫特氟龙试剂瓶、样品瓶、储样瓶、广口瓶、进样瓶等。广泛应用于半导体、新材料、多晶硅、硅材、微电子等行业。近年来随着新兴行业的快速发展&am…

软考 — 系统架构设计师 - 嵌入式真题

问题1&#xff1a; 可靠度表示系统在规定条件下&#xff0c;规定的时间内不发生失效的概率。 失效率表示系统运行到此时从未出现失效的情况下&#xff0c;单位时间内系统出现失效的概率 问题 2&#xff1a; 动态冗余又称为主动冗余&#xff0c;通过故障检测&#xff0c;故障定…

麒麟系统(kylin)安装ssh后,无法上传文件

1.赋予文件夹权限 chmod 777 filename 2.修改ssh配置文件 vi /etc/ssh/sshd_config 将Subsystem sftp /xxxxx 改为Subsystem sftp internal-sftp 重启服务 sudo service sshd restart 断开ssh连接&#xff0c;重新连接&#xff0c;即可正常上传文件