背景
本文是《Java 后端从小白到大神》修仙系列第二十篇,正式进入Java后端世界,本篇文章主要聊Java基础中的邮件发送功能(JavaMail API 应用)。若想详细学习请点击 首篇博文,开始学习。
文章概览
- Java 发送邮件核心:JavaMail API
- 核心类解析(快速上手,不用死记)
- 完整实操示例(文本邮件、HTML邮件、带附件邮件)
- 常见邮箱 SMTP 配置(直接复制使用)
- 避坑注意事项(新手必看)
一、Java 发送邮件核心:JavaMail API
Java 中发送邮件,核心依赖 JavaMail API(对应 javax.mail 包),本质是通过调用邮箱的 SMTP 服务器,实现邮件的发送。无需深入底层原理,掌握核心类和实操步骤,就能快速实现邮件发送功能。
二、核心类与功能
| 类名 |
核心作用 |
关键说明 |
| javax.mail.Session |
配置邮件服务器会话 |
设置 SMTP 主机、端口、认证开关等 |
| javax.mail.Message |
封装邮件内容 |
常用子类 MimeMessage,处理发件人、收件人、主题、正文 |
| javax.mail.Address |
表示邮件地址 |
常用子类 InternetAddress,封装发件人/收件人邮箱 |
| javax.mail.Transport |
发送邮件 |
核心方法 Transport.send(message),负责将邮件发送到 SMTP 服务器 |
| javax.mail.Authenticator |
邮箱认证(用户名+密码) |
避免密码泄露,通过重写方法返回认证信息 |
三、实操示例
以「163邮箱」为例,分步骤实现,每一步都有注释,跟着做就能成功发送邮件。
3.1 第一步:添加 Maven 依赖
项目中引入 JavaMail 依赖,无需手动下载 jar 包,Maven 自动导入:
1
2
3
4
5
|
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version> <!-- 稳定版本,兼容大部分JDK -->
</dependency>
|
3.2 第二步:编写邮件工具类
封装通用发送方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* 邮件发送工具类
*/
public class EmailSender {
// 发送邮件的通用方法(参数:收件人邮箱、邮件主题、邮件正文)
public static void sendEmail(String to, String subject, String content) throws MessagingException {
// 1. 配置 SMTP 服务器信息(以 163 邮箱为例,其他邮箱替换对应配置即可)
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com"); // SMTP 服务器地址(固定)
props.put("mail.smtp.port", "465"); // SSL 加密端口(推荐,更安全)
props.put("mail.smtp.auth", "true"); // 启用邮箱认证(必须开启)
props.put("mail.smtp.ssl.enable", "true"); // 启用 SSL 加密(防止密码泄露)
// 2. 创建会话(替换为你的 163 邮箱账号和授权码/密码)
// 注意:QQ邮箱、Outlook邮箱需用「授权码」代替密码(下文有说明)
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 第一个参数:发件人邮箱账号(你的163邮箱)
// 第二个参数:发件人邮箱密码/授权码
return new PasswordAuthentication("[email protected]", "your_password/authorization_code");
}
});
// 3. 构建邮件内容
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]")); // 发件人(和上面的账号保持一致)
message.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 收件人
message.setSubject(subject); // 邮件主题
message.setText(content); // 邮件正文(纯文本格式)
// 4. 发送邮件
Transport.send(message);
}
// 测试方法(main方法直接运行,验证是否发送成功)
public static void main(String[] args) {
try {
// 替换为收件人邮箱、邮件主题、正文
sendEmail("[email protected]", "Java 测试邮件", "这是一封来自 Java 代码的测试邮件,发送成功啦!");
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
e.printStackTrace();
System.out.println("邮件发送失败: " + e.getMessage());
}
}
}
|
3.3 扩展功能
基于上面的工具类,扩展 HTML 邮件和带附件邮件,无需修改核心逻辑,只需调整邮件内容部分。
3.3.1 发送 HTML 邮件(支持排版、图片等)
将「纯文本正文」替换为 HTML 格式,修改 message.setText(content) 为以下代码:
1
2
|
// 核心修改:设置 HTML 格式正文,指定编码(防止中文乱码)
message.setContent("<h1 style='color: red;'>HTML 测试邮件</h1><p>这是一封带排版的 HTML 邮件</p><a href='https://yutao.org'>点击访问首篇博文</a>", "text/html;charset=UTF-8");
|
3.3.2 发送带附件的邮件
添加附件需使用 MimeMultipart(多部分内容,正文+附件),完整代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.io.File;
// 发送带附件的邮件(替换工具类中的 sendEmail 方法即可)
public static void sendEmailWithAttachment(String to, String subject, String content, String filePath) throws MessagingException {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("[email protected]", "your_password/authorization_code");
}
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
// 1. 创建多部分内容(正文 + 附件)
MimeMultipart multipart = new MimeMultipart();
// 2. 正文部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(content); // 可替换为 HTML 格式(参考5.3.1)
multipart.addBodyPart(textPart);
// 3. 附件部分(替换为你的文件路径,如:D:/test.pdf)
MimeBodyPart filePart = new MimeBodyPart();
filePart.attachFile(new File(filePath)); // 传入文件路径
multipart.addBodyPart(filePart);
// 4. 设置邮件内容为多部分(正文+附件)
message.setContent(multipart);
// 发送邮件
Transport.send(message);
}
|
四、常见邮箱 SMTP 配置
不同邮箱的 SMTP 服务器地址和端口不同,整理好直接替换工具类中的配置即可,避免踩坑:
| 邮箱服务商 |
SMTP 服务器地址 |
推荐端口(SSL) |
特殊说明 |
| 163 邮箱 |
smtp.163.com |
465 |
直接用邮箱密码即可(需开启 SMTP 服务) |
| QQ 邮箱 |
smtp.qq.com |
465 |
需用「授权码」代替密码(下文有开启方法) |
| Gmail |
smtp.gmail.com |
465 |
需开启 Gmail 第三方应用访问权限 |
| Outlook |
smtp.office365.com |
587(TLS) |
端口用 587,需开启 TLS 加密(props 中添加 ssl.enable=false,添加 mail.smtp.starttls.enable=true) |
五、避坑注意事项
- 必须开启 SMTP 服务:登录邮箱 → 进入设置 → 找到「SMTP 服务」并开启(QQ 邮箱需额外生成授权码)。
- 密码/授权码问题:QQ 邮箱、企业邮箱不能用登录密码,需生成「授权码」(QQ 邮箱:设置 → 账户 → 开启 POP3/SMTP → 生成授权码)。
- 避免硬编码密码:实际开发中,不要把邮箱账号、密码写死在代码里,建议从配置文件(如 application.properties)或环境变量中读取。
- 中文乱码解决:发送 HTML 邮件时,务必指定编码 text/html;charset=UTF-8;纯文本邮件若乱码,可替换 setText 为 setText(content, “UTF-8”)。
- 异常处理:重点捕获两个异常:AuthenticationFailedException(认证失败,大概率是账号/密码错误)、MessagingException(通信错误,大概率是 SMTP 配置错误)。
六、发送邮件完整流程
配置 SMTP 服务器参数 → 创建邮箱认证会话 → 构建邮件内容(发件人、收件人、主题、正文) → 调用 Transport 发送邮件。
七、总结
Java 发送邮件的核心是 JavaMail API,无需深入底层,掌握「核心类作用 + 实操步骤 + 常见配置」,就能快速实现各类邮件发送功能。