
1.测试类
public class DarkNetworkDataMonitorApplicationTest {
@Autowired
private SendSimpleMailUtils sendSimpleMailUtils;
@Test
public void CeEmail() throws GeneralSecurityException, MessagingException {
sendSimpleMailUtils.sendEmail("预警","浴巾高效",new Address[]{new InternetAddress("12222230@qq.com")});
}
}
2.执行发送邮件的类
@Service
@Slf4j
public class SendSimpleMailUtils {
//代理服务器地址
@Value("${spring.mail.proxyhost}")
private String proxyHost;
//代理服务器端口
@Value("${spring.mail.proxyport}")
private String proxyPort;
//email地址
@Value("${spring.mail.host}")
private String host;
//协议
@Value("${spring.mail.protocol}")
private String protocol;
//邮箱用户名
@Value("${spring.mail.username}")
private String username;
//邮箱密码
@Value("${spring.mail.password}")
private String password;
//@Async("doSomethingExecutor") 这个注解是通过异步多线程方式执行,在另一篇文章会讲解SpringBoot中如何使用异步多线程
public void sendEmail(String title,String sendMessage,Address[] addrs)throws MessagingException, GeneralSecurityException {
log.info("发送邮箱,{}",addrs);
//设置代理服务器
Properties props = System.getProperties();
props.setProperty("proxySet", "true");
props.setProperty("socksProxyHost", proxyHost);
props.setProperty("socksProxyPort", proxyPort);
props.setProperty("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "false");
// 设置邮件服务器主机名
props.setProperty("mail.host", host);
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", protocol);
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
Session session = Session.getInstance(props);
Message message = new MimeMessage(session);
Address address = new InternetAddress(username);
message.setFrom(address);
message.setSubject(title);
message.setText(sendMessage);
message.setSentDate(new Date());
Transport transport = session.getTransport();
//邮件服务器、发送邮箱账号、第三方验证码
transport.connect(host, username, password);
//执行发送邮件
transport.sendMessage(message,addrs);
//发送完需要清楚代理,否则会导致系统链接mysql 、 redis等服务链接失败
System.clearProperty("proxySet");
System.clearProperty("socksProxyHost");
System.clearProperty("socksProxyPort");
transport.close();
}
}
注意:我在写的时候出现发送邮件成功后redis、mysql过一段时间后就链接失败,经过分析得知是因为设置代理是全局生效的,当redis、mysql的连接池里的链接失效后再使用的时候需要重新链接的时候发现是代理服务器,然后连接不到目标。所以再发送邮件成功后需要使用以下代码清除代理
System.clearProperty("proxySet");
System.clearProperty("socksProxyHost");
System.clearProperty("socksProxyPort");