package org.springblade.modules.email.config; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.support.Condition; import org.springblade.modules.email.entity.EmailEntity; import org.springblade.modules.email.mapper.EmailMapper; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.stereotype.Component; import javax.mail.*; import java.security.Security; import java.util.List; import java.util.Properties; @Slf4j @Component @AllArgsConstructor public class MailSenderConfig { private final MailProperties mailProperties; private final EmailMapper emailMapper; /** * 初始化 sender * PostConstruct注解用于需要在依赖注入完成后执行任何初始化的方法。 必须在类投入使用之前调用此方法 * 因为刚开始我觉得这种方式(@PostConstruct) 不合适,就是没能做到修改了马上就能用的那种感觉。 * 但是后来写完才发现,其实只要每次添加新的邮件发送人时,都重新初始化一次就可以了。 * 后来我又用启动事件监听器。@PostConstruct 后来就没去测试了。 * 理论添加、修改完 调用这个初始化方法就可以了。 */ // @PostConstruct public JavaMailSenderImpl buildMailSender() { log.info("初始化mailSender"); //获取数据库中启用的邮件配置 EmailEntity params = new EmailEntity(); params.setStatus(2); params.setEmailType("1"); EmailEntity email = emailMapper.selectOne(Condition.getQueryWrapper(params)); JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); //如果数据库中没有配置邮件,则使用默认的邮件配置 if(email != null){ javaMailSender.setDefaultEncoding(email.getDefaultEncoding()); javaMailSender.setHost(email.getHost()); javaMailSender.setPort(email.getPort()); javaMailSender.setProtocol(email.getProtocol()); javaMailSender.setUsername(email.getUsername()); javaMailSender.setPassword(email.getPassword()); } else{ javaMailSender.setDefaultEncoding(mailProperties.getDefaultEncoding()); javaMailSender.setHost(mailProperties.getHost()); javaMailSender.setPort(mailProperties.getPort()); javaMailSender.setProtocol(mailProperties.getProtocol()); javaMailSender.setUsername(mailProperties.getUsername()); javaMailSender.setPassword(mailProperties.getPassword()); } return javaMailSender; } /** * * @return * @throws MessagingException */ public Store buildMailReceive() throws MessagingException { log.info("初始化mailReceive"); //获取数据库中启用的邮件配置 EmailEntity params = new EmailEntity(); params.setStatus(2); params.setEmailType("2"); EmailEntity email = emailMapper.selectOne(Condition.getQueryWrapper(params)); Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";//ssl加密 //有些参数可能不需要 Properties props = new Properties(); props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY); props.setProperty("mail.imap.socketFactory.fallback", "false"); props.setProperty("mail.transport.protocol", email.getProtocol()); // 使用的协议 props.setProperty("mail.imap.port", email.getPort().toString()); props.setProperty("mail.imap.socketFactory.port", email.getPort().toString()); //创建会话 Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(email.getUsername(),email.getPassword()); } }); //存储对象 Store store = session.getStore("imap"); //连接 store.connect("imap.qq.com",email.getPort(),email.getUsername(),email.getPassword()); return store; } /** * 获取MailSender * * @return CustomMailSender */ public JavaMailSenderImpl getSender() { return buildMailSender(); } /** * 获取MailSender * * @return CustomMailSender */ public Store getReceive() throws MessagingException { return buildMailReceive(); } }