Java代码发送邮件的完整指南
在Java开发中,发送邮件是一项常见的需求,例如用户注册确认、密码重置、系统通知等,Java提供了强大的JavaMail API,结合SMTP协议,可以轻松实现邮件发送功能,本文将详细介绍如何使用Java代码发送邮件,包括环境准备、核心代码实现、常见问题及解决方案。

环境准备与依赖配置
在开始编写邮件发送代码之前,需要确保项目中引入了必要的依赖,对于Java项目,可以通过Maven或Gradle管理依赖,以下是Maven的依赖配置:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
如果使用Gradle,则在build.gradle中添加:
implementation 'com.sun.mail:javax.mail:1.6.2'
确保项目的JDK版本不低于1.8,并了解目标邮件服务商的SMTP服务器地址、端口以及是否需要加密(如SSL/TLS)。
邮件发送的核心步骤
发送邮件的基本流程包括:创建会话、构建邮件内容、连接SMTP服务器、发送邮件,以下是详细步骤:

创建邮件会话
邮件会话(Session)是JavaMail的核心对象,用于配置邮件服务器的属性,通常需要设置SMTP服务器地址、端口、认证方式等。
Properties props = new Properties();
props.put("mail.smtp.auth", "true"); // 启用SMTP认证
props.put("mail.smtp.host", "smtp.example.com"); // SMTP服务器地址
props.put("mail.smtp.port", "587"); // SMTP端口(非加密常用587,SSL加密用465)
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
// 如果使用SSL,需额外配置:
// props.put("mail.smtp.ssl.enable", "true");
// props.put("mail.smtp.socketFactory.port", "465");
// props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your-email@example.com", "your-password");
}
});
构建邮件内容
JavaMail提供了MimeMessage类来构建复杂的邮件内容,支持HTML、附件等,以下是创建邮件的示例:
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("your-email@example.com"));
message.addRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com"));
message.setSubject("邮件主题", "UTF-8");
// 设置邮件正文(支持HTML)
message.setContent("<h1>这是一封HTML邮件</h1><p>你好,Java邮件发送测试!</p>", "text/html;charset=UTF-8");
// 添加附件(可选)
MimeBodyPart attachment = new MimeBodyPart();
attachment.attachFile("/path/to/attachment.pdf");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(attachment);
multipart.addBodyPart(new MimeBodyPart().setContent(message.getContent(), "text/html"));
message.setContent(multipart);
发送邮件
通过Transport类发送邮件,发送后需关闭连接以释放资源。
try {
Transport.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
System.err.println("邮件发送失败:" + e.getMessage());
e.printStackTrace();
}
常见问题与解决方案
在实际开发中,可能会遇到以下问题:

认证失败
- 原因:邮箱密码错误、未开启SMTP服务、或使用了应用专用密码(如Gmail)。
- 解决:检查邮箱服务商是否要求开启“允许 less 安全的应用访问”,或生成应用专用密码。
端口或加密配置错误
- 原因:不同邮箱服务商的SMTP端口和加密方式不同(如QQ邮箱需SSL加密,端口465)。
- 解决:查阅邮箱服务商的官方文档,确认正确的端口和加密方式。
附件发送失败
- 原因:文件路径错误、文件不存在或权限不足。
- 解决:检查文件路径是否正确,确保程序有读取文件的权限。
完整代码示例
以下是一个完整的邮件发送工具类,支持HTML内容和附件:
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Properties;
public class MailUtil {
public static void sendEmail(String to, String subject, String htmlContent, File... attachments) throws MessagingException {
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.example.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your-email@example.com", "your-password");
}
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("your-email@example.com"));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject, "UTF-8");
Multipart multipart = new MimeMultipart();
// 添加HTML正文
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(htmlContent, "text/html;charset=UTF-8");
multipart.addBodyPart(bodyPart);
// 添加附件
for (File attachment : attachments) {
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(attachment);
multipart.addBodyPart(attachmentPart);
}
message.setContent(multipart);
Transport.send(message);
}
public static void main(String[] args) {
try {
File file = new File("test.pdf");
sendEmail("recipient@example.com", "测试邮件", "<h1>你好!</h1>", file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过JavaMail API发送邮件的核心在于配置SMTP会话、构建邮件内容和正确使用Transport类,在实际开发中,建议将邮件发送逻辑封装为工具类,并注意处理异常和资源释放,对于高并发场景,可以考虑使用线程池优化邮件发送性能,掌握这些技巧后,你就可以轻松实现各种邮件发送功能了。



















