Java 实现邮件发送的完整指南
在 Java 开发中,邮件发送功能是常见的应用场景,例如用户注册验证、密码重置、系统通知等,Java 提供了强大的 JavaMail API,结合 SMTP 协议,可以轻松实现邮件的发送,本文将详细介绍如何使用 Java 实现邮件发送,包括基础配置、不同类型的邮件发送(纯文本、HTML、带附件)以及常见问题的解决方案。

环境准备与依赖引入
在开始之前,需要确保项目中引入 JavaMail 相关的依赖,对于 Maven 项目,可以在 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
对于 Gradle 项目,可以使用:
implementation 'com.sun.mail:javax.mail:1.6.2'
根据邮件服务器的要求,可能还需要额外的依赖,SSL/TLS 支持(JavaMail 已内置)。
配置邮件服务器参数
邮件发送的核心是配置 SMTP(Simple Mail Transfer Protocol)服务器参数,常见的邮件服务商(如 Gmail、QQ 邮箱、企业邮箱)均提供 SMTP 服务器地址和端口,以 Gmail 为例:
- SMTP 服务器:
smtp.gmail.com - 端口:
587(TLS 加密)或465(SSL 加密) - 需要开启“应用专用密码”(非账户密码)
配置参数的代码示例如下:
Properties props = new Properties();
props.put("mail.smtp.auth", "true"); // 启用 SMTP 认证
props.put("mail.smtp.starttls.enable", "true"); // 启用 TLS 加密
props.put("mail.smtp.host", "smtp.gmail.com"); // SMTP 服务器地址
props.put("mail.smtp.port", "587"); // SMTP 端口
创建邮件会话与认证
通过 Session 类创建邮件会话,并配置认证信息,认证方式通常使用 Authenticator,如下:

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your-email@gmail.com", "your-app-password");
}
});
注意:Gmail 等服务商可能需要生成“应用专用密码”,直接使用账户密码可能会因安全策略被拒绝。
发送纯文本邮件
纯文本邮件是最简单的形式,通过 MimeMessage 类构建邮件内容:
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("your-email@gmail.com"));
message.addRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com"));
message.setSubject("邮件主题");
message.setText("这是一封纯文本邮件内容。");
Transport.send(message);
发送 HTML 邮件
HTML 邮件支持富文本格式,适合发送样式化的内容,通过设置 setContent 方法的第二个参数为 text/html 实现:
message.setContent("<h1>HTML 邮件</h1><p>这是一封 <b>HTML</b> 格式的邮件。</p>", "text/html");
发送带附件的邮件
带附件的邮件需要使用 MimeMultipart 类组合正文和附件,以下是完整示例:
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
MimeMultipart multipart = new MimeMultipart();
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("<h1>带附件的邮件</h1>", "text/html");
multipart.addBodyPart(textPart);
// 添加附件
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile("path/to/attachment.pdf");
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
Transport.send(message);
使用线程池优化发送性能
邮件发送是 I/O 密集型操作,直接在主线程中发送可能导致阻塞,可以通过线程池异步发送邮件:
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> {
try {
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
});
常见问题与解决方案
-
认证失败:

- 检查邮箱密码是否正确(Gmail 需用应用专用密码)。
- 确认 SMTP 服务器是否允许第三方客户端登录。
-
连接超时:
- 检查网络是否通畅,或调整超时时间:
props.put("mail.smtp.connectiontimeout", 5000); props.put("mail.smtp.timeout", 5000);
- 检查网络是否通畅,或调整超时时间:
-
附件路径错误:
确保文件路径正确,且程序有读取权限。
-
中文乱码:
- 设置字符编码:
message.setSubject("邮件主题", "UTF-8"); message.setText("邮件内容", "UTF-8");
- 设置字符编码:
Java 实现邮件发送的核心步骤包括:配置 SMTP 参数、创建认证会话、构建邮件内容(纯文本/HTML/附件)以及发送邮件,通过合理使用 JavaMail API 和线程池,可以高效、稳定地实现邮件功能,在实际开发中,还需注意异常处理、性能优化及安全性(如敏感信息加密),希望本文能帮助你快速掌握 Java 邮件发送的实现方法。















