背景

本文是《Java 后端从小白到大神》修仙系列第二十篇,正式进入Java后端世界,本篇文章主要聊Java基础中的邮件发送功能(JavaMail API 应用)。若想详细学习请点击 首篇博文,开始学习。

文章概览

  1. Java 发送邮件核心:JavaMail API
  2. 核心类解析(快速上手,不用死记)
  3. 完整实操示例(文本邮件、HTML邮件、带附件邮件)
  4. 常见邮箱 SMTP 配置(直接复制使用)
  5. 避坑注意事项(新手必看)

一、Java 发送邮件核心:JavaMail API

Java 中发送邮件,核心依赖 JavaMail API(对应 javax.mail 包),本质是通过调用邮箱的 SMTP 服务器,实现邮件的发送。无需深入底层原理,掌握核心类和实操步骤,就能快速实现邮件发送功能。

二、核心类与功能

类名 核心作用 关键说明
javax.mail.Session 配置邮件服务器会话 设置 SMTP 主机、端口、认证开关等
javax.mail.Message 封装邮件内容 常用子类 MimeMessage,处理发件人、收件人、主题、正文
javax.mail.Address 表示邮件地址 常用子类 InternetAddress,封装发件人/收件人邮箱
javax.mail.Transport 发送邮件 核心方法 Transport.send(message),负责将邮件发送到 SMTP 服务器
javax.mail.Authenticator 邮箱认证(用户名+密码) 避免密码泄露,通过重写方法返回认证信息

三、实操示例

以「163邮箱」为例,分步骤实现,每一步都有注释,跟着做就能成功发送邮件。

3.1 第一步:添加 Maven 依赖

项目中引入 JavaMail 依赖,无需手动下载 jar 包,Maven 自动导入:

1
2
3
4
5
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version> <!-- 稳定版本,兼容大部分JDK -->
</dependency>

3.2 第二步:编写邮件工具类

封装通用发送方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

/**
 * 邮件发送工具类
 */
public class EmailSender {

    // 发送邮件的通用方法(参数:收件人邮箱、邮件主题、邮件正文)
    public static void sendEmail(String to, String subject, String content) throws MessagingException {
        // 1. 配置 SMTP 服务器信息(以 163 邮箱为例,其他邮箱替换对应配置即可)
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.163.com");      // SMTP 服务器地址(固定)
        props.put("mail.smtp.port", "465");               // SSL 加密端口(推荐,更安全)
        props.put("mail.smtp.auth", "true");              // 启用邮箱认证(必须开启)
        props.put("mail.smtp.ssl.enable", "true");        // 启用 SSL 加密(防止密码泄露)

        // 2. 创建会话(替换为你的 163 邮箱账号和授权码/密码)
        // 注意:QQ邮箱、Outlook邮箱需用「授权码」代替密码(下文有说明)
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 第一个参数:发件人邮箱账号(你的163邮箱)
                // 第二个参数:发件人邮箱密码/授权码
                return new PasswordAuthentication("[email protected]", "your_password/authorization_code");
            }
        });

        // 3. 构建邮件内容
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("[email protected]")); // 发件人(和上面的账号保持一致)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 收件人
        message.setSubject(subject);  // 邮件主题
        message.setText(content);     // 邮件正文(纯文本格式)

        // 4. 发送邮件
        Transport.send(message);
    }

    // 测试方法(main方法直接运行,验证是否发送成功)
    public static void main(String[] args) {
        try {
            // 替换为收件人邮箱、邮件主题、正文
            sendEmail("[email protected]", "Java 测试邮件", "这是一封来自 Java 代码的测试邮件,发送成功啦!");
            System.out.println("邮件发送成功!");
        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("邮件发送失败: " + e.getMessage());
        }
    }
}

3.3 扩展功能

基于上面的工具类,扩展 HTML 邮件和带附件邮件,无需修改核心逻辑,只需调整邮件内容部分。

3.3.1 发送 HTML 邮件(支持排版、图片等)

将「纯文本正文」替换为 HTML 格式,修改 message.setText(content) 为以下代码:

1
2
// 核心修改:设置 HTML 格式正文,指定编码(防止中文乱码)
message.setContent("<h1 style='color: red;'>HTML 测试邮件</h1><p>这是一封带排版的 HTML 邮件</p><a href='https://yutao.org'>点击访问首篇博文</a>", "text/html;charset=UTF-8");

3.3.2 发送带附件的邮件

添加附件需使用 MimeMultipart(多部分内容,正文+附件),完整代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.io.File;

// 发送带附件的邮件(替换工具类中的 sendEmail 方法即可)
public static void sendEmailWithAttachment(String to, String subject, String content, String filePath) throws MessagingException {
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.163.com");
    props.put("mail.smtp.port", "465");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.ssl.enable", "true");

    Session session = Session.getInstance(props, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("[email protected]", "your_password/authorization_code");
        }
    });

    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress("[email protected]"));
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(subject);

    // 1. 创建多部分内容(正文 + 附件)
    MimeMultipart multipart = new MimeMultipart();

    // 2. 正文部分
    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText(content); // 可替换为 HTML 格式(参考5.3.1)
    multipart.addBodyPart(textPart);

    // 3. 附件部分(替换为你的文件路径,如:D:/test.pdf)
    MimeBodyPart filePart = new MimeBodyPart();
    filePart.attachFile(new File(filePath));  // 传入文件路径
    multipart.addBodyPart(filePart);

    // 4. 设置邮件内容为多部分(正文+附件)
    message.setContent(multipart);

    // 发送邮件
    Transport.send(message);
}

四、常见邮箱 SMTP 配置

不同邮箱的 SMTP 服务器地址和端口不同,整理好直接替换工具类中的配置即可,避免踩坑:

邮箱服务商 SMTP 服务器地址 推荐端口(SSL) 特殊说明
163 邮箱 smtp.163.com 465 直接用邮箱密码即可(需开启 SMTP 服务)
QQ 邮箱 smtp.qq.com 465 需用「授权码」代替密码(下文有开启方法)
Gmail smtp.gmail.com 465 需开启 Gmail 第三方应用访问权限
Outlook smtp.office365.com 587(TLS) 端口用 587,需开启 TLS 加密(props 中添加 ssl.enable=false,添加 mail.smtp.starttls.enable=true)

五、避坑注意事项

  • 必须开启 SMTP 服务:登录邮箱 → 进入设置 → 找到「SMTP 服务」并开启(QQ 邮箱需额外生成授权码)。
  • 密码/授权码问题:QQ 邮箱、企业邮箱不能用登录密码,需生成「授权码」(QQ 邮箱:设置 → 账户 → 开启 POP3/SMTP → 生成授权码)。
  • 避免硬编码密码:实际开发中,不要把邮箱账号、密码写死在代码里,建议从配置文件(如 application.properties)或环境变量中读取。
  • 中文乱码解决:发送 HTML 邮件时,务必指定编码 text/html;charset=UTF-8;纯文本邮件若乱码,可替换 setText 为 setText(content, “UTF-8”)。
  • 异常处理:重点捕获两个异常:AuthenticationFailedException(认证失败,大概率是账号/密码错误)、MessagingException(通信错误,大概率是 SMTP 配置错误)。

六、发送邮件完整流程

配置 SMTP 服务器参数 → 创建邮箱认证会话 → 构建邮件内容(发件人、收件人、主题、正文) → 调用 Transport 发送邮件。

七、总结

Java 发送邮件的核心是 JavaMail API,无需深入底层,掌握「核心类作用 + 实操步骤 + 常见配置」,就能快速实现各类邮件发送功能。