You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

javax.mail.session不可访问问题及Java 18发送Gmail方案咨询

问题解决与方案

一、解决"The package javax.mail.session is not accessible"错误

核心原因

javax.mail.Session 并非JDK(包括Java 8/18)自带类,属于Java EE(现Jakarta EE)的邮件API范畴。你添加的requires java.desktop;仅包含JDK内置的少量邮件相关内部类,无法提供完整的javax.mail包支持。

具体修复步骤

  1. 引入正确的邮件依赖

    • Maven项目:在pom.xml中添加依赖(推荐使用Jakarta Mail的最新兼容版本,或传统javax.mail版本)
      <!-- 新版Jakarta Mail(推荐,包名改为jakarta.mail) -->
      <dependency>
          <groupId>com.sun.mail</groupId>
          <artifactId>jakarta.mail</artifactId>
          <version>2.0.1</version>
      </dependency>
      <!-- 传统javax.mail版本(兼容旧代码) -->
      <dependency>
          <groupId>com.sun.mail</groupId>
          <artifactId>javax.mail</artifactId>
          <version>1.6.2</version>
      </dependency>
      
    • 非Maven项目:下载对应jar包(如jakarta.mail.jar+jakarta.activation.jar,或javax.mail.jar+activation.jar),添加到Eclipse项目的构建路径(右键项目→Build Path→Add External Archives)。
  2. 模块化项目配置(若使用module-info.java)

    • 若用Jakarta Mail,在module-info.java中添加:
      requires jakarta.mail;
      // 若代码中用到反射实例化邮件类,需开放对应包给Jakarta Mail
      opens com.yourpackage to jakarta.mail;
      
    • 若用传统javax.mail,添加:
      requires java.mail; // 旧版为自动模块
      
  3. JDK切换后的验证
    切换到JDK 1.8后,需确保依赖jar已正确添加到构建路径,且Eclipse的项目JRE已切换为1.8(右键项目→Properties→Java Build Path→Libraries→JRE System Library→Edit选择对应JDK)。

二、Java 18发送Gmail的最优方案

推荐技术栈

使用Jakarta Mail 2.x(官方推荐的邮件API,完全兼容Java 18),配合Gmail的App密码(开启2FA时必须)进行认证。

关键配置说明

  • Gmail SMTP服务器信息:
    • 主机:smtp.gmail.com
    • 端口:587(TLS)或465(SSL)
    • 认证:需开启SMTP访问,若账号启用了两步验证,需生成App密码(替代原密码);未启用2FA可直接用原密码(不推荐,建议开启2FA)。

代码示例

import jakarta.mail.*;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import java.util.Properties;

public class GmailSender {
    public static void main(String[] args) {
        // 配置邮件属性
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");

        // 认证信息
        String username = "your-gmail-account@gmail.com";
        String password = "your-app-password"; // 开启2FA则用App密码,否则用原密码

        // 创建Session
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            // 创建邮件消息
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient@example.com"));
            message.setSubject("Java 18 Gmail测试");
            message.setText("这是通过Jakarta Mail发送的测试邮件");

            // 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功");
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

注意事项

  1. 确保Gmail账号已开启SMTP访问:登录Gmail→设置→转发和POP/IMAP→开启IMAP访问。
  2. 若使用App密码:需先开启账号的两步验证,然后在Google账号设置→安全→App密码中生成对应密码。
  3. Java 18模块化项目:需在module-info.java中添加requires jakarta.mail;,若代码中使用反射创建邮件对象,需开放对应包给Jakarta Mail。

内容的提问来源于stack exchange,提问作者Heracless123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:40:26