GitHub Actions中smtp-sink无法捕获mailx发送邮件的问题
问题根源:不同mailx实现的行为差异
你遇到的问题核心在于RHEL7默认的mail是Heirloom mailx,而GitHub Actions Ubuntu runner上安装的是bsd-mailx,这两个工具对smtp环境变量的处理逻辑完全不同:
- Heirloom mailx会自动读取
smtp环境变量,优先使用指定的SMTP服务器投递邮件; - bsd-mailx默认忽略这个环境变量,直接调用本地的
sendmail服务投递到本地邮箱,完全绕开了你设置的SMTP监听服务。
解决方案
1. 直接给mail命令指定SMTP参数
bsd-mailx支持用-S参数手动指定配置项,你可以在发送邮件时直接加上SMTP服务器的设置,强制它使用你的smtp-sink:
mail -s 'Test' -S smtp=localhost:8025 runner <<< 'This is a test'
2. 临时配置mailx的全局/用户级配置
如果不想每次都加参数,可以在GitHub Actions步骤里临时修改~/.mailrc(用户级配置),让所有mail命令默认使用指定的SMTP服务器:
echo "set smtp=localhost:8025" >> ~/.mailrc
之后再执行你的邮件发送命令即可。
3. 确保SMTP监听服务完全启动
有时候smtp-sink还没完成端口监听,mail命令就已经执行了,导致连接失败后自动 fallback 到sendmail。可以在启动服务后加个短暂延迟:
export smtp='localhost:8025' smtp-sink -D 'mail_log.txt' -M 1 "$smtp" 1 & sleep 2 # 等待服务启动完成 mail -s 'Test' -S smtp="$smtp" runner <<< 'This is a test'
验证差异
你可以在两个环境分别执行mail -V查看版本:
- RHEL7会输出类似
Heirloom mailx 12.5 7/5/10; - GitHub Actions Ubuntu会输出类似
bsd-mailx 8.1.2-0.20190911cvs-1。
这个版本差异就是导致行为不同的关键原因。
内容的提问来源于stack exchange,提问作者binaryfunt
相关产品推荐
相关产品推荐

