利用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容器中。
可以参考这个,亲测有效: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并发包达到异步发送的效果,可以使前端更友好。
有人看我在写



