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包支持。
具体修复步骤
引入正确的邮件依赖
- 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)。
- Maven项目:在
模块化项目配置(若使用module-info.java)
- 若用Jakarta Mail,在
module-info.java中添加:requires jakarta.mail; // 若代码中用到反射实例化邮件类,需开放对应包给Jakarta Mail opens com.yourpackage to jakarta.mail; - 若用传统javax.mail,添加:
requires java.mail; // 旧版为自动模块
- 若用Jakarta Mail,在
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); } } }
注意事项
- 确保Gmail账号已开启SMTP访问:登录Gmail→设置→转发和POP/IMAP→开启IMAP访问。
- 若使用App密码:需先开启账号的两步验证,然后在Google账号设置→安全→App密码中生成对应密码。
- Java 18模块化项目:需在
module-info.java中添加requires jakarta.mail;,若代码中使用反射创建邮件对象,需开放对应包给Jakarta Mail。
内容的提问来源于stack exchange,提问作者Heracless123
相关产品推荐
相关产品推荐

