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();
|
}
|
}
|