Java 实现邮件发送的核心原理与步骤
在 Java 开发中,邮件发送功能是企业级应用常见的需求,例如用户注册确认、密码重置、订单通知等场景,Java 提供了强大的 JavaMail API 来实现邮件发送功能,结合 SMTP(简单邮件传输协议)协议,可以轻松完成文本邮件、HTML 邮件及附件邮件的发送,本文将详细介绍 Java 实现邮件发送的核心步骤、关键配置及代码示例。

环境准备与依赖引入
要使用 JavaMail API,首先需要添加相关依赖,以 Maven 项目为例,在 pom.xml 中引入以下依赖:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
该依赖包含了 JavaMail 的核心类库,如 Session(邮件会话)、Message(邮件消息)、Transport(邮件传输)等,是实现邮件发送的基础。
配置 SMTP 服务器参数
邮件发送依赖于 SMTP 服务器,常见的邮箱服务商(如 QQ、163、Gmail)均提供了 SMTP 服务,但需开启 SMTP 功能并获取授权码(非邮箱密码),以 QQ 邮箱为例,核心配置参数如下:
- SMTP 服务器地址:
smtp.qq.com - 端口号:SSL 加密端口为
465,TLS 加密端口为587 - 用户名:完整的邮箱地址(如
xxx@qq.com) - 授权码:在 QQ 邮箱设置中获取的 16 位授权码
将这些参数封装到 Properties 对象中,用于后续创建邮件会话:

Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp"); // 传输协议
props.setProperty("mail.smtp.host", "smtp.qq.com"); // SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要身份验证
props.setProperty("mail.smtp.ssl.enable", "true"); // 开启 SSL 加密
props.setProperty("mail.smtp.port", "465"); // SSL 加密端口
创建邮件会话与认证
通过 Session 类创建邮件会话,并设置身份验证信息(用户名和授权码)。Session 是 JavaMail 的核心入口,负责管理邮件连接的属性和认证状态:
// 创建 Authenticator 内部类,用于身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("xxx@qq.com", "your_authorization_code");
}
};
// 使用 props 和 authenticator 创建会话
Session session = Session.getInstance(props, authenticator);
session.setDebug(true); // 开启调试模式,可查看详细日志(生产环境建议关闭)
构建邮件消息
Message 接口表示一封邮件,其实现类 MimeMessage 支持复杂内容(如 HTML、附件),通过 MimeMessage 设置邮件的基本信息,包括发件人、收件人、主题、正文等:
设置邮件基本信息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("xxx@qq.com")); // 发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("xxx@163.com")); // 收件人
message.setSubject("Java 测试邮件"); // 邮件主题
message.setText("这是一封通过 Java 发送的测试邮件,请勿回复!"); // 邮件文本内容
发送 HTML 邮件
若需发送 HTML 格式邮件(如富文本、链接、图片),使用 setContent() 方法并指定内容类型:
message.setContent("<h1>HTML 邮件</h1><p>这是一封 <strong>HTML</strong> 格式的邮件</p>", "text/html;charset=UTF-8");
添加附件
发送附件需要使用 MimeMultipart 类,将正文和附件组合到一起:

MimeMultipart multipart = new MimeMultipart();
// 添加文本内容
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("邮件正文,请查附件", "text/html;charset=UTF-8");
multipart.addBodyPart(textPart);
// 添加附件
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File("test.pdf")); // 附件文件路径
attachmentPart.setFileName("测试文件.pdf"); // 附件显示名称
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
发送邮件
通过 Transport 类发送邮件,Transport 是 JavaMail 中负责实际传输邮件的类,需先建立连接,发送完成后关闭连接:
try {
// 建立 SMTP 连接(会自动使用会话中的配置)
Transport.send(message);
System.out.println("邮件发送成功!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("邮件发送失败:" + e.getMessage());
}
常见问题与注意事项
- SSL/TLS 加密:现代邮箱服务商(如 QQ、163)强制要求 SSL/TLS 加密,需正确配置
mail.smtp.ssl.enable或mail.smtp.starttls.enable。 - 授权码 vs 密码:使用第三方邮箱(如 QQ、163)时,必须使用授权码而非登录密码,避免安全风险。
- 附件大小限制:SMTP 服务器通常对附件大小有限制(如 QQ 邮箱不超过 50MB),大文件建议使用云存储链接。
- 异常处理:网络异常、认证失败等情况需捕获
MessagingException和AddressException,增强代码健壮性。
Java 实现邮件发送的核心流程可概括为:配置 SMTP 参数 → 创建邮件会话 → 构建邮件消息 → 通过 Transport 发送,通过 JavaMail API,开发者可以灵活实现文本、HTML 及附件邮件的发送功能,满足不同业务场景的需求,在实际开发中,建议结合 Spring 框架的 JavaMailSender 简化配置,进一步提升开发效率。




