Java邮件推送核心是订阅管理与发送,可用内存、JSON文件或Redis存邮箱;用JavaMail API配置SMTP、构建MimeMessage发送;支持手动、定时或事件触发;需含退订链接、企业发件人、确认订阅及分批限流。

Java中实现简单的订阅邮件推送,核心是两部分:用户订阅管理 + 邮件定时/触发发送。不依赖复杂中间件,用标准Java Mail API + 内存或轻量存储(如H2、Redis、甚至文件)就能跑通基础流程。
用户订阅数据怎么存
刚起步时不用上MySQL集群。推荐三种方式:
-
内存List/Set:适合演示或单机测试,启动时加载,关机即丢。用
ConcurrentHashMap存邮箱+订阅时间,线程安全又快 -
本地JSON/Properties文件:每次增删都序列化写入,简单直接。比如用Jackson把
List邮箱列表存成subscribers.json -
Redis Set:推荐生产小规模使用。执行
SADD subscribers user@example.com,去重+高效读取,还能配合TTL做临时订阅
怎么发邮件(JavaMail API 实操要点)
别被“配置多”吓住,关键就三步:
- 加依赖:
com.sun.mail:javax.mail:1.6.2(注意不是旧版javax.mail:mail) - 配Session:用
SMTP协议连QQ邮箱或163(需开启SMTP并获取授权码),别用密码直连 - 构造MimeMessage:设置收件人(批量可用
message.setRecipients(Message.RecipientType.TO, addresses))、主题、HTML正文(message.setContent(html, "text/html;charset=UTF-8"))
小技巧:发前先用Transport.connect()测试连通性;失败时捕获AuthenticationFailedException或SendFailedException,别让整个推送卡住。
立即学习“Java免费学习笔记(深入)”;
推送逻辑怎么触发
根据场景选一种,不一定要“实时”:
-
手动触发:提供一个HTTP接口(如Spring Boot的
@PostMapping("/push")),调用后遍历所有订阅者发一封模板邮件 -
定时推送:用
@Scheduled(cron = "0 0 9 * * ?")每天早9点发简报,配合TaskScheduler即可 - 事件驱动:监听业务事件(如订单完成),发布
ApplicationEvent,监听器异步发通知邮件
避免被当垃圾邮件的小细节
再小的系统也要注意合规和送达率:
- 每封邮件必须带退订链接,例如
点击退订,点击后从存储里删掉该邮箱 - 发件人地址用企业邮箱(如
notice@yourdomain.com),别用个人QQ邮箱当from - 首次推送前,先发一封“确认订阅”邮件(含验证码或确认链接),过滤无效邮箱
- 单次发送别超50人,大量用户分批+加随机延时(
Thread.sleep(100 + new Random().nextInt(200))),防被服务商限流
基本上就这些。不需要消息队列、也不用微服务拆分,一个Spring Boot模块+几页代码,就能支撑几千用户的常规邮件通知。关键是把订阅、发送、退订三个闭环走稳,后面再按需加模板引擎(Thymeleaf)、异步线程池、发送记录日志就行。










