本文目录导读:

Java 实现邮件发送功能通常使用 JavaMail 相关 API,虽然 Java 标准版(Java SE)不直接包含 JavaMail,但可以通过添加依赖(如 javax.mail 或 jakarta.mail)来实现。
下面是一个从零开始的完整案例,包含依赖导入、核心代码和常见配置。
添加 Maven 依赖
如果使用 Maven 项目,在 pom.xml 中添加以下依赖(二选一,取决于你的 Java 或 Spring Boot 版本):
方案 A:Java 8 / javax.mail(传统方式)
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
方案 B:Java 11+ / jakarta.mail(新标准,推荐)
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
注意:如果你使用 Spring Boot,它已经内置了
spring-boot-starter-mail,其中自动包含了相关依赖。
核心代码实现
以下是一个可直接运行的纯 Java 邮件发送类(以 javax.mail 为例,jakarta.mail 用法几乎相同,仅包名不同):
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class EmailSender {
// 发件人邮箱配置(以 QQ 邮箱为例)
private static final String SENDER_EMAIL = "your_email@qq.com";
// 授权码(不是登录密码!)
private static final String SENDER_PASSWORD = "your_authorization_code";
// SMTP 服务器地址
private static final String SMTP_HOST = "smtp.qq.com";
private static final int SMTP_PORT = 587; // 或 465(SSL)
public static void main(String[] args) {
// 收件人
String recipient = "recipient@example.com";
String subject = "Java 邮件发送测试";
String content = "<h1>Hello!</h1><p>这是来自 Java 程序的测试邮件。</p>";
sendEmail(recipient, subject, content);
}
public static void sendEmail(String recipient, String subject, String content) {
// 1. 设置连接属性
Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST);
props.put("mail.smtp.port", SMTP_PORT);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true"); // 启用 TLS
// 2. 创建 Session(身份验证)
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(SENDER_EMAIL, SENDER_PASSWORD);
}
});
// 可选:开启调试模式,打印与 SMTP 的交互日志
session.setDebug(true);
try {
// 3. 创建邮件对象
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(SENDER_EMAIL));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
message.setSubject(subject);
// 设置内容为 HTML 格式(也可设为纯文本:message.setText(content))
message.setContent(content, "text/html; charset=utf-8");
// 4. 发送邮件
Transport.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
e.printStackTrace();
System.err.println("邮件发送失败:" + e.getMessage());
}
}
}
常见邮箱 SMTP 配置参考
| 邮箱服务 | SMTP服务器 | 端口(TLS/SSL) | 特殊说明 |
|---|---|---|---|
| QQ邮箱 | smtp.qq.com |
587 (TLS) / 465 (SSL) | 需开启 SMTP服务 并获取 授权码 |
| 163邮箱 | smtp.163.com |
25 / 465 (SSL) | 同样需要授权码 |
| Gmail | smtp.gmail.com |
587 (TLS) / 465 (SSL) | 需开启“允许不够安全的应用”或使用应用专用密码 |
| Outlook | smtp.office365.com |
587 (TLS) | 使用邮箱密码即可(部分需应用密码) |
关于授权码:以 QQ 邮箱为例,登录网页版 → 设置 → 账户 → 开启“POP3/SMTP服务”,系统会生成一个 16 位授权码,填入代码中作为密码,不要使用邮箱登录密码。
使用 SSL 连接(端口 465)
如果选择 SSL 方式连接,修改 props 配置如下:
Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST);
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
其余代码不变。
发送带附件的邮件
如果需要添加附件,使用 MimeBodyPart 和 Multipart 组合:
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.io.File;
// 在创建 Message 后添加以下逻辑:
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html; charset=utf-8");
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File("文件路径/example.pdf"));
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
常见问题与排查
| 问题 | 检查方向 |
|---|---|
AuthenticationFailedException |
检查邮箱账号和授权码是否正确 |
Could not connect to SMTP host |
检查 SMTP 地址、端口、防火墙是否开放 |
com.sun.mail.util.MailConnectException |
检查网络能否访问外网,某些公司内网会屏蔽 SMTP |
| 国内邮箱发送被拒 | 尝试启用 SSL 或更换端口 |
| 发送超时 | 适当增加超时设置:props.put("mail.smtp.connectiontimeout", "5000") |
生产环境建议
- 不要硬编码密码:使用配置文件(
application.yml/ 环境变量)读取敏感信息。 - 使用 Spring Boot 的
MailSender:可以更优雅地实现,只需配置spring.mail.*属性即可。 - 异步发送:如果邮件发送较慢,建议使用线程池或消息队列处理,避免阻塞业务主流程。