Java案例如何实现邮件发送功能?

wen java案例 3

本文目录导读:

Java案例如何实现邮件发送功能?

  1. 添加 Maven 依赖
  2. 核心代码实现
  3. 常见邮箱 SMTP 配置参考
  4. 使用 SSL 连接(端口 465)
  5. 发送带附件的邮件
  6. 常见问题与排查
  7. 生产环境建议

Java 实现邮件发送功能通常使用 JavaMail 相关 API,虽然 Java 标准版(Java SE)不直接包含 JavaMail,但可以通过添加依赖(如 javax.mailjakarta.mail)来实现。

下面是一个从零开始的完整案例,包含依赖导入核心代码常见配置


添加 Maven 依赖

如果使用 Maven 项目,在 pom.xml 中添加以下依赖(二选一,取决于你的 Java 或 Spring Boot 版本):

方案 A:Java 8 / javax.mail(传统方式)

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

方案 B:Java 11+ / jakarta.mail(新标准,推荐)

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>

注意:如果你使用 Spring Boot,它已经内置了 spring-boot-starter-mail,其中自动包含了相关依赖。


核心代码实现

以下是一个可直接运行的纯 Java 邮件发送类(以 javax.mail 为例,jakarta.mail 用法几乎相同,仅包名不同):

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class EmailSender {
    // 发件人邮箱配置(以 QQ 邮箱为例)
    private static final String SENDER_EMAIL = "your_email@qq.com";
    // 授权码(不是登录密码!)
    private static final String SENDER_PASSWORD = "your_authorization_code";
    // SMTP 服务器地址
    private static final String SMTP_HOST = "smtp.qq.com";
    private static final int SMTP_PORT = 587;  // 或 465(SSL)
    public static void main(String[] args) {
        // 收件人
        String recipient = "recipient@example.com";
        String subject = "Java 邮件发送测试";
        String content = "<h1>Hello!</h1><p>这是来自 Java 程序的测试邮件。</p>";
        sendEmail(recipient, subject, content);
    }
    public static void sendEmail(String recipient, String subject, String content) {
        // 1. 设置连接属性
        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"); // 启用 TLS
        // 2. 创建 Session(身份验证)
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(SENDER_EMAIL, SENDER_PASSWORD);
            }
        });
        // 可选:开启调试模式,打印与 SMTP 的交互日志
        session.setDebug(true);
        try {
            // 3. 创建邮件对象
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(SENDER_EMAIL));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
            message.setSubject(subject);
            // 设置内容为 HTML 格式(也可设为纯文本:message.setText(content))
            message.setContent(content, "text/html; charset=utf-8");
            // 4. 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!");
        } catch (MessagingException e) {
            e.printStackTrace();
            System.err.println("邮件发送失败:" + e.getMessage());
        }
    }
}

常见邮箱 SMTP 配置参考

邮箱服务 SMTP服务器 端口(TLS/SSL) 特殊说明
QQ邮箱 smtp.qq.com 587 (TLS) / 465 (SSL) 需开启 SMTP服务 并获取 授权码
163邮箱 smtp.163.com 25 / 465 (SSL) 同样需要授权码
Gmail smtp.gmail.com 587 (TLS) / 465 (SSL) 需开启“允许不够安全的应用”或使用应用专用密码
Outlook smtp.office365.com 587 (TLS) 使用邮箱密码即可(部分需应用密码)

关于授权码:以 QQ 邮箱为例,登录网页版 → 设置 → 账户 → 开启“POP3/SMTP服务”,系统会生成一个 16 位授权码,填入代码中作为密码,不要使用邮箱登录密码


使用 SSL 连接(端口 465)

如果选择 SSL 方式连接,修改 props 配置如下:

Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST);
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

其余代码不变。


发送带附件的邮件

如果需要添加附件,使用 MimeBodyPartMultipart 组合:

import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.io.File;
// 在创建 Message 后添加以下逻辑:
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html; charset=utf-8");
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File("文件路径/example.pdf"));
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);

常见问题与排查

问题 检查方向
AuthenticationFailedException 检查邮箱账号和授权码是否正确
Could not connect to SMTP host 检查 SMTP 地址、端口、防火墙是否开放
com.sun.mail.util.MailConnectException 检查网络能否访问外网,某些公司内网会屏蔽 SMTP
国内邮箱发送被拒 尝试启用 SSL 或更换端口
发送超时 适当增加超时设置:props.put("mail.smtp.connectiontimeout", "5000")

生产环境建议

  • 不要硬编码密码:使用配置文件(application.yml / 环境变量)读取敏感信息。
  • 使用 Spring Boot 的 MailSender:可以更优雅地实现,只需配置 spring.mail.* 属性即可。
  • 异步发送:如果邮件发送较慢,建议使用线程池或消息队列处理,避免阻塞业务主流程。

抱歉,评论功能暂时关闭!