首页 > 数据库 >java操作邮箱 - 邮箱发送验证码 -redis分布式缓存 -redisson分布式缓存

java操作邮箱 - 邮箱发送验证码 -redis分布式缓存 -redisson分布式缓存

时间:2024-11-25 20:24:44浏览次数:7  
标签:缓存 验证码 发送 redisson mail 邮箱 分布式

初次发布于我的个人文档

参考:java操作163邮箱

本文以163邮箱为例,介绍如何用java发送邮箱。

1.获取邮箱授权码

进入163邮箱-设置-POP3/SMTP/IMAP-开启POP3/SMTP服务

记录得到的授权码

2.安装依赖

// https://mvnrepository.com/artifact/jakarta.activation/jakarta.activation-api
implementation("jakarta.activation:jakarta.activation-api:2.1.3")
// https://mvnrepository.com/artifact/org.apache.commons/commons-email
implementation("org.apache.commons:commons-email:1.6.0")

注意,参考文章年代有些久远,有几个库已经合并更新换了新的名字。

3.编写通用邮件发送工具类

package edu.zafu;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
    

    /**
     * 邮件工具类
     *
     * @author ColaBlack
     */
    public class MailUtils {
    
        /**
         * 发送邮件
         *
         * @param targetEmail 目标用户邮箱
         * @param header      邮件的标题
         * @param message     要发送的消息
         */
        public static void sendEmail(String targetEmail, String header, String message) {
            try {
                // 创建邮箱对象
                SimpleEmail mail = new SimpleEmail();
                // 设置发送邮件的服务器,以163邮箱为例
                mail.setHostName("smtp.163.com");
                // 输入发送邮件的邮箱号+授权码
                mail.setAuthentication("用于发送的邮箱号", "授权码");
                // 注意:一个邮箱账号可能有多个邮箱,要注意这个区分。
                // 如QQ邮箱就支持同一个邮箱账号持有@qq.com @foxmail.com两个邮箱
                // 发送邮件 "你的邮箱号"+"发送时用的昵称"
                mail.setFrom("用于发送邮箱的邮箱号", "昵称");
                // 使用SSL安全链接
                mail.setSSLOnConnect(true);
                // 接收用户的邮箱
                mail.addTo(targetEmail);
                // 邮件的主题(标题)
                mail.setSubject(header);
                // 邮件的内容
                mail.setMsg(message);
                // 发送
                mail.send();
            } catch (EmailException e) {
                // 邮件发送失败,记录日志(此处应该换成项目统一的日志记录方式)
                System.out.println("邮件发送失败:" + e.getMessage());
            }
        }
    }

4.调用工具类——以发验证码为例

编写发送验证码工具类

package edu.zafu;

import java.util.Random;

/**
 * 发送验证码工具类
 *
 * @author ColaBlack
 */
public class SendCode {

    /**
     * 发送验证码
     *
     * @param targetEmail 目标邮箱
     */
    public static void send(String targetEmail) {
        // 生成验证码
        int code = new Random().nextInt(899999) + 100000;
        // 发送验证码
        MailUtils.sendEmail(targetEmail, "验证码", "您的验证码为:" + code + "(1分钟内有效)");
    }
}

可以使用如下代码测试

package edu.zafu;

/**
 * 测试邮箱发送
 *
 * @author ColaBlack
 */
public class TestMail {
    public static void main(String[] args) {
        SendCode.send("你的第二个邮箱");
    }
}

5.引入缓存机制

上面的验证码用户可以通过疯狂发送请求而恶意消耗邮箱发送资源,我们也没有让验证码及时过期。

可以引入缓存机制解决,在上文Caffeine本地缓存和缓存雪崩,缓存击穿,缓存穿透中我们介绍了如何利用caffeine实现本地缓存,本文就选择用 Redis 实现分布式缓存。

6.安装Redisson

为了在java中操作redis需要安装依赖

// https://mvnrepository.com/artifact/org.redisson/redisson
implementation("org.redisson:redisson:3.37.0")

7.调整验证码工具类

package edu.zafu;

import org.redisson.Redisson;
import org.redisson.api.RMapCache;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 发送验证码工具类
 *
 * @author ColaBlack
 */
public class SendCode {

    /**
     * 发送验证码
     *
     * @param targetEmail 目标邮箱
     */
    public static void send(String targetEmail) {
        Config config = new Config();
        config.useSingleServer() // 使用单机模式
                // 设置要连接的数据库
                .setDatabase(0)
                // 设置redis服务器地址
                .setAddress("redis://127.0.0.1:6379")
                // 设置redis密码
                .setPassword("password");
        // 创建Redisson客户端
        RedissonClient redisson = Redisson.create(config);
        // 获取缓存的map
        RMapCache<Object, Object> codeCache = redisson.getMapCache("code");
        // 判断目标邮箱是否已存在验证码
        if (codeCache.containsKey(targetEmail)) {
            // 验证码已存在,直接返回
            return;
        }
        // 验证码不存在,生成验证码并存入缓存
        // 生成验证码
        int code = new Random().nextInt(899999) + 100000;
        // 存入缓存,设置1分钟过期
        codeCache.put(targetEmail, code, 1, TimeUnit.MINUTES);
        // 发送验证码
        MailUtils.sendEmail(targetEmail, "验证码", "您的验证码为:" + code + "(1分钟内有效)");
        // 校验验证码是否正确时也从redis中拿去对应邮箱的验证码,这样就能实现验证码的超时过期
    }
}

关于使用缓存机制可能引发的缓存击穿、缓存雪崩、缓存穿透的问题请参考上文Caffeine本地缓存和缓存雪崩,缓存击穿,缓存穿透

标签:缓存,验证码,发送,redisson,mail,邮箱,分布式
From: https://www.cnblogs.com/ColaBlack/p/18548497

相关文章

  • 【数据库开发】银行重要交易系统信创分布式数据库备份系统实施策略如何设计?
    一、银行重要系统数据库备份要素分析1.1数据库备份恢复内容1.2数据库备份恢复策略二、信创分布式数据库备份系统建设难点2.1生态不成熟2.2备份/恢复能力不足2.3备份运维不灵活、人工依赖程度高三、信创分布式数据库备份系统实施策略3.1数......
  • 开源分布式爬虫管理平台:性能强悍!!
    简介基于Golang的分布式爬虫管理平台,支持Python、NodeJS、Go、Java、PHP等多种编程语言以及多种爬虫框架。谁适合使用Crawlab?网路爬虫工程师: 通过集成爬虫程序到Crawlab,网路爬虫工程师可以聚焦于爬虫的核心解析逻辑,从而避免浪费过多时间在开发通用模块上,例如任务......
  • 开源分布式爬虫管理平台:性能强悍!!
    简介基于Golang的分布式爬虫管理平台,支持Python、NodeJS、Go、Java、PHP等多种编程语言以及多种爬虫框架。谁适合使用Crawlab?网路爬虫工程师: 通过集成爬虫程序到Crawlab,网路爬虫工程师可以聚焦于爬虫的核心解析逻辑,从而避免浪费过多时间在开发通用模块上,例如任务......
  • Linux之CPU缓存
    CPU缓存系统中最快的存储是处理器中的寄存器。但寄存器由于造价比较昂贵,提供的空间也非常有限。因此系统中必须使用存储量大但速度慢的主存(内存)。高速缓存的速度都比主存快。主存的访问时间是8纳秒以上,而缓存的访问时间只有几个CPU时钟周期。在标准的X86平台下,一般有L1L2L3......
  • 如何设计好分布式数据库,这个策略很重要(GaussDB)
    ​数据库是应用和计算机的核心组成,试想,如果没有数据库,就像人的大脑没有了记忆一样,信息也得不到共享,那么,对开发者来说,如何设计一款高效易用的数据库至关重要。GaussDB是企业级分布式数据库,具备分布式强一致、有效降低容灾成本、支持PB级海量数据、智能诊断等优点,是当下炙手可热的......
  • 内存与缓存区别
    缓存用途:缓存的主要目的是为了减少对内存或更慢的存储设备的访问次数,将频繁访问的数据暂存起来,以便下次使用时能够更快地获取,从而提升系统的整体性能。内存用途:内存主要用于存储正在运行的程序和数据,为CPU提供快速的数据访问,以保证程序的正常运行。区别解释一内存是计算机......
  • 【完美复现】基于多智能体系统一致性算法的电力系统分布式经济调度策略(Matlab代码实现
    ......
  • [20241123]PLSQL语句代码执行几次会缓存.txt
    [20241123]PLSQL语句代码执行几次会缓存.txt--//测试看看PLSQL语句代码执行几次会缓存。1.环境:SCOTT@book>@ver1PORT_STRING                   VERSION       BANNER-------------------------------------------------------------------------......
  • Go 语言冲锋舟:在高并发与分布式浪潮中破浪前行
    在软件开发的浩瀚海洋中,技术的浪潮不断涌现,而Go语言(或称Golang)无疑是一艘在高并发与分布式系统的浪潮中迅速破浪前行的“冲锋舟”。作为一门由Google开发的编程语言,Go语言自诞生以来,凭借其简洁高效的特性,迅速在处理并发、高性能计算、云原生和分布式系统等领域取得了无......
  • Elasticsearch Enterprise 8.16 (macOS, Linux, Windows) - 分布式搜索和分析引擎
    ElasticsearchEnterprise8.16(macOS,Linux,Windows)-分布式搜索和分析引擎Elasticsearch、Kibana、Beats&Logstash请访问原文链接:https://sysin.org/blog/elastic-8/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgElasticsearchPlatform可观测性、安全......