栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot中使用QQ邮箱发件动态定义发件人

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot中使用QQ邮箱发件动态定义发件人

一、原有逻辑

利用spring-boot-starter-mail那个依赖,它是会在你启动项目的时候通过你配置文件的host,port,username等 MailProperties属性,然后通过 JavaMailSender这个接口注入到spring容器中,达到固定发件人的结果。
当然你也可以在代码通过@bean配合@Component注入到容器中,当然这个可能多此一举。

@Component
public class BeanConfig {
    @Bean
    public JavaMailSender mailSender(){
        JavaMailSenderImpl javaMailSender=new JavaMailSenderImpl();
        javaMailSender.setHost("smtp.qq.com");
        javaMailSender.setPort(465);
        javaMailSender.setUsername("你的邮箱号(开启smtp服务)");
        javaMailSender.setPassword("你的smtp授权码");
        return javaMailSender;
    }
}

二、动态的定义发件人

业务需要,除了系统账户需要发送邮件(认证链接等),用户还要能发送邮件,但又不想去再封装JavaMail。用了hutool等工具库,但是hutool的功能用不太顺手,需要处理MultipartFile转file,所以还是再springboot的starter下手。
因为用户的邮箱号和授权码等都保存在数据库里,所以要做的就是动态的把用户邮箱数据注入到spring容器中。

2.1 动态注入bean

可以参考这个,亲测有效:springboot动态注入bean

2.2 把用户邮箱账户数据注入到容器
        UcMail mail=mailDao.selectEmailByName(username);
        ConfigurableApplicationContext configurableApplicationContext= (ConfigurableApplicationContext) BeanUtil.getApplicationContext();
        DefaultListableBeanFactory defaultListableBeanFactory=(DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
        BeanDefinitionBuilder beanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(JavaMailSenderImpl.class);
        beanDefinitionBuilder.addPropertyValue("host","smtp.qq.com");
        beanDefinitionBuilder.addPropertyValue("port",465);
        //这里的smtps代表ssl+smtp,qq必须开启ssl
        beanDefinitionBuilder.addPropertyValue("protocol","smtps");
        beanDefinitionBuilder.addPropertyValue("username",mail.getUsrEmail());
        beanDefinitionBuilder.addPropertyValue("password",mail.getUsrEmailCode());
        defaultListableBeanFactory.registerBeanDefinition("UserMailBean", beanDefinitionBuilder.getBeanDefinition());
        //这里获取上面通过DefaultListableBeanFactory 注入的bean
        JavaMailSender mailSender=(JavaMailSender)BeanUtil.getBean("UserMailBean");
        if(mailSender==null){
            log.warn("bean创建获取异常");
            return Result.fail();
        }
        try{
            //MineMessageHelper在传送文件时需要开启MultipartFile模式,即为true
            MimeMessageHelper messageHelper=new MimeMessageHelper(mailSender.createMimeMessage(),true);
            messageHelper.setFrom(emailVO.getFrom());
            messageHelper.setTo(emailVO.getTo().split(","));
            messageHelper.setSubject(emailVO.getSubject());
            messageHelper.setText(emailVO.getContent());
            if(emailVO.getCc()!=null){
                messageHelper.setCc(emailVO.getCc().split(","));
            }
            if(emailVO.getBcc()!=null){
                messageHelper.setBcc(emailVO.getBcc().split(","));
            }
            if(ArrayUtil.isNotEmpty(multipartFiles)){
                for(MultipartFile multipartFile:multipartFiles){
                    messageHelper.addAttachment(multipartFile.getOriginalFilename(),multipartFile);
                }
            }
            mailSender.send(messageHelper.getMimeMessage());
        }catch (MessagingException e){
            log.warn("邮件发送失败,发件人{}",emailVO.getFrom());
            defaultListableBeanFactory.removeBeanDefinition("UserMailBean");
            return Result.fail("邮件发送失败");
        }
        //移除bean
        defaultListableBeanFactory.removeBeanDefinition("UserMailBean");
        return Result.ok("邮件发送成功");
2.3 题外

这里也可以采用异步的方式,把关键代码封装成一个工具类,通过@Async配合juc并发包达到异步发送的效果,可以使前端更友好。

有人看我在写

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340366.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号