kevin
|
ede85e0698
|
feat(imap): 新邮件实时推送(IDLE)+ 后台当前连接监控
- IMAP 推送:imapBackend 实现 backend.BackendUpdater,SMTP 本地投递
与 Web 写信投递成功后 NotifyNewMessage,挂起 IDLE 的客户端即时收到
新邮件 FETCH 通知(按用户名+INBOX 过滤广播,通道满非阻塞丢弃)
- 当前连接:新增 internal/connhub 连接注册中心,SMTP/IMAP/POP3 三协议
注册/注销/用户名/TLS/活跃时间追踪;后台新增「当前连接」页
(/admin/connections,统计卡片+连接表格,每 5 秒自动刷新)
- 新增测试:connhub 并发安全、推送内容/非阻塞/nil 安全、
后台页面渲染;全量 -race 通过
|
2026-08-19 19:40:05 +08:00 |
|
kevin
|
b158b8f1f5
|
feat(outbound): 外发投递多线程化(worker 池 + 每域并发上限)
- 1 个 dispatcher + N 个 worker 池(默认 4)并行投递,启动时立即
扫描清空积压;workers=0/1 退化为串行(旧行为)
- 每收件域并发信号量(默认 2,配置 max_concurrent_per_domain),
防对单个 MX 域并发过多被判定滥发;中继模式统一按 relay 限制
- store 新增 Claim 原子抢占(sending 状态防重复投递),并发下
每封邮件恰好投递一次
- 新增配置 workers/batch_size(替代硬编码 50);dispatcher 改为
抢占后投递、worker 只负责发送,退避重试/退信/状态机不变
- 新增测试:真并发、串行回退、每域上限、临时/永久失败、错误隔离、
Claim 并发原子性与状态可抢占性;-race 无警告
|
2026-08-19 19:23:27 +08:00 |
|
kevin
|
f2493da03e
|
feat(security): IP 阶段性封禁,前3次触发不封禁、第4次起按档位递增
- 封禁规则:达到失败阈值记为一次触发,前 3 次只计数不封禁;
第 4 次起封禁并按档位递增:30分钟(ban_duration_min)→ 3小时
→ 3个月 → 半年(上限);封禁过期后保留记录作为升档依据,
成功登录或管理员解封清零
- BanEntry 新增 BanCount(累计触发次数),每 IP 一条记录 upsert,
不再重复建行;RecordAuthFailure 统一 Web/LDAP/SMTP/IMAP/POP3
五处封禁逻辑,原因带档位(如"第1次封禁:登录失败次数过多
(第4次触发,失败5次)")
- 黑名单页修复:列表仅显示已封禁或曾封禁记录(原因/到期时间必填),
新增封禁次数列与封禁中/已过期状态徽章,移除清理过期按钮
- 用户封禁页显示第 N 次封禁档位;新增档位升级与列表过滤单测
|
2026-08-19 19:07:25 +08:00 |
|
kevin
|
353bfa88f2
|
feat: 新增 SMTP/IMAP/POP3 协议调用日志(含攻击分析筛选)
- 每个连接记录一条日志:协议、端口、来源 IP、用户名、成功/失败、
失败原因(密码错误/IP封禁/中继被拒/发件人伪造/未认证发信等)、
操作摘要、消息数与会话时长
- 管理后台新增「协议日志」页:按协议/状态/IP/用户名/时间筛选,
今日与历史成功/失败统计卡片,分页查看,可手动清理
- 后台每 6 小时自动清理超出 protocol_log_keep_days(默认30天)
的日志;新增 [web] protocol_log_keep_days 配置项
- 修复 POP3 认证既有 bug:handleUSER 丢弃邮箱域名导致 PASS 永远失败
- 新增 store 单测、SMTP/POP3 端到端测试与模板渲染测试
|
2026-08-19 18:49:29 +08:00 |
|
kevin
|
3f28ec20f4
|
fix(security): 修复 P2 中危项(cookie/协议限速/路径遍历/默认口令/中继TLS/安全头/信息泄露)
- 会话 cookie 增加 Secure 标志;新增 [web].cookie_secure 配置
(默认 true,仅本地 HTTP 调试关闭;缺失字段按安全默认处理)
- SMTP/IMAP/POP3 认证接入封禁体系(store.RecordAuthFailure 与 Web
共用 ban_entries):失败计数达 ban.max_fail_attempts 即封禁 IP,
已封禁 IP 拒绝认证,堵住协议层暴力破解
- 附件存储路径遍历防护重写:FullPath 白名单校验(UUID 文件名格式)
+ baseDir 前缀兜底,非法路径返回错误;Save 扩展名白名单化
- 初始管理员不再使用 admin/admin:密码取 MAILGO_ADMIN_PASSWORD 或
随机生成并打印一次;新增 MustChangePassword 首登强制改密
(管理员重置密码同样触发)
- 外发中继默认验证 TLS 证书(保护 AUTH 凭据,防 MITM),直投 MX
保持机会式 TLS;新增 outbound.relay_tls_insecure 开关(默认 false)
- 新增安全响应头中间件:HSTS、X-Frame-Options DENY、nosniff、
Referrer-Policy、基础 CSP(frame-ancestors 'none' 防点击劫持,
connect-src/form-action 'self' 防数据外泄)
- LDAP/OAuth 登录错误统一为通用文案,原始错误只写日志,
不再回显邮箱/内部细节(防用户枚举与信息泄露)
- 新增 25 个回归测试:cookie 标志、封禁阈值、路径遍历用例、
中继 TLS 验证(自签证书 STARTTLS 集成)、安全头、OAuth 文案
部署注意:升级后所有会话失效需重新登录;若直接以 HTTP 提供
服务需显式配置 cookie_secure = false。
|
2026-08-19 16:45:21 +08:00 |
|
kevin
|
551ed981de
|
fix(security): 会话密钥改为随机生成,修复硬编码密钥可伪造管理员会话
安全审计 P0 修复:旧版会话签名密钥硬编码在源码中(源码公开即泄露),
任何人可据此伪造 isAdmin 会话接管后台。
- config: 新增 [web].secret_key,首启/升级时用 crypto/rand 自动生成
32 字节随机密钥并持久化;旧硬编码值自动替换
- config: 支持 MAILGO_SECRET_KEY 环境变量覆盖(覆盖值不落盘)
- config: 配置文件权限收紧为 0600(同时保护 relay_password 等敏感字段)
- web: NewWebServer 校验密钥(空/旧默认值/短于16字节拒绝启动)
- test: 伪造会话拒绝、密钥生命周期(生成/持久化/重启稳定/env不落盘)等
9 个测试
- docs: README 配置参考、security_todo.md 安全修复清单
部署注意:升级重启后所有用户需重新登录。
|
2026-08-19 16:21:28 +08:00 |
|
dsh
|
df5ea7b228
|
docs: README 增加界面预览截图与 QQ 邮箱风格界面说明
|
2026-08-17 04:50:53 -04:00 |
|
dsh
|
f0b9ad3e6f
|
feat: 管理后台一键从 Caddy 获取证书 + TLS 证书热加载
- 域名编辑页新增“从 Caddy 获取证书”按钮:一键把本机 Caddy 已签发的
证书与私钥导入该域名的 TLS 目录并自动启用 TLS,支持通配符证书
(如 *.example.com 可匹配 mail.example.com),成功/失败均回显横幅
- 新增 internal/caddycert:搜索 Caddy 证书存储(同步镜像目录优先、
caddy.data_dir 与常见位置兜底),校验密钥对/有效期/SAN,并给出
可操作的中文错误提示(未找到/证书无效/权限不足)
- install.sh 新增 setup-caddy-cert:安装 root 权限的 systemd
path+timer 同步任务(mailgo-caddy-sync),把 Caddy 证书树镜像到
/srv/mail_go/tls/caddy(证书续期后自动更新、每日兜底),另授予
ACL 作为直接读取兜底;install 时自动检测并配置
- 新增 [caddy] data_dir 配置节,支持自定义 Caddy 数据目录
- 新增 internal/tlsutil:TLS 证书热加载器,每次握手按需重载证书
文件(mtime 检测),重载失败继续使用旧证书兜底并节流重试;
应用于 SMTPS 465/IMAPS 993/POP3S 995 与 STARTTLS,导入或上传
新证书后无需重启服务即生效
- 证书来源动态切换:协议显式配置优先,否则取首个启用 TLS 且有证书
的域名(10 秒缓存),新域名一键导入证书后自动切换
- 更新 README 与界面文案(去掉“重启服务生效”提示)
|
2026-08-16 23:39:43 -04:00 |
|
dsh
|
7ce8751f46
|
feat: 出站地址族可配置(ip_family=ipv4/ipv6/auto)+ 源地址绑定(source_ip)
- ip_family 默认 ipv4(保持 PTR/SPF 最可靠的路径);运营商为静态 IPv6
配置 PTR 后可切换 ipv6
- source_ip 绑定出站源地址,避免内核使用轮换的 IPv6 临时隐私地址
(临时地址无 PTR,Gmail 等会拒收)
- 无 MX 回退时按地址族偏好排序 A/AAAA
|
2026-08-16 00:09:53 -04:00 |
|
dsh
|
8fb7aef052
|
fix: 外发优先走 IPv4(Gmail 拒收无 PTR 的 IPv6);新增 smarthost 中继支持
- 出站 SMTP 连接强制 IPv4(tcp4),无 MX 回退时 IPv4 优先:
住宅/动态 IP 的 IPv6 临时地址通常无 PTR,Gmail 会以 5.7.25 拒收,
而 IPv4 一般具备正反向一致的 PTR(实测 Gmail 250 OK)
- [outbound] 新增 relay_host/relay_port/relay_user/relay_password/
relay_starttls:配置后所有外部投递经智能主机中继(AUTH PLAIN、
465 隐式 TLS / 其他端口 STARTTLS),解决服务器 IP 被 Spamhaus PBL
收录时 Outlook/Hotmail 拒收的问题
- 新增 smarthost 中继单元测试
|
2026-08-16 00:09:53 -04:00 |
|
dsh
|
5eb9bc2c71
|
feat: 实现对外邮件投递(外发队列 + MX 直投 + DKIM + 退信 + 管理后台)
- 新增 internal/outbound 模块:MX 查询、SMTP 出站客户端(EHLO/STARTTLS/
MAIL/RCPT/DATA/QUIT)、4xx 临时失败与 5xx 永久失败分类、8BITMIME 支持
- 新增 outbound_messages 队列表与 OutboundStore,后台 worker 指数退避重试
- 永久失败/超限退信到发件人收件箱,包含原因与目标收件人
- 外发邮件使用域名 DKIM 私钥签名(go-msgauth)
- SMTP 提交集成:认证用户可发外部收件人,MAIL FROM 必须等于登录用户邮箱,
未认证外部投递明确拒绝(防开放中继)
- Web 发信集成:外部收件人自动入队,附件以 multipart/mixed + base64 编码
加入邮件正文
- 每用户每分钟/每日发送限速(max_per_day=0 可禁用外部投递)
- 管理后台新增外发队列页面:状态统计、失败原因、手动重试/取消
- 新增 [outbound] 配置段并更新 README / todo.md
|
2026-08-15 17:18:54 -04:00 |
|
kevin
|
7c1ce77563
|
up
|
2026-06-01 20:06:02 +08:00 |
|