java使用TLSv1.3发送邮件
前提:使用JDK11版本!!!!!,因为之前的JDK版本不支持TLSv1.3协议,仅支持TLSv1.2协议。
可解决 javax.net.ssl.SSLException: Received fatal alert: protocol_version这个错误
查看邮箱所需要的版本,使用火狐浏览器开发者模式查看
重点是这句话
prop.setProperty("mail.smtp.ssl.protocols", "TLSv1.3");
package com.example.teach.controller;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.*;
import javax.net.ssl.SSLContext;
import java.security.GeneralSecurityException;
import java.util.Properties;
public class SendMail {
public static void main(String[] args) throws GeneralSecurityException, javax.mail.MessagingException {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
prop.setProperty("mail.smtp.ssl.protocols", "TLSv1.3");
System.setProperty("javax.net.debug", "all");
// QQ邮箱设置SSL加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//传入发件人的姓名和授权码
return new PasswordAuthentication("xx@qq.com","自己的smtp授权码");
}
});
//2、通过session获取transport对象
Transport transport = session.getTransport();
//3、通过transport对象邮箱用户名和授权码连接邮箱服务器
transport.connect("smtp.qq.com",465,"xx@qq","自己的smtp授权码");
//4、创建邮件,传入session对象
MimeMessage mimeMessage = complexEmail(session);
//5、发送邮件
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//6、关闭连接
transport.close();
}
public static MimeMessage complexEmail(Session session) throws MessagingException, javax.mail.MessagingException {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
//发件人
mimeMessage.setFrom(new InternetAddress("xx@qq.com"));
//收件人
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("xx@qq.com"));
//邮件标题
mimeMessage.setSubject("邮件");
//邮件内容
//准备图片数据
// MimeBodyPart image = new MimeBodyPart();
// DataHandler handler = new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试图片.png"));
// image.setDataHandler(handler);
// image.setContentID("test.png"); //设置图片id
//准备文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");
// //附件
// MimeBodyPart appendix = new MimeBodyPart();
// appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试文件.txt")));
// appendix.setFileName("test.txt");
//拼装邮件正文
MimeMultipart mimeMultipart = new MimeMultipart();
// mimeMultipart.addBodyPart(image);
mimeMultipart.addBodyPart(text);
// mimeMultipart.setSubType("related");//文本和图片内嵌成功
//将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mimeMultipart);
//拼接附件
MimeMultipart allFile = new MimeMultipart();
// allFile.addBodyPart(appendix);//附件
allFile.addBodyPart(contentText);//正文
// allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
}