0

0

Java初学者项目实战:构建基本的电子邮件客户端

P粉602998670

P粉602998670

发布时间:2026-02-03 02:41:28

|

760人浏览过

|

来源于php中文网

原创

Java初学者应使用jakarta.mail替代已废弃的javax.mail,因JDK 9+模块化移除了java.activation,旧版会抛NoClassDefFoundError;需显式引入jakarta.mail-api和com.sun.mail:jakarta.mail依赖,并正确配置TLS/SSL、应用专用密码及Authenticator。

java初学者项目实战:构建基本的电子邮件客户端

Java初学者直接写完整邮件客户端容易卡在认证、SSL、协议细节上,不建议从零手撸 SMTP/IMAP 协议。用 javax.mail(现为 jakarta.mail)是合理起点,但要注意 JDK 11+ 默认不包含它,且旧版 javax.mail:mail 已废弃。

为什么 javax.mail 会抛 NoClassDefFoundErrorClassNotFoundException

因为 JDK 9 开始模块化,java.activation 和邮件 API 全被移出默认 classpath;JDK 11 彻底删除 java.activation 模块。即使加了旧 jar,也会因缺少 javax.activation.DataSource 等类失败。

  • ✅ 正确做法:改用 jakarta.mail:jakarta.mail-api + com.sun.mail:jakarta.mail(推荐 2.0.1+)
  • ❌ 不要再用 javax.mail:mail:1.6.2 或更老版本
  • 若用 Maven,必须显式声明依赖,不能指望 JDK 自带

  jakarta.mail
  jakarta.mail-api
  2.1.3


  com.sun.mail
  jakarta.mail
  2.0.1

Session.getInstance(...)Session.getDefaultInstance(...) 的区别与风险

后者已被标记为 @Deprecated,且线程不安全:多个线程调用会共享同一 Session 实例,导致配置(如密码、host)被覆盖。前者才是标准用法,但需传入 Properties 和可选的 Authenticator

  • SMTP 发信必须设 mail.smtp.auth = "true",否则 Gmail/Outlook 等拒绝连接
  • 务必启用 TLS:mail.smtp.starttls.enable = "true"(Gmail 端口 587)或 SSL:mail.smtp.ssl.enable = "true"(端口 465)
  • 避免硬编码密码——用 Authenticator 子类延迟提供凭据,防止日志泄露
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");

Session session = Session.getInstance(props, new Authenticator() {
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication("user@gmail.com", "app-password-here");
  }
});

收邮件时 Store.connect(...)AuthenticationFailedException 的常见原因

Gmail/Outlook 等已停用“用户名+密码”直连,必须用应用专用密码(App Password)或 OAuth2。普通网页登录密码无效,且开启两步验证后才可生成应用密码。

Smart Picture
Smart Picture

Smart Picture 智能高效的图片处理工具

下载

立即学习Java免费学习笔记(深入)”;

  • Gmail:进入 Google 账户 → 安全 → 两步验证 → 应用专用密码(选“邮件”,生成 16 位密码)
  • Outlook:账户安全设置 → 高级安全选项 → 应用密码
  • IMAP 设置必须匹配:Gmail 是 imap.gmail.com:993mail.imaps.enable = "true",且用 Store.connect(host, user, password)
  • 别漏掉 folder.open(Folder.READ_ONLY),否则 getMessages() 返回空数组

初学者最容易忽略的权限与安全细节

本地测试时,IDE 运行的 Java 进程可能被系统防火墙拦截出站连接;企业网络常屏蔽 465/587/993 端口;而 Gmail 对异常登录行为(如新设备、非浏览器 UA)会静默拒收或进垃圾箱。

  • 发信后检查收件箱和垃圾邮件文件夹——Gmail 可能标记为“未加密发送”并降权
  • 收信前先 telnet 测试端口连通性:telnet smtp.gmail.com 587(需安装 telnet 客户端)
  • 不要在代码里写死邮箱密码,哪怕只是 demo;至少用 System.console().readPassword() 交互输入
  • 收到 javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted 时,90% 是密码错或未开应用专用密码

真正跑通收发,关键不在写多少行代码,而在确认每层协议(DNS 解析、TCP 连接、TLS 握手、SMTP/IMAP 认证)是否逐级通过。卡住时优先查网络和账号设置,而不是重写 Java 逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

316

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

754

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

95

2025.08.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

399

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

578

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

567

2023.08.10

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.4万人学习

Java 教程
Java 教程

共578课时 | 56.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号