添加邮件管理器
package cn.byang.common.utils.mail;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* @description: email配置
* @author: yang
* @create: 2021-11-20 19:42
**/
public class MailTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
yml配置
spring:
mail:
# 设置邮箱主机(服务商)
host: smtp.exmail.qq.com
# 设置发件人的邮箱
username: xxx
# 设置密码,该处的密码是邮箱开启SMTP的授权码
password: xxx
# 配置端口
port: 465
# 使用协议
protocol: smtp
# 字符编码
default-encoding: UTF-8
properties:
mail:
smtp:
# 必须进行授权认证,它的目的就是阻止他人任意乱发邮件
auth: true
#SMTP加密方式:连接到一个TLS保护连接
starttls:
enable: true
required: true
# 开启ssl
ssl:
enable: true
socketFactory:
port: 465
# 邮件工厂类路径
class: cn.qpyl.common.utils.mail.MailSocketFactory
邮件工具类
package cn.byang.common.utils.mail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;
@Component
public class MailUtils {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String sendFrom;
@Async("taskExecutor")
public void sendSSLMail(String subject, String text, String to, List<File> files){
try {
//创建复杂邮件对象
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//发送复杂邮件的工具类
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
helper.setFrom(sendFrom);
helper.setSubject(subject);
helper.setText(text,true);
//添加附件
if(files != null && files.size() > 0){
files.forEach(file -> {
try {
helper.addAttachment(file.getName(), file);
} catch (MessagingException e) {
e.printStackTrace();
}
});
}
//收件人
helper.setTo(to);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
邮件工厂
package cn.qpyl.common.utils.mail;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
/**
* @program: b2b-deli-purchase
* @description: 邮箱ssl配置
* @author: Mr.cy
* @create: 2020-11-13 19:40
**/
public class MailSocketFactory extends SSLSocketFactory {
private SSLSocketFactory factory;
public MailSocketFactory() {
try {
SSLContext sslcontext = SSLContext.getInstance("ssl");
sslcontext.init(null, new TrustManager[] { new MailTrustManager() }, null);
factory = sslcontext.getSocketFactory();
} catch (Exception ex) {
// ignore
}
}
public static SocketFactory getDefault() {
return new MailSocketFactory();
}
@Override
public Socket createSocket() throws IOException {
return factory.createSocket();
}
@Override
public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
return factory.createSocket(socket, s, i, flag);
}
@Override
public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
return factory.createSocket(inaddr, i, inaddr1, j);
}
@Override
public Socket createSocket(InetAddress inaddr, int i) throws IOException {
return factory.createSocket(inaddr, i);
}
@Override
public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
return factory.createSocket(s, i, inaddr, j);
}
@Override
public Socket createSocket(String s, int i) throws IOException {
return factory.createSocket(s, i);
}
@Override
public String[] getDefaultCipherSuites() {
return factory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}
}