Spring Boot(六) 快速集成 Mail 服务

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

大家好! 我是慕歌,一只想教你学习 Spring Boot的野生coder! 欢迎来到慕歌的 Sping boot系列教程,希望通过这个教程带大家搭建基础的 Spring Boot项目,该教程所有知识点均来源于本人的真实开发!

前言

在前一节的分享中,慕歌向大家介绍了在开发中我们如何将数据导出为excel,还是通过excel 导入数据。在excel中,我们可以进行更为细致的数据处理,通过Excel提供的优秀数据分析能力,将数据进一步可视化操作。这一节中慕歌将为大家带来mail 邮箱的使用,在我们的spring boot中为mail服务提供了非常好的支持,只需要简单的配置后,就可以通过mail 网络发送短信息。

引入:

spring boot为mail服务进行良好的适配,引入mail 依赖后,我们只需要配置自己的mail邮箱,就可开始使用。

  <!--   mail-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!--发送短信-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.1.0</version>
        </dependency>
复制代码
这里除了使用spring boot 的mail依赖外,还需要使用阿里云的邮件发送sdk。
复制代码

开发:

在我们的配置文件中加入mail 服务的配置,这里使用的是@136 邮箱,其它邮箱的使用方法与它类似。

spring:
  mail:
    # 163邮箱的地址为smtp.163.com,直接填写即可
    host: smtp.qq.com
    # 你申请的163邮箱
    username: 2010550890@qq.com
    # 注意密码是在开启smtp/pop3时自动生成的,记得保存一下,不然就找不到了
    password: yiyjqqsjtvbdddbc
    # 额外的配置,这里我写了两个,只用其中一个就行了,开启ssl加密,保证安全连接
    properties:
      mail:
        smtp:
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
            ##         ssl:
            ##           enable :true
      #设置邮件的编码为utf-8
      default-encoding: utf-8
复制代码
这里是mail 的样例使用场景是验证码服务,需要用到的功能非常简单,可根据自己的需要进行拓展。依旧使用的是sevice 和impl 的方式具体实现邮件服务:
复制代码
public interface IMailCodeService {
    /**
     * 获取验证码
     * @param key
     */
    String getVerifyCode(String key , String mail);

    /**
     * 验证验证码
     * @param key 验证码的uuid
     * @param code 验证码
     */
    boolean verify(String key,String code);

    /**
     * 删除验证码
     * @param key 待生成uuid
     */
    void deleteverifyCode(String key);
}
复制代码

需要用到的功能包括验证码发送,验证,以及验证码失效

/**
 * 验证码服务
 */
@Repository
public class IMemberVerifyCodeRepository {

    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    /**
     * 获取验证码
     * @param key uuid 的值
     * @return 验证码
     */
    public String get(String key) {
        if(hasKey(key)) {
            //redis 获取
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            return (String) valueOperations.get(key);
        }
        return null;
    }

    //删除验证码
    public void delete(String key) {
        if(hasKey(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * 保存到redis 中
     * 码证码有效期 20分钟
     * @param key session id
     * @param verifyCode 码证码
     */
    public void save(String key, String verifyCode) {
        ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
        valueOperations.set(key, verifyCode, 20L, TimeUnit.MINUTES);
    }

    //查询验证码是否存在
    public boolean hasKey(String key) {
        return Optional.ofNullable(redisTemplate.hasKey(key)).orElse(false);
    }
}
复制代码
这里通过redis辅助验证码实现定时过期功能,如不知道如何引入redis 可参考之前的有关redis 集成与使用的文章。
复制代码
@Service
public class MailService {
    //发送者
    @Value("${spring.mail.username}")
    private String SENDER;

    //邮件发送服务
    @Autowired
    JavaMailSender mailSender;

    /**
     * 普通邮件
     * @param to 接受者
     * @param subject 主题
     * @param content 内容
     */
    public void sendSimpleMailMessage(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(SENDER);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        mailSender.send(message);
    }

    // 发送html邮件
    public void sendMimeMessage(String to, String subject, String content) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();;
        // true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(SENDER);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        mailSender.send(message);
    }

    // 发送带附件的邮件
    public void sendMimeMessage(String to, String subject, String content, String filePath) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();;
        // true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(SENDER);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = file.getFilename();
        helper.addAttachment(fileName, file);
        mailSender.send(message);
    }

    // 发送带静态文件的邮件
    public void sendMimeMessage(String to, String subject, String content, Map<String,String> rscIdMap) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();
        // true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(SENDER);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        for (Map.Entry<String, String> entry : rscIdMap.entrySet()) {
            FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
            helper.addInline(entry.getKey(), file);
        }
        mailSender.send(message);
    }
}
复制代码
@Slf4j
@Service
public class MailCodeServiceImpl implements IMailCodeService {

    private final String subject = "验证码";
    private final String precontext = "[智能车] 验证码(20分钟有效)为";

    @Autowired
    private MailService mailService;

    @Autowired
    IMemberVerifyCodeRepository iMemberVerifyCodeRepository;

    @Override
    public String getVerifyCode(String key,String mail) {
        if(iMemberVerifyCodeRepository.hasKey(key)){
            this.deleteverifyCode(key);
        }
        String randomVerifyCode = randomVerifyString(6);
        try {
            String context = precontext+randomVerifyCode;
            mailService.sendMimeMessage(mail,subject,context);
        } catch (MessagingException e) {
            e.printStackTrace();
            log.info("信息发送失败!");
        }
        iMemberVerifyCodeRepository.save(key,randomVerifyCode);
        return randomVerifyCode;
    }

    //随机字符串
    private String randomVerifyString(int len) {
        StringBuilder verifyString = new StringBuilder();
        //随机字段
        SecureRandom secureRandom = new SecureRandom();
        for (int i = 0; i < len; i++) {
            verifyString.append(secureRandom.nextInt(10));
        }
        return verifyString.toString();
    }

    @Override
    public boolean verify(String key, String code) {
        String memberVerfityCode = iMemberVerifyCodeRepository.get(key);
        if(!Objects.equals(code,memberVerfityCode)){
            log.info("验证码错误,或是验证码已经失效!");
            return false;
        }
        return true;
    }

    @Override
    public void deleteverifyCode(String key) {
        iMemberVerifyCodeRepository.delete(key);
    }
}

复制代码
通过以上配置方式,我们即可向指定用户发送邮件,用于验证是否是受信任用户在进行操作。
复制代码

结语

这一章的分享到这里就结束了,下一节中还将带来spring boot中日志功能的分享!
如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!

猜你喜欢

转载自juejin.im/post/7129484131297132558