linwe
2024-08-09 8b7258c9427882bb1798f1502eaa35184c6e374e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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();
    }
}