本文目录导读:

JavaMail 使用指南
JavaMail 是 Java 平台中用于发送和接收电子邮件的标准 API,下面是完整的使用指南。
添加依赖
Maven 项目
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
Gradle 项目
implementation 'javax.mail:javax.mail-api:1.6.2' implementation 'com.sun.mail:javax.mail:1.6.2'
发送纯文本邮件
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class EmailSender {
public static void main(String[] args) {
// 1. 创建配置属性
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); // SMTP服务器
props.put("mail.smtp.port", "587"); // 端口
props.put("mail.smtp.auth", "true"); // 需要认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS
// 2. 创建认证信息
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your-email@gmail.com", "your-password");
}
});
try {
// 3. 创建邮件消息
Message message = new MimeMessage(session);
// 设置发件人
message.setFrom(new InternetAddress("your-email@gmail.com"));
// 设置收件人
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("recipient@example.com"));
// 设置邮件主题
message.setSubject("测试邮件");
// 设置邮件内容
message.setText("这是一封测试邮件的内容");
// 4. 发送邮件
Transport.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
发送 HTML 邮件
// 创建 HTML 格式的邮件内容
String htmlContent = """
<html>
<body>
<h1 style="color: blue;">HTML邮件标题</h1>
<p>这是一封 <b>HTML</b> 格式的邮件</p>
<ul>
<li>项目1</li>
<li>项目2</li>
</ul>
</body>
</html>
""";
message.setContent(htmlContent, "text/html; charset=utf-8");
发送带附件的邮件
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
// 创建多部分邮件
MimeMultipart multipart = new MimeMultipart();
// 创建文本部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText("邮件正文", "utf-8");
multipart.addBodyPart(textPart);
// 创建附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
DataSource source = new FileDataSource("path/to/attachment.pdf");
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName(source.getName());
multipart.addBodyPart(attachmentPart);
// 设置多部分内容
message.setContent(multipart);
发送带内嵌图片的邮件
// 创建多部分邮件
MimeMultipart multipart = new MimeMultipart("related");
// 创建HTML文本部分
MimeBodyPart htmlPart = new MimeBodyPart();
String htmlContent = """
<html>
<body>
<h1>包含图片的邮件</h1>
<img src="cid:image1" alt="内嵌图片"/>
</body>
</html>
""";
htmlPart.setContent(htmlContent, "text/html; charset=utf-8");
multipart.addBodyPart(htmlPart);
// 创建图片部分
MimeBodyPart imagePart = new MimeBodyPart();
DataSource imageSource = new FileDataSource("path/to/image.jpg");
imagePart.setDataHandler(new DataHandler(imageSource));
imagePart.setContentID("<image1>"); // 设置内容ID,与HTML中的cid对应
imagePart.setDisposition(MimeBodyPart.INLINE);
multipart.addBodyPart(imagePart);
message.setContent(multipart);
完整示例:可配置的邮件工具类
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class MailUtil {
// 邮件配置
private static final String SMTP_HOST = "smtp.gmail.com";
private static final int SMTP_PORT = 587;
private static final String USERNAME = "your-email@gmail.com";
private static final String PASSWORD = "your-app-password";
/**
* 发送邮件
* @param to 收件人
* @param subject 主题
* @param content 内容(支持HTML)
* @param attachments 附件列表
*/
public static void sendMail(String to, String subject,
String content, List<File> attachments)
throws MessagingException {
Properties props = createProperties();
Session session = createSession(props);
MimeMessage message = new MimeMessage(session);
// 设置基本属性
message.setFrom(new InternetAddress(USERNAME));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject);
message.setSentDate(new Date());
// 构建内容
if (attachments != null && !attachments.isEmpty()) {
// 有附件
MimeMultipart multipart = new MimeMultipart();
// 文本部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html; charset=utf-8");
multipart.addBodyPart(textPart);
// 附件部分
for (File file : attachments) {
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(file);
multipart.addBodyPart(attachmentPart);
}
message.setContent(multipart);
} else {
// 无附件
message.setContent(content, "text/html; charset=utf-8");
}
// 发送邮件
Transport.send(message);
}
private static Properties createProperties() {
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");
props.put("mail.debug", "true"); // 调试模式
return props;
}
private static Session createSession(Properties props) {
return Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
}
// 使用示例
public static void main(String[] args) {
try {
String to = "recipient@example.com";
String subject = "测试邮件";
String content = """
<html>
<body>
<h2>测试邮件</h2>
<p>这是一封测试邮件,包含 <b>HTML</b> 格式</p>
</body>
</html>
""";
List<File> attachments = Arrays.asList(
new File("/path/to/file1.pdf"),
new File("/path/to/file2.txt")
);
sendMail(to, subject, content, attachments);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
System.err.println("邮件发送失败:" + e.getMessage());
e.printStackTrace();
}
}
}
常见问题与注意事项
1 Gmail 特殊配置
// Gmail 需要使用 App Password // 1. 开启两步验证 // 2. 生成应用密码 https://security.google.com/settings/security/apppasswords // 3. 使用生成的应用密码代替普通密码 // 或者使用 OAuth2 认证(更安全)
2 常见 SMTP 服务器配置
| 邮箱提供商 | SMTP服务器 | 端口 | TLS/SSL |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587/465 | TLS/SSL |
| Outlook | smtp.office365.com | 587 | TLS |
| QQ邮箱 | smtp.qq.com | 465/587 | SSL/TLS |
| 163邮箱 | smtp.163.com | 465/25 | SSL |
3 错误处理建议
try {
// 发送邮件代码
} catch (AuthenticationFailedException e) {
// 认证失败
System.err.println("邮箱认证失败,请检查用户名密码");
} catch (SendFailedException e) {
// 发送失败
System.err.println("发送失败:" + e.getMessage());
} catch (MessagingException e) {
// 其他邮件异常
e.printStackTrace();
}
4 性能优化
// 1. 使用连接池(推荐 Jakarta Mail 2.x)
// 2. 关闭调试模式(生产环境)
props.put("mail.debug", "false");
// 3. 设置超时时间
props.put("mail.smtp.connectiontimeout", "10000"); // 连接超时
props.put("mail.smtp.timeout", "10000"); // 读取超时
props.put("mail.smtp.writetimeout", "10000"); // 写入超时
JavaMail 使用步骤:
- 配置邮件服务器属性
- 创建 Session 对象
- 创建 Message 对象
- 设置邮件内容(文本/HTML/附件)
- 发送邮件
关键点:
- 需要正确的 SMTP 服务器地址和端口
- 大多数邮箱需要开启 SMTP 服务并获取授权码
- 支持文本、HTML、附件、内嵌图片等多种格式
- 注意异常处理和超时设置
实际开发中,建议将邮件功能封装成工具类,方便复用和维护,对于更高的性能要求,可考虑使用 Spring Boot 的邮件支持模块。