You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ssmtp在cron执行备份脚本时异常:发件人与收件人被替换导致邮件无法送达

ssmtp在cron执行备份脚本时异常:发件人与收件人被替换导致邮件无法送达

看起来你遇到的是cron环境与交互式shell环境差异导致的ssmtp行为不一致问题,我来帮你拆解原因和解决办法:

核心原因分析

cron运行脚本时,会使用极简的环境变量(比如PATH更短、没有用户登录时加载的环境配置),同时ssmtp的发件人/收件人逻辑会受以下因素影响:

  • 默认以运行脚本的系统用户(cron默认用root的话就是root@yourdomain)作为发件人,除非明确指定
  • 如果ssmtp配置里的FromLineOverride设为NO,会忽略你脚本里的From头,强制用系统默认发件人
  • 脚本里的命令可能因为PATH问题执行失败,间接导致邮件内容或发送逻辑异常

具体解决步骤

1. 强制指定发件人到ssmtp命令

修改脚本里的ssmtp调用,添加-f参数明确指定发件人邮箱,这样不管环境如何,都会用你指定的发件人:

ssmtp -v -F "Backup report" -f your-sender-email@domain.com me@mydomain.com < /backup/$DAN/backup.log

这里的your-sender-email@domain.com替换成你手动执行时正常工作的发件人(比如你日志里的recipient@domain.com)。

2. 检查ssmtp配置文件

编辑/etc/ssmtp/ssmtp.conf,确保以下配置:

FromLineOverride=YES

这个配置允许脚本里的From头覆盖系统默认的发件人,避免cron运行时被强制替换成root@xxx。

3. 给脚本里的命令添加绝对路径

cron的PATH默认很窄,很多命令(比如tree、du、rsync)可能找不到,导致脚本执行异常。先查命令的绝对路径:

which tree && which du && which rsync && which ssmtp

然后替换脚本里的对应命令,比如:

FILES=`/usr/bin/tree -f /backup/$DAN/ | /usr/bin/wc -l`
SIZE=`/usr/bin/du -sh /backup/$DAN/`
/usr/bin/rsync -avh --progress -h /mnt/share/ /backup/$DAN
/usr/sbin/ssmtp -v -F "Backup report" -f your-sender-email@domain.com me@mydomain.com < /backup/$DAN/backup.log

4. 给脚本设置完整的环境变量

在脚本开头添加PATH配置,确保所有命令都能被找到:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

5. 调试cron执行日志

修改cron任务,把脚本的输出和错误重定向到日志,方便排查问题:

0 22 * * * /path/to/your/backup-script.sh >> /var/log/backup_cron.log 2>&1

之后查看/var/log/backup_cron.log,就能看到脚本执行时的所有错误信息,比如哪个命令没执行成功。

额外脚本优化点

注意到你脚本里有个笔误:echo >> /backup/$DAN/bekap.log,这里的bekap.log应该是backup.log,会导致这部分内容没写到正确的日志文件里,建议修正。

备注:内容来源于stack exchange,提问作者Marxer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:03:04