讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里如何开发一个简单的邮件发送系统_Java网络与SMTP协议解析

小雪同学_6598

小雪同学_6598

发布时间:2026-02-20 10:47:03

|

954人浏览过

|

来源于php中文网

原创

Java发邮件连不上SMTP服务器主因是网络或认证配置错误,需检查SMTP服务开启、专用密码、端口与TLS设置、防火墙及JVM协议支持。

在java里如何开发一个简单的邮件发送系统_java网络与smtp协议解析

Java发邮件为什么连不上SMTP服务器

绝大多数失败不是代码写错,而是网络或认证配置没对。常见现象是 javax.mail.AuthenticationFailedException 或卡在 connect timed out。

  • 确认邮箱是否开启「SMTP服务」且生成了专用密码(比如QQ邮箱叫「授权码」,不是登录密码)
  • 检查端口:587(STARTTLS)和 465(SSL)不能混用;用 587 时必须设 mail.smtp.starttls.enable=true
  • 防火墙/公司代理可能拦截出站 465 或 587,可临时用本地 telnet 测试:telnet smtp.qq.com 587
  • Java 17+ 默认禁用旧版 TLS,若 SMTP 服务商只支持 TLSv1.1,需显式加 JVM 参数:-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2

用JavaMail API发纯文本邮件的最小可行代码

别一上来就套框架,先跑通最简路径。依赖只需 jakarta.mail(新版)或 javax.mail(旧版),Maven 坐标注意区分。

  • 关键类只有三个:Session、MimeMessage、Transport;其他都是包装
  • Session.getInstance(props, auth) 中的 props 必须包含 mail.smtp.host 和 mail.smtp.port,缺一不可
  • 发件人地址必须和认证账号一致,否则 Gmail/QQ 会静默拒收;收件人用 message.addRecipients(Message.RecipientType.TO, ...),别直接拼字符串
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.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("xxx@qq.com", "your-app-password");
    }
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("xxx@qq.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com"));
message.setSubject("测试");
message.setText("Hello from JavaMail");
Transport.send(message);

发送带附件或HTML正文时容易漏掉的关键设置

不是加个 MimeBodyPart 就完事——内容类型、编码、边界符全靠 Multipart 自动管理,手动错一个就会变成乱码或附件打不开。

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • HTML 邮件必须设 message.setContent(multipart, "text/html; charset=utf-8"),不能只用 setText(..., "UTF-8")
  • 附件路径用 FileDataSource 时,确保文件存在且 Java 进程有读权限;中文路径要避免用 new File("中文.txt") 直接构造,优先用 Paths.get(...).toUri()
  • 如果 HTML 里引用了本地图片,不要用 <img src="file:///...">,会被客户端屏蔽;应作为内嵌资源用 MimeBodyPart.setContentID() 绑定
  • 大附件(>5MB)建议先压缩再发,部分邮箱(如 Outlook)会直接丢弃超限邮件,不报错

生产环境必须处理的三个非功能点

能发出去 ≠ 能稳定用。真实系统里,连接池、异步、重试这三块不补上,早晚出问题。

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

  • 别每次发邮件都新建 Session——它本身是线程安全的,复用即可;但 Transport 不是,每次发完必须 close()
  • 阻塞式发送会拖垮 Web 请求,至少用 CompletableFuture.runAsync() 包一层;高并发场景建议接入 ThreadPoolTaskExecutor(Spring)或 Executors.newFixedThreadPool()
  • 网络抖动导致 SendFailedException 很常见,简单重试 2 次 + 指数退避(如 1s、3s)比直接告警更实用;但别重试认证失败类错误

SMTP 协议本身不保证送达,Java 层最多做到「发出成功」;想确认对方是否收到,得靠回执头(Disposition-Notification-To)或对接邮件服务商的投递日志 API——这点很多人一开始根本没想到

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2311

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

437

2026.01.26

Java Maven专题
Java Maven专题

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

3180

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

329

2026.05.09

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

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

580

2023.10.17

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

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

876

2023.10.18

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

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

1826

2025.08.19

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1598

2023.08.03

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

40

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn