Java实现发送邮件(定时自动发送邮件)

news2024/12/23 22:59:46

系列文章目录

Redis缓存穿透、击穿、雪崩问题及解决方法
Spring Cache的使用–快速上手篇
分页查询–Java项目实战篇
全局异常处理–Java实战项目篇
该系列文章持续更新,更多的文章请点击我的主页查看哦!


文章目录

目录

系列文章目录

文章目录

前言

一、开通服务

二、配置文件编写

 三、编写工具类

四、实现发送邮件

 五、效果图

六、定时发送邮件

6.1 @Scheduled()注解

6.2 @EnableScheduling注解

总结


前言

   在我们做项目时,有些需求需要通知其他人。比如在手机号获取验证码登录时,会发送短信给该用户去接收验证码从而进行身份确认进行安全登录。但有些时候是需要进行群发消息通知用户的,这个过程肯定不是认为的去发送,所以我们就用java来实现通知用户的邮件发送功能。

   至于为什么要发送QQ邮件通知用户,而不是使用短信等方式?想必对这方面有些了解的就知道短信服务是要开通服务的,就是需要交钱的(这个钱是根据具体发送短信的条数算的),这里对于收钱的我们就不演示了。都这么说了,大家肯定猜到了QQ邮件是免费的!没错啊,你没有听错,真的是免费的。很适合在校大学生在写项目时运用,毕竟白嫖才是最香的嘛!

所以这篇文章就来告诉大家怎么去使用java实现邮件发送和定时发送的功能。看完这篇文章后大家就可以使用java代码给自己的好朋友发送邮件,在好朋友面前展现自己的食力啦!


一、开通服务

在这里第一步需要进入QQ邮箱登录自己的邮箱账号去免费开通服务。没错,这个开通是免费的,大家可以放心开通。

第一步:在登录自己的QQ邮箱后,点击设置------》点击账户。具体操作如下图所示:

 第二步:下滑找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务点击开通,由于我已经开通过了,这里显示已开通的样子。如下图所示:

 注意:这里会给一个秘钥(就是开通后显示的一串英文),记得自己保存起来,在编写java代码时需要用到。

二、配置文件编写

这里我用properties编写,配置的是发送邮件人的信息。

#QQ邮箱邮件发送服务配置(固定写法)
spring.mail.host=smtp.qq.com
spring.mail.port=587

# 配置个人QQ账户和密码(密码是加密后的授权码)
spring.mail.username=这里是开通服务的邮箱号
spring.mail.password=这里是刚才开通服务的秘钥

 三、编写工具类

准备工作做完了,现在就需要我们编写工具类来实现发送了。当然在发送邮件之前别忘了导入spring提供的邮箱服务依赖。

<!-- mail邮件服务启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

导入依赖后就可以编写工具类了,在utils包下编写邮箱工具类。

1.首先要注入JavaMailSenderImpl发送邮件类,需要调用该类的send方法用来发送邮件。

2.发送的信息要封装到SimpleMailMessage()对象中。包括发送者、接受者、内容标题、内容。这四个部分。由于发送是需要秘钥的,所以刚才开通服务的邮件就可以作为发送者。接受者、内容标题、内容都可以作为参数传递过来。

3.这里的mailfrom就是使用@value注解赋值配置文件刚才配置的邮箱号。就是发送的邮箱号。

代码如下:

@Component
public class MailUtils {
    @Autowired
    private JavaMailSenderImpl mailSender;
    @Value("${spring.mail.username}")
    private String mailfrom;

    // 发送简单邮件
    public void sendSimpleEmail(String mailto, String title, String content) {
        //  定制邮件发送内容
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(mailfrom);
        message.setTo(mailto);
        message.setSubject(title);
        message.setText(content);
        // 发送邮件
        mailSender.send(message);
    }
}

四、实现发送邮件

 工具类已经写好了,我们就可以调用该方法传递参数发送邮件了。

@Autowired
    private MailUtils mailUtils;

    // mailto 发送给谁?
    private String mailto="";

    
    @GetMapping("/email")
    public void sendEmail(){
       
            //  定制邮件内容
            StringBuffer content = new StringBuffer();
            content.append("心态还需努力呀~").append("\n");
         

            //三个参数、1.接收者  2.邮件标题  3.发送的内容
            mailUtils.sendSimpleEmail(接收者,邮件标题,发送的内容);

        }

 五、效果图

这里为了展示效果,我就自己给自己发送一个邮件:

 当访问Controller接口时,这里就接收到我自己给自己发送过来的邮件。

六、定时发送邮件

6.1 @Scheduled()注解

定时发送需要在发送的方法上加上@Scheduled()注解

@Scheduled()参数可以是这样的格式:

里面有6个参数:

从左到右用空格隔开分别是:秒 分 时 日 月 周 年(可省略)

第一个位置:Seconds 秒:区间 0-59 秒,代表一分钟内的秒数。

第二个位置:Minutes 分:区间 0-59 分,代表一小时内的分钟数。

第三个位置:Hours 时:区间 0-23 时,代表一天中的小时数。

第四个位置:Day of month 日:区间 1-31 (?根据每月有多少天来),代表一月中的多少号。

第五个位置:Month 月:区间 1-12 ,代表一年中的月份。

第六个位置:Day of week 周:区间 1-7或者英文星期的缩写,代表星期几。

//表示每月二号的十点定时执行下面的方法。所以就可实现定时发送功能。
@Scheduled(cron = "0 0 10 2 * ?")

6.2 @EnableScheduling注解

然后在启动类上加上@EnableScheduling注解

@EnableScheduling  // 开启定时任务注解功能支持


总结

到这里发送邮件的功能的代码实现和操作步骤就都演示完了,赶快去给你的好朋友展示自己的食力去吧。该功能整体没有什么特别难以理解的点。是实现自己的练习项目,大作业不错的一个功能可选。也可作为毕设的一部分。大家赶快练起来吧。

 最后也是写文章快一年了,我的朋友数量也是突破了1万,在这过程中有和我一起走过来的小伙伴,也有在半路就退出的,没有在继续写文章。可能也是由于生活比较的忙碌。大家都是在以不同的方式学习,生活。在这里感谢大家对我的陪伴与支持,以后还会继续分享知识点和大家一起讨论,交流。

 看到这里了,如果这篇文章对你有帮助的话可以给我点个免费的赞在离开哦!

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

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

相关文章

算法训练第五十七天 | 647. 回文子串、516.最长回文子序列、动态规划总结篇

动态规划part17 647. 回文子串题目描述思路暴力解法动态规划双指针法 516.最长回文子序列题目描述思路 动态规划总结篇动划基础背包问题系列打家劫舍系列股票系列子序列系列总结 647. 回文子串 题目链接&#xff1a;647. 回文子串 参考&#xff1a;https://programmercarl.com…

hot100:数组——31、33

31. 下一个排列 思路&#xff1a;其实这道题的意思就是&#xff0c;简单地说&#xff0c;就是找到一个比现有的给出的数组代表的值大的最小的数 比如给出的数组是[1,2,3]&#xff0c;它代表的数值是123&#xff0c;现有的元素组成的数值中&#xff0c;比123大的有很多&#xf…

3.6 n维随机变量

学习目标&#xff1a; 学习n维随机变量需要掌握一定的数学知识&#xff0c;包括多元微积分、线性代数和概率论等。要学习n维随机变量&#xff0c;我会采取以下步骤&#xff1a; 复习相关的数学知识&#xff1a;首先&#xff0c;我会复习多元微积分、线性代数和概率论的基本知…

OpenCV介绍与GUI特征(一)

目录0.1 OpenCV-Python教程简介OpenCVOpenCV-PythonOpenCV-Python教程OpenCV需要你!!!贡献者0.2 在Windows中安装OpenCV-Python目标从预制的二进制文件中安装OpenCV从源代码构建OpenCV练习0.3 在Ubuntu中安装OpenCV-Python目标从预制的二进制文件中安装OpenCV-Python从源码构建…

Revit怎么绘制结构梁?一键生成梁?

绘制结构梁是Revit基础的功能&#xff0c;对于不少刚接触Revit的小伙伴来说似乎还无从下手&#xff0c;今天就让小编来告诉大家在Revit中绘制结构梁的方法。 一、Revit中结构梁图文绘制过程 首先&#xff0c;我们选择“结构”选项卡中的“梁”工具&#xff0c;点击选择梁的类…

android12 displayArea学习

一&#xff1a;数据结构分析 1&#xff1a;android 12 WindowContainer 的类继承关系如下 下图为 WindowContainer 简要的对象图。 下图是 Aosp默认的display层次结构对象图。 Aosp定义的feature有如下 FEATURE_ROOT 0; FEATURE_DEFAULT_TASK_CONTAINER 1; FEATURE_WINDOW_…

DNS服务器 - 理论

DNS服务器1. 概念2. DNS域名结构3. 域名的分级4. 域名服务器5. 域名解析过程5.1 递归查询与迭代查询5.2 解析流程1. 迭代查询2. 递归查询6. 高速缓存&#xff1a;7. 加上主机缓存后的DNS解析流程8. 常见的域名解析记录9. DNS正向解析和反向解析1. 概念 DNS服务器&#xff08;D…

C++指针与其它复合类型

目录 前言&#xff1a; 1.指针与字符串 1.1cout接收char类型的地址的反应 1.2字符串字面值 1.3字符串备份 2.使用new创建动态结构 3.使用new和delete搭配存储键盘输入的字符串 前言&#xff1a; 指针我们已经知道如何使用了&#xff0c;也知道指针和数组配合起来使用&am…

DHCP及中继(UOS)

DHCP服务器 中继器 客户端 服务器 安装DHCP apt install isc-dhcp-server -y 编辑配置文件 vim /etc/dhcp/dhcpd.conf 重启服务 systemctl restart isc-dhcp-server 配置监听网卡 vim /etc/default/isc-dhcp-server 中继器 安装dhcp yum install dhcp -y nmtui 修改…

【LeetCode每日一题: 1042. 不邻接植花 | 图论 | 染色问题】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

Qt中调用C#制作的com组件

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 这里记录一下在 Qt 64位程序中调用 C# 制作的 com 组件的流程&#xff0c;方便后期自己回顾。 1. 了解 TLB 格式 拿到的依赖库最…

hbase进阶操作——读流程与写流程介绍

系列文章目录 centos7虚拟机下hbase的使用案例讲解 文章目录 系列文章目录 一、hbase架构原理 1.1、StoreFile 1.2、MemStore 1.3、WAL 二、hbase的写流程 2.1、写流程的流程图 2.2、写流程的流程图说明 三、hbase读流程 3.1、读流程的流程图 3.2、读流程的流程图解…

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

文章目录2-3 : C语言内存空间的使用指针概述示例&#xff1a;指针修饰符指针运算符示例示例1多级指针例子省略argc&#xff08;个数&#xff09;的常用写法&#xff1a;参考&#xff1a; 麦子学院-嵌入式C语言高级-内存空间2-3 : C语言内存空间的使用 指针概述 内存类型资源地…

CPU工作原理

CPU&#xff08;中央处理器&#xff09;是计算机中的重要组件&#xff0c;它负责执行计算机程序中的指令。在了解CPU的工作原理之前&#xff0c;我们需要先了解一些基本概念。 指令和指令集 指令是计算机程序中的基本单位&#xff0c;它指示计算机执行某个操作。指令集是一组…

我在“Now In Android”中学到的 9 件事

我在“Now In Android”中学到的 9 件事 Now in Android是一款功能齐全的 Android 应用程序&#xff0c;完全使用 Kotlin 和 Jetpack Compose 构建。它遵循 Android 设计和开发最佳实践&#xff0c;旨在为开发人员提供有用的参考。 https://github.com/android/nowinandroid UI…

淘宝悄悄内测“店号一体”的新模式

4月17日消息&#xff0c;淘宝近日已开始小规模测试“店号一体”新模式。新模式下&#xff0c;淘宝店铺将与逛逛、直播等账号完全打通&#xff1b;此前针对达人及内容型商家的新店铺模式“视频内容店”也同步升级。 内测商家透露&#xff0c;目前在淘宝发布的图文、短视频、直播…

腾讯学长分享的这份Java面试八股文手册,让我GitHub下载量破百万!!!

一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 跳槽是为了寻求更好的发展&#xff0c;但在跳槽前我们也不能确定下家就是更好的归宿&#xff0c;这就更加需要我们审慎地去对待&#xff0c;不能盲目跳槽。 其次&a…

知识图谱专栏简介:数据增强,智能标注,文本信息抽取(实体关系事件抽取)、知识融合算法方案、知识推理、模型优化、模型压缩技术等

知识图谱专栏简介&#xff1a;数据增强&#xff0c;智能标注&#xff0c;文本信息抽取&#xff08;实体关系事件抽取&#xff09;、知识融合算法方案、知识推理、模型优化、模型压缩技术等 专栏链接&#xff1a;NLP知识图谱相关技术业务落地方案和码源 NLP知识图谱相关技术业…

程序员跳槽薪水涨了一倍,谈谈java工程师找新工作的八大技巧

大家好&#xff0c;这几天发生了一些事情&#xff0c;我找到了一份新工作&#xff0c;明天是第一天上班。我想先谈一下我的新工作待遇&#xff0c;因为我觉得相对来说还算比较满意。接下来我想谈一下我的个人经历&#xff0c;从毕业到现在的工作经历。第三个话题是我最近半个月…

k-d Tree算法

1.概述 本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术——Kd- Tree(Kd树)。Kd-Tree&#xff0c;即K-dimensional tree&#xff0c;是一种高维索引树形数据结构&#xff0c;常用于在大规模的高维数据空间进行最近邻查找(Nearest Neighbor)和近似最近邻查找(Appro…