Springboot中使用mail邮件

news2024/11/24 17:07:09

Springboot中使用mail邮件发送

    • 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务
    • 2、导入依赖和一些默认#配置新的
    • 3、发送邮件
    • 4、整合工具类

1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务

这里使用的是QQ邮箱,进入设置-账户,开启下服务。

在这里插入图片描述

开启后获取授权码,保存自己客户端授权码。

2、导入依赖和一些默认#配置新的

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

注意,password不是邮箱的密码,而是授权码。

spring.mail.host=smtp.qq.com
spring.mail.port=587
spring.mail.username=xxxxx@qq.com
spring.mail.password=xxxxxxxxxxx

以上配置好了,我们可以写一些demo。

3、发送邮件

  • 简单消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailTest {

    @Autowired
    private JavaMailSender mailSender;
    @Test
    public void sendMail(){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("xxxxxxxx@qq.com");
        message.setTo("xxxxxxxx@qq.com");
        message.setSubject("主题");
        message.setText("文本内容");
        mailSender.send(message);
    }
}
  • 复杂消息

对于复杂消息,我们可以编辑html消息模板,以及实现动态解析的功能。另外还能够携带多附件。

public void sendComplexMsg() throws MessagingException {

        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //多文件上传
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom("xxxxxxxx@qq.com");
        helper.setTo("xxxxxxxx@qq.com");
        helper.setSubject("面试通知");
        //发送html格式
        helper.setText(parse(getMod(),getParams()),true);

        helper.addAttachment("xxxx公司简章.txt", new File("附件.txt"));
        helper.addAttachment("xxxx公司入职须知.txt", new File("附件.txt"));
        mailSender.send(mimeMessage);

    }

动态解析模板

 private String getMod() {
        return "<div>\n" +
                "&nbsp;&nbsp;尊敬的#{username}先生(女士),欢迎您应聘我公司#{postion}职位,您的学识、经历给我们留下了良好的印象。为了彼此进一步的了解,特邀请你在#{joinTime}参加面试。收到请回复,谢谢!\n" +
                "电话:#{compTel},公司地址:#{compAddr},收到请回复,谢谢!\n" +
                "</div>\n" +
                "<br>\n" +
                "<div style=\"float:right\">\n" +
                "\t<div>#{dept}</div>\n" +
                "\t<div>#{sendTime}</div>\n" +
                "</div>";
    }

    private String parse(String mod, Map<String, String> params) {
        int length = mod.length();
        int left = 0;
        while ((left = mod.indexOf("#")) != -1 && left < length) {
            for (int right = left; right < length; right++) {
                if (mod.charAt(right) == '}') {
                    String key = mod.substring(left + 2, right);
                    mod = mod.substring(0, left) + params.get(key) + mod.substring(right + 1);
                    length = mod.length();
                    left += key.length() + 1;
                    break;
                }
            }
        }
        return mod;
    }
	
	 public Map<String, String> getParams() {
        HashMap<String, String> map = new HashMap<>();
        map.put("username", "xxxx");
        map.put("postion", "Java开发");
        map.put("joinTime", "2023年5月26日下午3:00");
        map.put("compTel", "xxxxxxx");
        map.put("compAddr", "xxxxxx");
        map.put("dept", "xxxxxxxx");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        map.put("sendTime", sdf.format(new Date()));
        return map;
    }

4、整合工具类

对于以上的内容,我们需要来把它整合成一个工具来使用。

/**
 * mail工具类
 */
@Component
public class MailUtil {

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String clientMail;


    /**
     * @param subject  主题
     * @param content  内容
     * @param fileList 文件
     * @param to       接收方
     * @throws MessagingException
     */
    private void sendMail(String subject, String content, List<File> fileList, String to,boolean isHtml) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //是否为多文件上传
        boolean mutipart = !CollectionUtils.isEmpty(fileList);
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, mutipart);
        helper.setFrom(clientMail);
        helper.setTo(to);
        helper.setSubject(subject);
        //发送html格式
        helper.setText(content, isHtml);

        //附件
        for (File file : fileList) {
            helper.addAttachment(file.getName(), file);
        }

        mailSender.send(mimeMessage);

    }

    /**
     * 发送Html邮件
     * @param subject
     * @param mod
     * @param params
     * @param to
     * @param fileList
     * @throws MessagingException
     */
    public void sendHtmlMsg(String subject, String mod, Map<String, String> params, String to, List<File> fileList) throws MessagingException {
        sendMail(subject, parse(mod, params), fileList, to,true);
    }

    /**
     * 发送简单消息邮件
     * @param subject
     * @param msg
     * @param to
     * @param fileList
     * @throws MessagingException
     */

    public void sendSimpleMsg(String subject, String msg, String to, List<File> fileList) throws MessagingException {
        sendMail(subject,msg,fileList,to,false);
    }

    private String parse(String mod, Map<String, String> params) {
        int length = mod.length();
        int left = 0;
        while ((left = mod.indexOf("#")) != -1 && left < length) {
            for (int right = left; right < length; right++) {
                if (mod.charAt(right) == '}') {
                    String key = mod.substring(left + 2, right);
                    mod = mod.substring(0, left) + params.get(key) + mod.substring(right + 1);
                    length = mod.length();
                    left += key.length() + 1;
                    break;
                }
            }
        }
        return mod;
    }

}
  • 编写测试类来测试工具类
  @Test
    public void testMailUtil() throws MessagingException {
        String subject = "面试通知";
        String to = "xxxxxxx@qq.com";
        List<File> fileList = new ArrayList<>();
        fileList.add(new File("附件.txt"));
        fileList.add(new File("附件.txt"));
        mailUtil.sendHtmlMsg(subject,getMod(),getPart

效果图如下

在这里插入图片描述

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

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

相关文章

华秋DFM软件迭代升级,让用户拥有更好的体验

华秋DFM软件在不断改进和升级的过程中&#xff0c;积极收集和了解用户的需求和反馈&#xff0c;不断提高软件的功能实用性和用户体验。在本次软件迭代中&#xff0c;华秋DFM软件针对以下功能点进行了优化和改进&#xff0c;以让操作更加便捷、让用户拥有更好的体验&#xff01;…

365天深度学习打卡 第P9周:YOLOv5的backbone实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 文章目录 一、Backbone模块代码1.1 Conv模块1.2 C3模块Bottleneck模块SPPF模块 二、数据集和相关参数设置2.1 数据集操作2.2 相关参数设置2.3…

chatgpt赋能python:Python修改密码:一种安全可靠、快速高效的方式

Python 修改密码&#xff1a;一种安全可靠、快速高效的方式 在数字化时代&#xff0c;越来越多的信息被存储在计算机系统中&#xff0c;因此密码的保护变得尤为重要。人们需要保证他们的密码是安全可靠的&#xff0c;并定期更换密码。Python作为一种强大而且通用的编程语言&am…

Unity用鼠标拖拽UI,UI跟随鼠标移动

Unity用鼠标拖拽UI&#xff0c;UI跟随鼠标移动 效果一、原理二、源码总结&#x1f4a2;&#x1f4a2;版权声明 效果 先上效果 一、原理 继承几个拖拽的接口 IBeginDragHandler, IDragHandler,IEndDragHandler 计算下偏移量&#xff0c;转换下坐标系 限制下可拖拽的范围&…

Tensorflow2基础代码实战系列之时间序列预测任务

深度学习框架Tensorflow2系列 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark …

实时时钟 RTC

概述 实时时钟(RTC) 模块可长时间维持精确计时&#xff0c;为系统提供实时时钟和日历。该模块功耗极低&#xff0c;最大程度延长电池寿命。 RTC的主要特点&#xff1a; ⚫ BCD 时间 格式 &#xff0c;完整万年历 ⚫ 支持数字调校&#xff0c; 最高 精度可达 0. 06 ppm ⚫ 可输出…

作为996社畜,如何自学Python?一文讲清楚

作为996社畜&#xff0c;应该如何自学Python&#xff1f;今天就给大家分享一下&#xff0c;工作之余&#xff0c;应该如何学习Python&#xff1f; 1. 明确目标 对于零基础的学员而言&#xff0c;要明确你学习Python仅仅是为了满足好奇心&#xff1f;还是有工作需要&#xff0c…

如何使用ArcGIS制作气温空间分布图

本文使用ArcMap10.2&#xff0c;以湖北省为例&#xff0c;通过空间插值&#xff0c;制作湖北省1981-2010年20年平均气温空间分布图 树谷资料库资源大全 1 数据准备 可在中国气象数据网下载湖北省1981-2010共20年的各区站累年平均气温数据和各区站经纬度数据。打开为txt格式 在…

【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)

【学习难度&#xff1a;★★★★☆&#xff0c;使用频率&#xff1a;★★★★★】 3.1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品&#xff0c;每一个具体工厂对应一种具体产品&#xff0c;工厂方法也具有唯一性&#xff0c;一般情况下&#xff0c;一个具体工厂中…

【计算机网络】网络基础(一)

首先声明&#xff1a;这是开发中用到的网络的知识点&#xff0c;侧重点在于编程实践&#xff0c;不重视概念。网络基础不在于细节&#xff0c;在于构建宏观的结构。后面重点在于网络套接字编程&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录 1.背景知识 …

经典文献阅读之--ERASOR(栅格占用过滤动态障碍物)

0. 简介 之前作者在《激光雷达动态障碍物滤除-调研与展望》以及《3D帧间匹配-----剔除动态障碍物》中提到了如何通过各种方法来完成动态障碍物的滤波。而本文也将围绕着如何完成动态障碍物滤波来展开&#xff0c;来介绍《ERASOR: Egocentric Ratio of Pseudo Occupancy-based …

CentOS系统如何开展爬虫工作

CentOS 系统可以用于进行爬虫工作。实际上&#xff0c;很多大型网站和在线服务都运行在 Linux 系统下&#xff0c;包括 CentOS、Ubuntu、Debian 等&#xff0c;因此 CentOS 系统也常用于进行爬虫工作。 在CentOS系统上开展爬虫工作&#xff0c;可以按照以下步骤进行&#xff1a…

CESSCN安全设计与集成一级-中国通信企业协会通信网络安全服务能力评定证书

通信网络安全设计与集成服务能力评定是依据《通信网络安全防护管理办法》、《电信网与互联网第三方安全服务评定准则》YD/T2669-2013、以及《通信网络安全服务能力评定管理办法》的具体要求&#xff0c;对通信网络安全服务单位的技术能力、服务能力、质量保证能力、人员构成与素…

智能路由器开发之OpenWrt简介

智能路由器开发之OpenWrt简介 1. 引言 1.1 智能路由器的重要性和应用场景 智能路由器作为网络通信的核心设备&#xff0c;具有重要的地位和广泛的应用场景。传统的路由器主要提供基本的网络连接功能&#xff0c;但随着智能家居、物联网和大数据应用的快速发展&#xff0c;对于…

池州控股集团财务共享项目启动啦!

近日&#xff0c;由用友网络承建的池州市投资控股集团有限公司财务共享项目启动会成功举办&#xff0c;也标志着池州控股集团财务共享项目正式启动&#xff01;池州控股集团总经理刘俊、用友国资事业部总经理汪发清及其他相关专家和项目组主要成员参加了此次启动会。 池州投控集…

100种思维模型之全局观思维模型-67

全局观思维模型&#xff0c;一个教我们由点到线&#xff0c;由线到面&#xff0c;再由面到体&#xff0c;不断的放大格局去思考问题的思维模型。 01、何谓全局观思维模型 一、全局观思维 什么叫全局观&#xff1f; 世界上的所有东西&#xff0c;都是被规律作用者的&#xff0c…

Linux网络基础-5

在上一篇博客中我们对网络层的典型协议--IP进行了介绍&#xff0c;那么本篇博客作为网络方面的最后一片博客&#xff0c;我们对网络中最后内容--链路层协议进行讲解。 目录 1.链路层协议 1.1MAC地址 1.1.1类型 1.1.2作用 1.2以太网协议 1.2.1协议格式 1.2.2ARP协议 1.…

现场直击 | 沈阳新技术交流会,实景三维再“出圈”

5月19日&#xff0c;由中国测绘学会、中国地理信息产业协会指导&#xff0c;辽宁省测绘地理信息学会、辽宁省土地学会地理信息专业委员会主办&#xff0c;武汉大势智慧科技有限公司、沈阳市勘察测绘研究院有限公司承办的“全自主、全流程、全覆盖”2023实景三维新技术交流会沈阳…

QT桌面项目(日历程序)

文章目录 前言一、QCalendarWidget介绍二、日历代码实现总结 前言 本篇文章继续为大家讲解QT桌面项目&#xff0c;那么这篇文章我们将实现一个日历程序。在QT中要想实现一个简单的日历程序是非常简单的&#xff0c;使用QT中自带的QCalendarWidget类即可实现。 一、QCalendarW…

LAMP的部署(天光渐暗,暮色里遗漏了一丝蓝,星辰便从中亮起。)

一、LAMP架构概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP&#…