小齐过来给你看个宝贝:《发送邮件功能实现》

40 阅读5分钟

引言:邮件发送功能在系统中的应用

在现代信息化系统中,邮件发送功能已成为一个不可或缺的组成部分。它不仅仅是用户注册和身份验证的关键环节,还在各种业务流程中扮演着重要角色。通过邮件,我们可以及时向用户传达重要信息,增强用户体验,并提升服务的互动性和专业性。

邮件发送功能的应用范围广泛,包括但不限于以下几个方面:

  1. 用户注册与验证:在用户注册过程中,通过发送激活邮件来验证用户邮箱的真实性,确保账户信息的准确性。
  2. 密码找回与重置:当用户忘记密码时,系统可以自动发送重置密码的指引邮件,帮助用户迅速恢复账户访问。
  3. 业务通知:完成交易、订单更新、服务状态变更等业务操作后,通过邮件及时通知用户,提高透明度和响应速度。
  4. 营销推广:利用邮件营销向目标用户发送定制化的内容,包括新产品发布、限时优惠、会员活动等,以提高用户参与度和品牌忠诚度。
  5. 事务性沟通:在用户执行特定操作,如预订服务、支付成功或申请审批后,发送确认邮件,提供清晰的事务处理记录。
  6. 用户反馈与互动:通过邮件收集用户的反馈意见,进行满意度调查,或邀请用户参与产品测试和用户体验改进。
  7. 系统报告与分析:定期向管理层发送业务报告、数据分析结果和系统性能监控报告,辅助决策制定。
  8. 安全警报与提醒:在检测到账户异常登录、密码变更或其他安全事件时,发送警报邮件,提醒用户采取相应措施。
  9. 节日祝福与个性化沟通:在特殊节日或用户生日时发送定制化的祝福邮件,增强用户的情感连接。
  10. 法律和政策更新:向用户传达有关隐私政策、服务条款或法规遵从性的重要变更,确保透明度和合规性。

邮件发送功能的有效实现,不仅能够提升用户的满意度和信任度,还能够加强企业与用户之间的沟通,是现代信息系统中一项极其重要的功能。

故事背景:

作为开发组长,我正享受着一个平静的摸鱼日,坚信摸鱼才是赚钱的王道。然而,一阵寒意打断了我的悠闲,抠门老板带着不悦的脸色出现,要求我立刻解决客户反馈的密码找回问题。

客户公司的员工忘记密码,只能通过管理员重置,这显然不够便捷。我提醒老板,当初为了加快产品上市,是您决定砍掉自助找回密码的功能。老板沉默片刻,随后下达了死命令:两天内必须实现新功能。

为了不耽误我的摸鱼大业,我决定培养团队的小齐。我向他发送了QQ信息:“小齐,你渴望力量吗?来我工位带你学习学习。

image.png

小齐一脸迷茫地到来,我向他介绍了需求,并承诺将我三十年的功力传授于他。我们迅速分析了流程,从注册/找回密码到发送邮箱的实现。

image.png

1、需求分析:

为了实现邮箱找回密码功能,我们需要遵循以下步骤:

  • 注册/找回密码:用户输入注册信息或请求找回密码。
  • 生成随机数:系统生成一个随机数并存储在Redis中。
  • 发送随机数:将随机数通过邮箱发送给用户。
  • 验证随机数:用户输入收到的随机数进行验证。
  • 验证成功:验证成功后,从Redis中删除对应的随机数。

2. 通信协议概览

理解请求的本质和通信协议对于实现该功能至关重要:

  • HTTP:用于客户端与服务器之间的数据传输。
  • WebSocket:提供全双工通信,适用于实时应用场景。
  • SMTP:用于发送邮件。
  • POP3/IMAP:用于接收邮件,IMAP提供更多管理功能。

3、业务流程

经过简单的分析我们可以得到业务流程图大概是这样

image.png

4. 实现步骤概览

image.png

引入发送邮件maven

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

添加配置:

spring:
# 邮件服务配置
  mail:
    # SMTP服务器地址
    host: smtp.qq.com
    # 发送邮件的邮箱
    username: xxx@qq.com
    # 邮箱密码,用于SMTP身份验证(授权码)
    password: xxxx
    # SMTP服务器端口号,通常使用587用于安全的TLS连接
    port: 587

开启邮箱服务:

这边以QQ邮箱为例子

首先进入设置

image.png

在“账号”下找到这一段然后开启服务

image.png

image.png

验证之后可以获得一串授权码,保存一下

image.png

写个接口测试一下:

@GetMapping("/test")
    public void sendMail()
    {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("xxx@qq.com");
        message.setTo("xxx@qq.com");
        message.setSubject("测试主题");
        message.setText("测试内容");
        javaMailSender.send(message);
    }

测试结果

image.png

image.png

简单整合一下:

MailService:

public interface MailService {
    void sendSimpleMail(String to, String subject, String content);
}

MailServiceImpl

@Service
public class MailServiceImpl implements MailService {
​
    @Value("${spring.mail.username}")
    private String form;
​
    @Autowired
    private JavaMailSender javaMailSender;
​
    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(form);
        message.setTo(to);
        message.setSubject("测试主题");
        message.setText("测试内容");
        javaMailSender.send(message);
    }
}

userController

公司代码不敢丢,随便写个意思意思

image.png

注册逻辑,找回密码同理

    @Autowired
    public RedisTemplate redisTemplate;
​
    @Value("${spring.mail.username}")
    private String form;
​
    @GetMapping("/register")
    public AjaxResult sendMail(User user, String code) {
    // 获取验证码
    String redisCode = (String) redisTemplate.opsForValue().get("register_xx@qq.com");
    //判断是否存在
    if (redisCode == null) {
        throw new RuntimeException("验证码不存在");
    }
    // 插入用户逻辑 这里太长懒得写了

    // 删除验证码
    redisTemplate.delete("register_xx@qq.com");
    return AjaxResult.success();
}

总结:

到这里我们本次需要实现的邮箱发送验证码的功能就算是实现了,像发送邮箱验证的接口防刷等功能以后有空在单独写出来(绝不是想多水几篇文章),像还有可以优化的比如发送邮件的模板等就不过多深入了

如果有什么感兴趣的方向也可以在评论发出来,我会量力而行看看能不能写出对应的文章

有条件的朋友可以来个一件三连支持一下

如果可以的话顺便关注一下公众号:想摆烂的码农小郑

image.png