群晖NAS Docker部署Redmine5.0.2 网页端无法发送邮件通知
问题根因
这个故障和SMTP账号、认证方式配置无关,核心是Redmine Web工作进程与CLI Rake进程的运行环境差异,结合Docker容器的TLS证书配置缺陷导致:
- 你在命令行执行
rake redmine:email:test[User]时,是前台独立运行的Ruby进程,会自动搜索容器内所有可用的CA证书路径完成TLS握手,只要账号密码正确就能发信成功,无法代表Web侧的运行状态。 - Web端处理发信请求的是Puma/Unicorn常驻工作进程,sameersbn/redmine镜像默认没有给Rails生产环境显式指定CA证书路径,进程发起SMTPS/STARTTLS连接时会卡在证书校验环节,直到触发
Net::ReadTimeout with #<Socket:(closed)>错误,连接被强制断开。 - 你测试无加密的SMTP服务器时不需要走TLS证书校验流程,因此不会触发该问题。
排查解决步骤
1. 补全SMTP配置的TLS参数
编辑Redmine的config/configuration.yml文件,在production环境的smtp_settings配置段补充TLS相关参数,原有已配置的地址、端口、账号、密码、authentication: :login项保留即可:
production: email_delivery: delivery_method: :smtp smtp_settings: # 以下为需要补充的参数 # 用587端口STARTTLS加密时开这个,用465端口SMTPS就把这行改成 tls: true enable_starttls_auto: true openssl_verify_mode: 'peer' ca_file: "/etc/ssl/certs/ca-certificates.crt" read_timeout: 60
2. 校验容器内CA证书完整性
进入Redmine运行容器执行以下操作,确认根证书文件存在且可用:
# 进入容器命令行,替换成你实际的Redmine容器名称 docker exec -it redmine bash # 检查CA证书文件是否存在 ls /etc/ssl/certs/ca-certificates.crt
如果提示文件不存在,直接在容器内执行以下命令安装根证书包:
apt update && apt install -y ca-certificates
安装完成后退出容器,重启Redmine容器。
3. 排查群晖侧网络拦截
如果上述操作后还是超时,做两个检查:
- 进入群晖Docker管理页,把Redmine容器的网络模式从默认bridge改为host模式再测试,部分版本群晖Docker的bridge网桥会对长连接TLS握手做不合理的超时截断
- 检查群晖自带防火墙、安全顾问的出站规则,确认没有拦截容器进程发往SMTP服务465/587端口的请求,群晖部分安全规则会默认拦截非常驻系统进程发起的加密出站连接
4. 修复验证
直接登录Redmine Web后台,进入邮件通知设置页点击发送测试邮件即可,不需要重复执行rake命令验证——rake命令跑通仅能证明CLI环境配置正常,和Web进程的运行环境不互通。
内容的提问来源于stack exchange,提问作者mululu
相关产品推荐
相关产品推荐

