SpringBoot 配合126邮箱实现邮件发送功能

news2024/12/24 2:30:06

126邮箱邮件发送

    • 授权码申请
    • pom依赖
    • 邮件配置
    • 代码编写
      • Bean与配置自动装载
      • 原始手工方式发送邮件
      • 发送纯文本的邮件
      • 发送包含HTML标签的邮件
      • 发送包含附件的邮件
      • 发送包含静态资源的文件
    • 测试

SpringBoot 提供了系统级别邮箱服务,只需要导入一个邮箱启动器然后进行配置就可以使用邮件发送
的功能了,简直太方便了。
实现功能期间也踩了一些坑,为了方便后来者快速接入,特意记录下来供有需要的人进行参考。

授权码申请

开启POP3/SMTP,然后按照步骤获取授权码
在这里插入图片描述

pom依赖

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

邮件配置

## 126邮箱配置
# 指定默认MimeMessage的编码,默认为: UTF-8
spring.mail.default-encoding=UTF-8
spring.mail.host=smtp.126.com
spring.mail.username=你的126邮箱地址
## 指定SMTP server登陆授权码
spring.mail.password=授权码
# 指定SMTP server使用的协议,默认为: smtp
spring.mail.protocol=smtp
spring.mail.port=465
# 下面的四项是必须配置的,否则会因为验证不通过而无法连接上邮件服务器, 这里一定要注意是ssl不是其它的认证方式
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.ssl.required=true
spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
# 表示开启debug模式,邮件发送过程的日志会在控制台打印出来,方便排查问题
spring.mail.properties.mail.debug=true
# 指定是否在启动时测试邮件服务器连接,默认为false
spring.mail.test-connection=false

# 邮件接收者
#spring.mail.to.user=panyongjie@hfitech.com
spring.mail.to.user=771006587@qq.com

代码编写

首先先对全局配置加载,后面会用到这些全局配置

Bean与配置自动装载

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

/**
 * 邮箱测试
 *
 * @author panyongjie
 * @date 2022/12/28
 */
@SpringBootTest
public class MallTest {
        /**
     * 自动注入的Bean
     */
    @Autowired
    private JavaMailSender mailSender;

    /**
     * 读取配置文件中的邮件发送者
     */
    @Value("${spring.mail.username}")
    private String from;

    /**
     * 读取配置文件中的邮件接收者
     */
    @Value("${spring.mail.to.user}")
    private String toUser;
    
    private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

原始手工方式发送邮件

这里提供一个手动的硬编码的方式发送邮件的代码示例是为了更好的理解自动读取配置发送邮件所需要的流程

/**
 * 通过手动配置邮件信息,发送邮件
 * */
@Test
public void sendEmailByManualConfig() throws MessagingException {
    String from = "你的126邮箱地址";
    String toUser = "771006587@qq.com";

    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    // 邮箱服务器
    mailSender.setHost("smtp.126.com");
    // 端口号
    mailSender.setPort(465);   // 25 465 994
    // 发送邮件的邮箱地址
    mailSender.setUsername(from);
    // 这里要用登录授权码,不是你登录邮箱的密码
    mailSender.setPassword("登录授权码");

    // 设置属性, 下面各项缺一不可
    Properties pro = System.getProperties();
    // 打开调试开关
    pro.put("mail.debug", "true");
    pro.put("mail.smtp.auth", "true");
    pro.put("mail.smtp.ssl.enable", "true");
    pro.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    mailSender.setJavaMailProperties(pro);

    // 默认编码方式
    mailSender.setDefaultEncoding("utf-8");
    // 协议类型
    mailSender.setProtocol("smtp");
    // 测试gong
    mailSender.testConnection();

    MimeMessage message = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from); // 发送人
        helper.setTo(toUser); // 收件人
        helper.setSubject("使用JavaMailSenderImpl和MimeMessageHelper发送邮件"); // 标题
        helper.setText("这是我用Springboot自带的mail启动器给你发送的邮件,当前时间是: " + simpleDateFormat.format(new Date())); // 内容
        mailSender.send(message);
        System.out.println("邮件发送完毕!!!");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

发送纯文本的邮件

/**
 * 读取配置文件,自动转载邮件发送Bean,然后发送纯文本的邮件
 * */
@Test
public void sendSimpleMail()  {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom(from);
    message.setTo(toUser);
    message.setSubject("使用JavaMailSender和SimpleMailMessage发送邮件");
    message.setText("这是我用Springboot自带的mail启动器给你发送的邮件,当前时间是: " + simpleDateFormat.format(new Date())); // 内容
    mailSender.send(message);
}

发送包含HTML标签的邮件

/**
 * 发送包含HTML标签的邮件
 * */
@Test
public void sendHtmlMessage() {
    MimeMessage message;
    message = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 创建邮件发送者地址
        helper.setFrom(new InternetAddress(MimeUtility.encodeText("发送者") + "<" + from + ">"));
        // 创建邮件发送者地址
        helper.setTo(new InternetAddress(MimeUtility.encodeText("接收方") + "<" + toUser + ">"));
        //标题
        helper.setSubject("这是一份内容包含HTML标签的网页");
        String content = "<h1>中奖通知</h1>" +
                "<p style='color:red;'>恭喜你获得大乐透三等奖,点击此处<a>https://www.baidu.com<a>进行领奖</p>";
        //第二个参数指定发送的是HTML格式
        helper.setText(content, true);
    } catch (MessagingException | UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    mailSender.send(message);
}

发送包含附件的邮件

/**
* 发送包含附件的邮件
* */
@Test
public void sendAttachmentsMail() {
   MimeMessage message = null;
   try {
       message = mailSender.createMimeMessage();
       MimeMessageHelper helper = new MimeMessageHelper(message, true);
       // 创建邮件发送者地址
       helper.setFrom(new InternetAddress(MimeUtility.encodeText("发送者") + "<" + from + ">"));
       // 创建邮件发送者地址
       helper.setTo(new InternetAddress(MimeUtility.encodeText("接收方") + "<" + toUser + ">"));
       helper.setSubject("报销申请-报销明细在附件里");
       String content = "<h1>报销单</h1>" +
               "<p style='color:red;'>报销详情请下载附件进行查看</p>";
       //第二个参数指定发送的是HTML格式
       helper.setText(content, true);
       //添加附件
       helper.addAttachment("报销费用.png", new FileSystemResource(new File("src/main/resources/static/fee.png")));
   } catch (Exception e) {
       e.printStackTrace();
   }
   mailSender.send(message);
}

发送包含静态资源的文件

/**
 * 发送包含静态资源的文件
 *  静态资源可以包含在HTML标签中进行展示,不用和附件一样需要下载或者预览才能看到内容
 * */
@Test
public void sendInlineMail() {
    MimeMessage message = null;
    try {
        message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 创建邮件发送者地址
        helper.setFrom(new InternetAddress(MimeUtility.encodeText("发送者") + "<" + from + ">"));
        // 创建邮件发送者地址
        helper.setTo(new InternetAddress(MimeUtility.encodeText("接收方") + "<" + toUser + ">"));
        helper.setSubject("邮件里包含静态资源,请注意查收");
        //第二个参数指定发送的是HTML格式
        helper.setText("<html><body>带静态资源的邮件内容 图片:<img src='cid:fee'/></body></html>", true);

        FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/fee.png"));
        helper.addInline("fee", file);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mailSender.send(message);
}

测试

每一个测试用例都运行一遍,再去查看邮箱,可以看到各种样式的邮件都发送成功了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW如何减少下一代测试系统中的硬件过时6

LabVIEW如何减少下一代测试系统中的硬件过时6 HAL Benefits When addressing obsolescence, HALs yield the benefits of lowermigration costs, faster migration time, higher code reuse, and easiermaintainability. Lower Migration Costs The act of designing a use…

如何pdf合并成一个?推荐3种方法

在企业处理多份合同文件或者财务报销时&#xff0c;经常会处理大量的PDF文件。因此为了更高效率办公&#xff0c;我们经常需要将多个pdf合并成一个。如何pdf合并成一个呢&#xff1f;给大家推荐3个方法。 1、Smallpdf工具 如何pdf合并成一个&#xff1f;推荐大家可以使用Small…

一篇canvas带你画出整个特效世界

目录 一&#xff0c;canvas是啥&#xff1f; 1.初识canvas 2.路径绘制 3.拆分画法 4.清除画布 5.绘制圆形笑脸 6.贝塞尔曲线 ①二次贝塞尔曲线 ②三次贝塞尔曲线 一&#xff0c;canvas是啥&#xff1f; Canvas是HTML5中新出的一个元素&#xff0c;我们可以在上面绘制…

为什么redis中提供hash数据类型?

目录 1.什么是哈希表&#xff1f;缺点是什么&#xff1f; 2.Redis的数据类型&#xff08;type、encoding&#xff09; 3.比较常用命令、使用场景、实现方式 1.什么是哈希表&#xff1f;缺点是什么&#xff1f; 把关键字key映射到表中记录的地址。映射关系是散列函数&#x…

图表控件LightningChart.NET 入门教程(六):许可证管理介绍(上)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

初学Java web(十)Filter 和 Listener

Filter和Listener 一.Filter 概念&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控…

Nuttx学习入门

Nuttx学习 NuttX 是一个实时操作系统 (RTOS)&#xff0c;强调标准合规性和占用空间小。可从 8 位扩展到 64 位微控制器环境&#xff0c;NuttX 中的主要管理标准是 POSIX 和 ANSI 标准。 NuttX 的主要环境依赖性是 (1) GNU make&#xff0c;(2) bash 脚本&#xff0c;和 (3) L…

第三十四章 数论——高斯消元解线性方程组

第三十四章 数论——高斯消元解线性方程组一、高斯消元1、线性方程组2、高斯消元步骤&#xff08;1&#xff09;数学知识铺垫增广矩阵和阶梯矩阵初等变换&#xff08;2&#xff09;高斯消元步骤二、代码模板1、问题&#xff1a;2、代码一、高斯消元 1、线性方程组 我们在小学…

P3884 [JLOI2009]二叉树问题

题目 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为&#xff1a; 深度&#xff1a;44宽度&#xff1a;44结点 8 和 6 之间的距离&#xff1a;88结点 7 和 6 之间的距离&#xff1a;33 其中宽度表示二叉树上同一层最多的结点个数&#xff0c;节点 u, vu,v 之间的距离…

算法工程师需要学习的基础

文章目录应该早点系统地了解算法工程师需要学习的东西的&#xff0c;B站上的up主&#xff1a;梁唐讲的很好&#xff0c;大家可以去看一下&#xff0c;只截了一部分图做一个记录

MySQL5.7 多主一从(多源复制)同步配置

主从复制有如下一些优势&#xff1a; 分担负载&#xff1a;对业务进行读写分离&#xff0c;减轻主库I/O负载&#xff0c;将部分压力分担到从库上&#xff0c;缩短客户查询响应时间。 增加健壮性&#xff1a;在主库出现问题时&#xff0c;可通过多种方案将从库设置为主库&#…

100%全国产龙芯2K1000设计方案

国产工业处理器&#xff0c;龙芯2K1000主板&#xff0c;100%全国产化方案 可实现100%国产元器件方案&#xff0c;国产处理器 信迈2k1000开发板采用龙芯 2k1000处理器&#xff0c;处理器集成 2 个 GS264 处理器核&#xff0c;主频 1GHz&#xff0c;64 位 DDR3 控制器&#xff…

Vue与VueComponent的内置关系

上一节讲到了 Vue.extend 与 VueComponent 的区别&#xff0c;这一节讲一讲 Vue 与 VueComponent的内置关系。 原型与原型链 这里需要用到原型与原型链中的知识点&#xff0c;具体文章链接在这里。js中的原型与原型链 这里只需要理解一个点&#xff0c;那就是构造函数的protot…

【idea2022.3】安装教程2022-12

教程目录教程简介所需环境和版本软件下载执行过程安装激活开始使用前的配置结束语教程简介 换电脑了&#xff0c;又经历了一遍软件和环境的安装&#xff0c;已经安装好了jdk和对应版本的maven&#xff0c;所以接下来该安装idea等软件了 所需环境和版本 系统&#xff1a;win1…

软件测试人员30K的月薪,是个什么段位?

大家可以参照BAT等一线大厂的职级&#xff0c;一般是高级测试工程师和资深测试开发工程师的职位&#xff0c;下面是在字节跳动年薪40W的测试工程师 掌握的技能树主要包含哪个方面&#xff1f; 现在的行情&#xff0c;大家想要拿到30k这个薪资&#xff0c;不妨审视自己&#xf…

跨平台备份工具Duplicati

本文软件得到了网友 冷心 的推荐&#xff1b; 什么是 Duplicati &#xff1f; Duplicati 是一个免费的开源备份客户端&#xff0c;可将加密的、增量的、压缩的备份安全地存储在云存储服务和远程文件服务器上。支持 Amazon S3、IDrive e2、Backblaze (B2)、Box、Dropbox、FTP、G…

【Flask框架】——27 SQLAlchemy高级

1、排序 order_by方法排序&#xff1a;可以指定根据模型中某个属性进行排序&#xff0c;"模型名.属性名.desc()"代表的是降序排序。 # 根据年龄降序 lst session.query(Student).order_by(Student.age.desc()).all() # 根据年龄升序 lst session.query(Student).…

WinNTSetup V5.3.0 Bata5 单文件版

前言 WinNTSetup 是一款Windows系统硬盘安装器&#xff0c;支持从PE和本地安装系统&#xff0c;支持支持NT内核的系统。 WinNTSetup 包括XP、Win7、Win8、Win8.1、Win10等这些系统。直接从硬盘安装系统&#xff0c;不需要光盘。WinNTSetup 还附加一些系统优化功能&#xff0…

Android---简易的底部导航栏

目录 一、activity_main.xml布局 二、给ViewPager2 创建适配器 三、ViewPager2 数据源 四、MainActivity.java类 1、初始化数据源。 2、ViewPager2 页面改变监听 3、BottomNavigationView 的每个 item 点击的监听 这里简单演示实现效果&#xff0c;实现快速开发&#xff…

mmdetection从入门到精通(一)-汇总目录

&#xff11;.简介 MMDetection 是商汤出品的集成了目标检测&#xff0f;实例分割分割&#xff0f;全景分割几个方面顶级模型组合的,模块化的&#xff0c;基于 PyTorch 的目标检测开源工具箱。是深度学习工作者的必备工具&#xff0c;非常有必要深入掌握。 近期汇总一下从入…