一、背景
如图所示,在使用Hutool的邮件相关工具类发送邮件时,使用的默认是starttls加密。打开邮件原文能够看到,这种加密方式在传输html纯文本时,仅仅加密了文本内容,css相关都没有进行加密,我们应该使用一种更安全的加密方式,使用base64。
二、实现
直接使用java mail实现加密功能。
1.引入
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2.配置
2.1创建配置文件
import java.util.Properties;
...
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");// SMTP主机名
props.put("mail.smtp.port", "587");// 主机端口号 QQ邮箱
props.put("mail.smtp.auth", "true");// 是否需要用户认证
2.2创建会话
import javax.mail.Session;
...
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(账户名,授权码);
}
});
session.setDebug(true);
2.3创建内容并发送
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
...
MimeMessage message = new MimeMessage(session);
message.setSubject("主题");
message.setFrom(new InternetAddress("账户名"));
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("1649875269@qq.com"));
BodyPart textPart = new MimeBodyPart(); //内容
String str = "邮件内容"
textPart.setContent(str,"text/html;charset=utf-8");
//正文的加密和配置的任何加密都无关 只需要在这设置base64加密
textPart.setHeader("Content-Transfer-Encoding", "base64");
MimeBodyPart attachmentPart = new MimeBodyPart(); //附件
String filename = "附件位置";
DataSource source = new FileDataSource(filename);
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName(MimeUtility.encodeText("指定附件名称"));
attachmentPart.setHeader("Content-Transfer-Encoding", "base64") ;//base64加密
Multipart multipart = new MimeMultipart(); //添加传输内容
multipart.addBodyPart(textPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
Transport.send(message); // 发送
三、结果
实现了正文内容的base64加密,也实现了附件的base64加密。