Java快速实现安全可靠的 SMTP 邮件推送功能
本文将通过代码示例和详细说明,全面介绍如何使用 Java 实现 SMTP 邮件推送功能,涵盖以下内容:
- 不加密的 SMTP 邮件发送
- 使用 TLS 或 SSL 加密的邮件发送
Session
对象的作用Transport.send(message)
的实现原理- 邮件内容格式(纯文本、HTML)和附件添加
- SMTP 协议与 TLS/SSL 加密的关系
一、准备工作
1. 添加依赖
在 Maven 项目中添加 javax.mail
依赖:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
二、发送 SMTP 邮件
1. 不加密的 SMTP 邮件
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class SimpleMailSender {
public static void main(String[] args) {
String host = "smtp.example.com";
String username = "your-email@example.com";
String password = "your-password";
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from@example.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com"));
message.setSubject("Plain Text Email");
message.setText("This is a test email.");
Transport.send(message);
System.out.println("Email sent.");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
2. 使用 TLS 加密的 SMTP 邮件
// 配置 TLS
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.example.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true"); // 启用 TLS
3. 使用 SSL 加密的 SMTP 邮件
// 配置 SSL
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.example.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true"); // 启用 SSL
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
三、Session 对象详解
1. 作用
- 配置管理:存储 SMTP 服务器地址、端口、认证方式等。
- 上下文管理:维护邮件发送过程中的会话状态。
- 创建邮件消息:通过
session
创建MimeMessage
对象。
2. 创建方式
Session session = Session.getInstance(properties, authenticator);
四、Transport.send(message) 的实现原理
- 建立连接:根据
Session
配置与 SMTP 服务器建立 TCP 连接。 - 加密协商(若启用 TLS/SSL):
- TLS:通过
STARTTLS
命令升级明文连接为加密连接。 - SSL:直接建立 SSL 加密通道。
- TLS:通过
- 身份认证:使用
Authenticator
提供的用户名和密码登录。 - 发送数据:将
MimeMessage
转换为 SMTP 协议格式并传输。 - 关闭连接:发送完成后关闭连接。
五、邮件内容格式与附件
1. 纯文本与 HTML 格式
纯文本
message.setText("Plain text content");
HTML 格式
String html = "<h1>HTML Email</h1><p>This is <b>bold</b> text.</p>";
message.setContent(html, "text/html");
2. 添加附件
// 创建 Multipart 容器
Multipart multipart = new MimeMultipart();
// 正文部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("Email body", "text/plain");
// 附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
DataSource source = new FileDataSource("file.pdf");
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName("document.pdf");
// 组合内容
multipart.addBodyPart(textPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
六、SMTP 与 TLS/SSL 的关系
1. 协议对比
特性 | SMTP | SMTP + TLS (STARTTLS) | SMTP + SSL (SMTPS) |
---|---|---|---|
加密方式 | 无 | 先明文,后加密 | 全程加密 |
默认端口 | 25 | 587 | 465 |
安全性 | 低 | 高 | 高 |
现代系统推荐 | ❌ 不推荐 | ✔️ 推荐 | ❌ 旧系统使用 |
2. 如何选择?
- 生产环境:始终使用 TLS(端口
587
)。 - 旧系统兼容:可临时使用 SSL(端口
465
)。 - 测试环境:可使用不加密 SMTP(端口
25
)。
七、总结
-
核心类与步骤:
- 使用
Session
配置邮件服务器参数。 - 通过
MimeMessage
构建邮件内容。 - 通过
Transport.send()
发送邮件。
- 使用
-
安全建议:
- 始终优先使用 TLS 加密。
- 避免在不安全网络中发送未加密邮件。