当前位置:   article > 正文

记录一下SpringBoot电子邮件发送这件事

记录一下SpringBoot电子邮件发送这件事

起因:

        这次想做一个以电子邮件的方式来发送验证码给管理员,以便修改管理员密码。由于自己将本地环境部署的电子邮件案例测试通过后,便天真地以为能够上线,正常跑通了,但是由于是第一次接触这个电子邮箱,对其也是一知半解的,果然,踩坑了。

        在项目上线后,由于阿里云和腾讯云默认关闭25端口(要开启听说要申请),所以没办法,只能修改电子邮件的端口为SSL方式的另外两个端口(465或994),最终在一系列配置之后,总算是成功发送电子邮件了

电子邮箱功能添加流程

  • 添加相关依赖(我添加的是SpringBoot的starter依赖)

  1. <!-- 电子邮件发送工具-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-mail</artifactId>
  5. </dependency>
  • 添加邮箱配置

  1. --- #短信配置
  2. spring:
  3. mail:
  4. # 配置 SMTP 服务器地址
  5. host: smtp.163.com
  6. # 发送者邮箱
  7. username: ***(自己的邮箱)***
  8. # 配置密码注意是刚刚申请到的授权码
  9. password: ***(自己的授权码)***
  10. # 端口号 25465/994(使用ssl时)
  11. port: 465
  12. # 默认的邮件编码为UTF-8
  13. default-encoding: UTF-8
  14. # 邮件协议
  15. protocol: smtp
  16. # 配置SSL 加密工厂
  17. properties:
  18. mail:
  19. smtp:
  20. auth: true
  21. required:
  22. enable: true
  23. # 设为true时 端口号设为 465 设为false时 端口号设为25
  24. ssl:
  25. enable: true
  26. socketFactoryClass: javax.net.ssl.SSLSocketFactory
  27. #表示开启 DEBUG 模式邮件发送过程的日志会在控制台打印出来
  28. debug: true
  • 发送邮件

    • Controller 层
  1. @Autowired
  2. private MailService mailService;
  3. @PostMapping("/sendMail/{email}")
  4. public Result<String> sendMail(@PathVariable("email") String email) {
  5. // 校验邮箱格式是否正确
  6. boolean isEmail = Validator.isEmail(email);
  7. if (!isEmail) {
  8. throw new BusinessNewException(ErrorConstant.EMAIL_PATTERN_NOT_MATCH);
  9. }
  10. try {
  11. mailService.sendMail(email);
  12. return Result.ok("邮件发送成功");
  13. } catch (MessagingException e) {
  14. e.printStackTrace();
  15. return Result.failed("邮件发送失败");
  16. }
  17. }

  • Service层(为了方便,简写了)
  1. @Autowired(required = false)
  2. private JavaMailSender mailSender;
  3. @Resource
  4. private StringRedisTemplate stringRedisTemplate;
  5. /**
  6. * 发送信息邮件
  7. * @param to 收件人
  8. * @throws MessagingException 异常
  9. */
  10. public void sendMail(String to) throws MessagingException {
  11. // 使用hutool生成验证码
  12. // 创建一个LineCaptcha实例,设置长度(默认为4位)
  13. String captchaCode = RandomUtil.randomNumbers(6);
  14. if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(RedisConstant.ADMIN_FORGOT_PASSWORD_KEY + to))) {
  15. throw new BusinessNewException("验证码已发送,请勿在一分钟内重复发送");
  16. }else{
  17. stringRedisTemplate.opsForValue().set(RedisConstant.ADMIN_FORGOT_PASSWORD_KEY + to, captchaCode, 60, TimeUnit.SECONDS);
  18. }
  19. MimeMessage message = mailSender.createMimeMessage();
  20. MimeMessageHelper helper = new MimeMessageHelper(message, true);
  21. //邮箱发送者
  22. helper.setFrom(userName);
  23. //收件人,可以为多个收件人,收件人之间用逗号隔开
  24. helper.setTo(to);
  25. // 邮箱标题
  26. helper.setSubject(EmailConstant.EMAIL_TITLE_FORGOT_PASSWORD);
  27. // 邮箱内容
  28. String emailContent = EmailConstant.EMAIL_PREFIX_CONTENT_FORGOT_PASSWORD +
  29. "您本次的验证码为:" + captchaCode + ",请在60秒内填写,否则验证码失效\n" +
  30. EmailConstant.EMAIL_SUFFIX_FORGOT_PASSWORD;
  31. helper.setText(emailContent, true);
  32. mailSender.send(message);
  33. }

        这里使用了RedisStringTemplate限制用户1分钟后才能重复发送。

  • 其他部分 

EmailConstant:
  1. public interface EmailConstant {
  2. String EMAIL_TITLE_FORGOT_PASSWORD = "这里是电子邮件标题";
  3. String EMAIL_PREFIX_CONTENT_FORGOT_PASSWORD ="(电子邮件内容前缀)尊敬的管理员,\n" +
  4. "您收到这封邮件是因为您在***网站要通过邮件的方式找回密码,\n";
  5. String EMAIL_SUFFIX_FORGOT_PASSWORD = "(电子邮件内容后缀)如果您的邮箱没有收到邮件,请联系管理员,\n" ;
  6. }
RedisConstant.ADMIN_FORGOT_PASSWORD_KEY
    String ADMIN_FORGOT_PASSWORD_KEY = "wx:admin:forget:";

总结

        在这过程中,我卡得最久的竟然是yum的配置,将“ssl: ” 那里的"enable" 写成了“enabled” (主要是阿里的通义灵码给我的提示,我直接tab了),导致一直没成功。看来还得多多学习,才能少出BUG 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/908882
推荐阅读
相关标签
  

闽ICP备14008679号