jar
org.springframework.boot
spring-boot-starter-mail
Mail邮件对象
public class Mail implements Serializable {
private static final long serialVersionUID = 1L;
//接收方邮件
private String email;
//主题
private String subject;
//模板
private String template;
// 自定义参数
private Map params;
}
实现
@Component
public class MailSendService {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
//发件人
@Value("${spring.mail.username}")
private String fromMail;
//主题名称
//@Value("${mail.subjectName}")
//private String subjectName;
/**
* 根据模板名 获取邮件内容
*/
private String getMailTextByTemplateName(String templateName, Map params) throws IOException, TemplateException {
try {
String mailText = "";
//通过指定模板名获取FreeMarker模板实例
Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
mailText = FreeMarkerTemplateUtils.processTemplateIntoString(template, params);
return mailText;
}catch (TemplateNotFoundException e) {
//若找不到指定模板则使用默认模板
templateName="busi_situation.ftl";
Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
return FreeMarkerTemplateUtils.processTemplateIntoString(template, params);
}
}
public Result sendWithHTMLTemplate(Mail mail) {
try {
String email = mail.getEmail();
if (StringUtil.isBlank(email)) {
return ResultUtil.error("邮箱email不能为空!");
}
if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {
return ResultUtil.error("邮箱email格式不正确!");
}
//发件人昵称
String nick = MimeUtility.encodeText(fromMail);
//发件人
InternetAddress from = new InternetAddress(nick + "");
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
//收件人
mimeMessageHelper.setTo(email);
mimeMessageHelper.setFrom(from);
//图片
String fileUrl = this.getClass().getClassLoader().getResource("public/static/img/mail/logo.png").getPath();
FileSystemResource img1 = new FileSystemResource(new File(fileUrl));
mimeMessageHelper.addInline("logo1", img1);
FileSystemResource img2 = new FileSystemResource(new File(fileUrl));
mimeMessageHelper.addInline("logo2", img2);
//附件
String filePath= this.getClass().getClassLoader().getResource("public/static/img/mail/text.txt").getPath();
FileSystemResource file=new FileSystemResource(new File(filePath));
String fileName=filePath.substring(filePath.lastIndexOf(File.separator));
//添加多个附件可以使用多条
mimeMessageHelper.addAttachment(fileName,file);
Map params = mail.getParams();
mail.setParams(params);
mimeMessageHelper.setSubject(subjectName);
// 使用模板生成html邮件内容
String result = getMailTextByTemplateName(mail.getTemplate(), mail.getParams());
mimeMessageHelper.setText(result, true);
javaMailSender.send(mimeMessage);
return ResultUtil.success("邮件发送成功");
} catch (Exception e) {
logger.error("发送邮件失败" + e.getMessage());
return ResultUtil.error("发送邮件时发生异常:" + e.getMessage());
}
}
}
邮件服务器SSL安全证书认证
public class MailSocketFactory extends SSLSocketFactory {
private SSLSocketFactory factory;
public MailSocketFactory() {
try {
// 获取一个SSLContext实例
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[]{new MailTrustManager()}, null);
//从上述SSLContext对象中得到SSLSocketFactory对象
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();
}
}
证书信任管理器
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 {
}
//返回受信任的X509证书数组。
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
配置文件
spring.mail.default-encoding=UTF-8
spring.mail.host=mail.x'x'x.x'x'x.xxx
spring.mail.username=x'x'xxxxxxx
spring.mail.password=x'x'xxxx
# 协议
spring.mail.protocol=smtp
spring.mail.port=x'x'x
spring.mail.properties.mail.smtp.auth=truexxx
spring.mail.properties.mail.smtp.starttls.enable=false
spring.mail.properties.mail.smtp.starttls.required=false
spring.mail.properties.mail.smtp.socketFactory.port=x'x'x
## SSL认证工厂
spring.mail.properties.mail.smtp.socketFactory.class=com.xxx.msg.impl.MailSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false
freemarrker模板
截至邮件发送时间xxx
${data.sum}
xxx
${data.sum}
xxx
xxx
名称
${item[itemKey]}#if>
#list>
#list>