当前位置: 首页 > news >正文

[Spring boot] Spring boot 实现发送邮件功能

前言 

  大多数小伙伴在练习与学习的过程中在验证时大都使用或验证码,但是验证码相对而言自己的参与只停留在自己的自己写的点击刷新方法上,那有没有什么方法能让我们的互动不止限于网页呢,那就来学一下如何给自己发送一封邮件吧,这个功能我预想是跟用户绑定的所以设计时会与用户有一定的联系。

成果展示

 

表设计

这里只是为了让我们成功发送邮件所以并不用设计的多么复杂,只需要在用户表中添加两个字段username ,email_address 实体类中是String 表中是varchar.

引入依赖

<!--        邮件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
    </dependencies>

邮箱工具类

/**
 * 描述 工具 检验地址是否合法
 */
public class EmailUtil {
    public static boolean isValidEmailAddress(String email) throws AddressException {
        boolean result = true;
        InternetAddress internetAddress = new InternetAddress(email);
        try {
            internetAddress.validate();
        } catch (AddressException e) {
            e.printStackTrace();
            result = false;
        }
        return  result;
    }
}

这里并不需要自己去写校验方法,直接调用InternetAddress 的validate方法就行。

mapper

用来通过邮箱查询用户,看是否已被占用

User selectOneByEmailAddress(String emailAddress);

Xml

  <select id="selectOneByEmailAddress" parameterType="java.lang.String" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from xatu_mall_user
    where email_address = #{email_address,jdbcType=VARCHAR}
    limit 1
  </select>

Service

userService

boolean checkEmailRegistered(String emailAddress);

impl

 @Override
    public boolean checkEmailRegistered(String emailAddress) {
        User user = userMapper.selectOneByEmailAddress(emailAddress);
        if (user != null) {
            return false;
        }
        return true;
    }

EmailService

public interface EmailService {

    void sendSimpleMessage(String to, String subject, String text);


}

Impl

/**
 * 描述:     EmailService实现类
 */
@Service
public class EmailServiceImpl implements EmailService {

    @Autowired
    private JavaMailSender mailSender;

    @Override
    public void sendSimpleMessage(String to, String subject, String text) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(Constant.EMAIL_FROM);
        simpleMailMessage.setTo(to);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(text);
        mailSender.send(simpleMailMessage);
    }


}

 我把常用值写在Constant里了,这里直接填用来发送的邮箱就行,要确保能自己能登陆这个邮箱,后面要去获取一个码。

Controller

 @PostMapping("/sendEmail")
    @ResponseBody
    public ApiRestResponse sendEmail(@RequestParam("emailAddress") String emailAddress)
            throws XatuMallException, AddressException {
        //检查邮件地址是否有效,检查是否已注册
        boolean validEmailAddress = EmailUtil.isValidEmailAddress(emailAddress);
        if(validEmailAddress) {
            boolean emailPased = userService.checkEmailRegistered(emailAddress);
            if (!emailPased) {
                return ApiRestResponse.error(100018, "邮箱已注册");
            } else{
                //发送邮件
                emailService.sendSimpleMessage(emailAddress,"主题是测试","Helllo this is a E-mail");
                return ApiRestResponse.success();
            }
        }else{
            return ApiRestResponse.error(100020,"非法邮箱");
        }

    }

写完后要去进行配置

application.properties

spring.mail.host=smtp.qq.com
spring.mail.port=587
spring.mail.username=1228625399@qq.com
spring.mail.password=*****************
spring.mail.default-encoding=utf-8
spring.mail.properties.mail.smtp.auth=true

这里我使用的是qq邮箱,但是听说他这个垃圾邮件判定等级自己不好改有的是用阿里云邮箱

只用注意两个点 username 写自己的邮箱地址

获取授权码

下一个password不是邮箱密码哈,下面说怎么获取这个授权码

 进去登录好了以后点击账户,找到下面这个区域

 注意我们打开前两个 然后扫码获取那个授权码,把它复制下来添加到配置文件的password栏。

总结

 这个技术是很简单的,但是用好它相比于普通的在网页上加验证码我们先声明一个数组,调用函数去把数组打乱去去每次获取验证码,把验证码存起来作为text发送到用户邮箱用来注册,这个方法相比点击验证码就更加有趣了。当然也能用于其他更多的方面~

 

 

相关文章:

  • 万字指针超详细总结
  • 列表页常见 hook 封装
  • 集合_HashSet(HashMap)扩容机制源码简析
  • Spring注解@Qualifier的详细用法你知道几种「扩展点实战系列」- 第444篇
  • uni-app 微信小程序中关于 map 地图使用案例分享
  • 工业级成熟航运港口人工智能产品全球前三船公司及港口码头落地,中国上海人工智能独角兽中集飞瞳全球应用最广规模最大最先进港航AI企业
  • CSS基础篇---02选择器进阶、背景样式、显示模式
  • 【C语言】自定义类型 —— 结构体
  • 千万级用户ms级抽奖N名设计方案
  • 2022第五空间WEBMISC
  • 说几句得罪人的大实话
  • Spark 优化 (二) --------- Spark 数据倾斜
  • 第01篇:系统化学习, 搞定Spring容器管理
  • 【Android】-- Intent(显式和隐式Intent)
  • 【HashMap】HashMap的6种遍历方法
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 03Go 类型总结
  • 30天自制操作系统-2
  • Fundebug计费标准解释:事件数是如何定义的?
  • Invalidate和postInvalidate的区别
  • MYSQL 的 IF 函数
  • spring boot下thymeleaf全局静态变量配置
  • tab.js分享及浏览器兼容性问题汇总
  • TCP拥塞控制
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue学习第二天
  • 闭包--闭包之tab栏切换(四)
  • 简单易用的leetcode开发测试工具(npm)
  • 聚簇索引和非聚簇索引
  • 前端攻城师
  • 前端面试总结(at, md)
  • 如何设计一个比特币钱包服务
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #pragma multi_compile #pragma shader_feature
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (转)程序员技术练级攻略
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ..回顾17,展望18
  • .“空心村”成因分析及解决对策122344
  • .CSS-hover 的解释
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 读取 JSON格式的数据