Loading... # 使用 `javax.mail`发送邮件的完整教程 `javax.mail` 是 Java 提供的一个强大的邮件发送和接收API。通过它,开发者可以轻松集成邮件功能,比如在 Web 应用中自动发送通知、报告等。本文将详细介绍如何使用 `javax.mail` 发送电子邮件,涵盖基础配置、代码实现、以及常见问题的解决方法。 ## 一、环境准备 ### 1. 导入 JavaMail API 和依赖 在使用 `javax.mail` 之前,需要确保项目中已经包含了相关依赖。`javax.mail` 包在 `Java EE` 中提供,但也可以单独下载或通过 Maven 管理。 #### Maven 依赖 如果你的项目使用 Maven 来管理依赖,你可以在 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> ``` #### 手动下载 如果不是通过 Maven 进行依赖管理,也可以从 [JavaMail 官方网站](https://javaee.github.io/javamail/) 下载 jar 包,然后手动将其添加到项目的 classpath 中。 ### 2. SMTP 服务器的准备 发送邮件需要使用邮件服务提供商提供的 SMTP 服务器。常见的 SMTP 服务器配置如下: - **Gmail SMTP 服务器**: - 服务器地址:`smtp.gmail.com` - 端口:`465`(SSL),或 `587`(TLS) - 需要认证(用户名和密码) - **QQ 邮箱 SMTP 服务器**: - 服务器地址:`smtp.qq.com` - 端口:`465`(SSL) - 需要认证(用户名和授权码) - **企业邮箱 SMTP 服务器**:具体信息需要从企业邮箱提供商处获取。 ## 二、代码实现 接下来,我们以 Gmail SMTP 为例,演示如何使用 `javax.mail` 发送电子邮件。 ### 1. 配置邮件会话 在 Java 中,邮件发送过程分为两个部分:**配置会话(Session)** 和 **创建邮件(Message)**。首先,我们需要配置邮件会话,指定 SMTP 服务器的地址、端口、认证信息等。 ```java import java.util.Properties; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.mail.Session; public class MailSessionConfig { public static Session createMailSession(String smtpHost, String smtpPort, final String username, final String password) { Properties properties = new Properties(); // SMTP 服务器地址 properties.put("mail.smtp.host", smtpHost); // SMTP 服务器端口 properties.put("mail.smtp.port", smtpPort); // 是否启用 SSL properties.put("mail.smtp.ssl.enable", "true"); // 是否需要认证 properties.put("mail.smtp.auth", "true"); // 创建会话对象并配置认证 Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); return session; } } ``` #### 代码解释: - `Properties` 用于存放邮件服务器的配置信息,如 `SMTP` 主机名、端口号、SSL配置等。 - `Authenticator` 负责提供认证信息(用户名和密码),以便邮件服务器验证身份。 ### 2. 创建并发送邮件 有了邮件会话之后,接下来我们可以创建邮件内容,并通过 SMTP 服务器发送出去。 ```java import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendMail { public static void sendEmail(Session session, String fromEmail, String toEmail, String subject, String body) { try { // 创建一封邮件 MimeMessage message = new MimeMessage(session); // 设置发件人地址 message.setFrom(new InternetAddress(fromEmail)); // 设置收件人地址 message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); // 设置邮件主题 message.setSubject(subject); // 设置邮件内容 message.setText(body); // 发送邮件 Transport.send(message); System.out.println("邮件发送成功!"); } catch (MessagingException e) { e.printStackTrace(); } } public static void main(String[] args) { // SMTP 配置 String smtpHost = "smtp.gmail.com"; String smtpPort = "465"; String username = "your-email@gmail.com"; String password = "your-email-password"; // 收件人及邮件信息 String fromEmail = "your-email@gmail.com"; String toEmail = "recipient-email@example.com"; String subject = "Test Email"; String body = "This is a test email sent using JavaMail API."; // 创建邮件会话 Session session = MailSessionConfig.createMailSession(smtpHost, smtpPort, username, password); // 发送邮件 sendEmail(session, fromEmail, toEmail, subject, body); } } ``` #### 代码解释: - `MimeMessage` 类用于创建电子邮件,支持设置发件人、收件人、主题、内容等。 - `Transport.send()` 用于将创建的邮件通过指定的 SMTP 服务器发送出去。 - `InternetAddress` 用于封装发件人和收件人的邮件地址。 ### 3. 发送 HTML 格式邮件 如果你想发送 HTML 格式的邮件,而不仅仅是普通文本,只需要稍微修改一下邮件内容的设置: ```java message.setContent("<h1>This is a HTML email</h1>", "text/html; charset=utf-8"); ``` 这样,邮件的内容就会以 HTML 格式展示,可以在邮件中添加图片、超链接等元素。 ### 4. 发送带附件的邮件 如果你需要发送带附件的邮件,可以使用 `MimeBodyPart` 和 `Multipart` 来构建多部分邮件。 ```java import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Multipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; // 创建邮件的多部分内容 Multipart multipart = new MimeMultipart(); // 添加邮件文本内容 MimeBodyPart textBodyPart = new MimeBodyPart(); textBodyPart.setText("This is the email body"); multipart.addBodyPart(textBodyPart); // 添加附件 MimeBodyPart attachmentBodyPart = new MimeBodyPart(); FileDataSource source = new FileDataSource("path/to/file.txt"); attachmentBodyPart.setDataHandler(new DataHandler(source)); attachmentBodyPart.setFileName("file.txt"); multipart.addBodyPart(attachmentBodyPart); // 将多部分内容设置到邮件中 message.setContent(multipart); ``` #### 代码解释: - `MimeBodyPart` 表示邮件的一个部分,可以是文本或文件。 - `Multipart` 是一个多部分消息对象,可以包含多个 `MimeBodyPart`。 - `DataHandler` 和 `FileDataSource` 共同处理文件的附件。 ## 三、常见问题解决 ### 1. 邮件无法发送,报认证错误 如果你使用的是 Gmail,需要开启“**低安全性应用**”的访问权限,或使用 **OAuth2** 进行认证。同时,确保输入的用户名和密码正确。 ### 2. 端口问题 不同的邮件服务器使用的端口可能不同,通常 **SSL** 使用端口 **465**,**TLS** 使用 **587**。确保 SMTP 配置中的端口与邮件服务器的要求一致。 ### 3. 防火墙阻止邮件发送 检查你的防火墙设置,确保允许 Java 程序访问外部的 SMTP 服务器。某些公司网络可能会限制 SMTP 流量。 ## 四、脑图:邮件发送流程图 ```mermaid graph TD A[客户端调用API] --> B[创建Session] B --> C[配置SMTP] C --> D[创建MimeMessage] D --> E[设置邮件内容] E --> F[发送邮件] ``` ## 五、总结 通过 `javax.mail` 发送邮件的过程其实并不复杂,主要步骤包括:**配置邮件会话**、**创建邮件内容**、**发送邮件**。除了基本的文本邮件,还可以通过 `javax.mail` 发送 HTML 邮件、附件邮件等。掌握这些基本步骤后,可以将邮件功能灵活地应用到各种 Java 项目中,实现自动化通知、批量邮件发送等功能。 最后修改:2024 年 10 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏