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

Python:手动运行正常但crontab执行邮件附件失效问题排查

嘿,这个问题我太熟了!crontab跑脚本和手动执行的核心差异就是工作目录和环境变量,你的附件加不上大概率是路径搞的鬼,咱们一步步来搞定它:

问题根源

crontab默认的工作目录是你的用户主目录(比如/home/your_username/),但你手动跑脚本时是在脚本所在的文件夹里执行的,所以代码里glob.glob('*%s'%fi)这种相对路径,在crontab环境下根本找不到目标文件,自然没法添加附件。

具体解决方法

方法一:给所有文件路径加上绝对路径(最稳妥)

修改你的Python代码,先获取脚本本身的绝对目录,再基于这个目录去找目标文件,这样不管在哪里执行脚本都能准确定位文件:

#!/usr/bin/python
import smtplib
import os
import datetime
import glob
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# 获取脚本所在的绝对目录(关键修改)
script_dir = os.path.dirname(os.path.abspath(__file__))

now = datetime.datetime.now()
fi = now.strftime("%d%m%Y" '_0600_final.txt')
# 用绝对路径拼接后查找文件(关键修改)
files1 = glob.glob(os.path.join(script_dir, '*%s' % fi))

time.sleep(20)
# 后面的代码保持不变...

方法二:在crontab里指定工作目录

编辑crontab任务时,先切换到脚本所在的目录再执行脚本,这样相对路径就和手动执行时一致了:

# 举个例子,假设你的脚本在/home/you/scripts/目录下
0 7 * * * cd /home/you/scripts/ && python your_script.py

方法三:加日志调试(排查问题用)

如果还是有问题,可以在脚本里加些日志输出,看看crontab执行时的状态:

# 在脚本开头附近加这些打印
print("当前工作目录:", os.getcwd())
print("找到的文件列表:", files1)

然后把crontab的输出重定向到日志文件,方便查看:

0 7 * * * python /home/you/scripts/your_script.py >> /var/log/email_script.log 2>&1

打开日志文件就能知道是没找到文件,还是有其他权限、环境问题。

额外注意事项
  • 确保crontab执行的用户和你手动跑脚本的用户是同一个,不然可能出现文件权限问题,读不到附件。
  • 如果用了Python虚拟环境,crontab里要写虚拟环境的Python绝对路径,比如/home/you/venv/bin/python,而不是直接写python。

内容的提问来源于stack exchange,提问作者SAEED MAHMOOD ASLAM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:38