1、导包
<!-- 邮件发送依赖包 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2、编写工具类,@EnableAsync开启异步调用;@Async标注将被异步调用的方法。(其实工具类一般都是静态的属性和方法,本人这里只是提供一个参考,实际请重新编写)
import com.sxcloud.common.exception.RRException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* @descride: 发送邮件工具类
* @author: liarj
* @date: 2020/8/20 16:52
*/
@Slf4j
@Data
@Component
@EnableAsync
public class SendEmailUtil {
/**
* 授权码
*/
@Value("${myemail.authz-code}")
private String authzCode;
/**
* 发件人电子邮箱
*/
@Value("${myemail.from}")
private String from;
/**
* 指定发送邮件的主机为 smtp.qq.com (QQ 邮件服务器)
*/
@Value("${myemail.host}")
private String host;
/**
* 是否验证
*/
@Value("${myemail.smtp.auth}")
private boolean auth;
/**
* 通信加密
*/
@Value("${myemail.smtp.starttls-enable}")
private boolean starttlsEnable;
/**
* 是否必须通信加密
*/
@Value("${myemail.smtp.starttls-required}")
private boolean starttlsRequired;
/**
* 指定SSL类
*/
@Value("${myemail.smtp.scoketFactoty}")
private String scoketFactoty;
/**
* 异步-发送邮件
* @param to 收件人邮箱
* @param subject 头部字段
* @param text 消息体
*/
@Async
public void send(String to, String subject, String text){
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
// 是否验证
properties.put("mail.smtp.auth", auth);
// 加密通讯
properties.put("mail.smtp.starttls.enable", starttlsEnable);
// 是否必须使用加密通讯
properties.put("mail.smtp.starttls.required", starttlsRequired);
// 指定ssl类
properties.put("mail.smtp.scoketFactoty", scoketFactoty);
// 获取默认session对象
Session session = Session.getDefaultInstance(properties,new Authenticator(){
@Override
public PasswordAuthentication getPasswordAuthentication()
{
// 发件人邮件用户名、授权码
return new PasswordAuthentication(from, authzCode);
}
});
try{
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
// Set To: 头部头字段
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
message.setText(text);
Transport.send(message);
}catch (MessagingException mex) {
log.info("邮件发送失败:" + mex.getMessage());
throw new RRException("邮件发送失败");
}
}
}
3、yml配置文件值注入属性。(这边用的是qq邮箱的服务器,授权码、发件人需要自己再配置,其他保持一样即可)
#邮件发送自定义配置
myemail:
#授权码
authz-code: qweqweqwe
#发件人
from: xxx@qq.com
#发送邮件的服务器
host: smtp.qq.com
smtp:
#是否验证
auth: true
#加密通讯
starttls-enable: true
#是否必须加密通讯
starttls-required: true
#指定SSL类
scoketFactoty: javax.net.ssl.SSLSocketFactory
实测5秒左右。
注:当然也可以使用springboot已经封装好的starter包 实现邮件发送。