Java 发送邮件

Java 标准库不提供发邮件 API,业界统一使用 JavaMail 扩展库(现已更名 Jakarta Mail)。原理是:程序作为客户端,通过 SMTP 协议把邮件提交给邮件服务器(QQ、163、Gmail 等),由服务器负责投递。学会后程序就能自动发送验证码、告警与报表,是电商、运维类系统的常见需求。

JavaMail 简介与依赖

JavaMail 提供几个核心类:Session 保存服务器配置,Message 描述邮件内容,Transport 负责真正发送。Maven 引入依赖:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

新版项目也可改用 jakarta.mail(artifact 与包名改为 jakarta.mail.*),用法一致。

SMTP 服务器配置

发送前需在邮箱后台开启 SMTP 服务并获取授权码(不是登录密码),常见配置:

邮箱SMTP 服务器端口说明
QQ 邮箱smtp.qq.com465(SSL)设置 → 账户 → 开启 SMTP 生成授权码
163 邮箱smtp.163.com465(SSL)开启"客户端授权密码"
Gmailsmtp.gmail.com587(STARTTLS)需开启两步验证并用应用专用密码

发送纯文本邮件完整示例

需配置环境后运行:填入真实邮箱、授权码与收件人,并确保 465 端口可访问:

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SendMail {
    public static void main(String[] args) throws Exception {
        final String from = "你的邮箱@qq.com";   // 发件邮箱
        final String authCode = "你的SMTP授权码"; // 授权码,非登录密码
        String to = "收件人@example.com";

        Properties props = new Properties();      // 1. 组装服务器配置
        props.put("mail.smtp.host", "smtp.qq.com");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.ssl.enable", "true"); // 465 端口启用 SSL
        props.put("mail.smtp.auth", "true");

        Session session = Session.getInstance(props,  // 2. 创建会话
                new Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(from, authCode);
                    }
                });

        MimeMessage msg = new MimeMessage(session);   // 3. 构造邮件
        msg.setFrom(new InternetAddress(from));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        msg.setSubject("JavaMail 测试邮件");
        msg.setText("你好,这是用 Java 发送的第一封邮件!");

        Transport.send(msg);                          // 4. 发送
        System.out.println("邮件发送成功");
    }
}

运行后登录收件邮箱即可看到邮件。若使用 587 端口,把 ssl.enable 换成 mail.smtp.starttls.enable=true

带附件的 MimeMessage

附件需要 MimeBodyPart 组装部件、MimeMultipart 承载多个部件,最后 setContent 设置给邮件(片段:在 SendMail 的 main 中创建好 msg 后运行):

MimeBodyPart text = new MimeBodyPart();
text.setText("请查收附件");
MimeBodyPart file = new MimeBodyPart();
file.attachFile("D:/报告.pdf");      // 本地文件路径
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(file);
msg.setContent(mp);                  // 邮件内容变为"多部件"

常见失败原因

  • 535 认证失败:把登录密码当授权码用,或授权码抄错、邮箱未开启 SMTP 服务。
  • 连接超时 / SSL 错误:端口配错——465 走 SSL、587 走 STARTTLS,不能混用。
  • 被服务器拒收:发送频率过高或内容含敏感词触发风控;先检查垃圾箱。
  • 缺少依赖:报 ClassNotFoundException(javax.mail.*)说明 jar 未正确引入。

小结:发邮件四步走——引入 JavaMail、配置 SMTP 主机与授权码、构造 Session 和 MimeMessage、调用 Transport.send();遇认证失败优先检查授权码与端口(465/587)。

笔记加载中…