PHP计划任务邮件通知需拆分执行与通知:用cron调度脚本并捕获exit码和日志,PHP脚本读取日志判断成败,用PHPMailer经SMTP发送结构化邮件,严格配置授权码、端口及云服务器安全组,增强唯一ID、异常捕获和日志轮转。

PHP 环境下实现计划任务执行结果的邮件通知,核心不是“让 PHP 自己定时发”,而是把「任务执行」和「结果通知」拆开:先用系统级调度(如 cron)运行脚本,再由脚本判断成败、组装内容、调用可靠邮件机制发信。关键在链路完整、错误不丢、邮件可送达。
一、用 cron 触发任务并捕获执行结果
cron 本身不返回结果,必须由被调用的 PHP 脚本主动处理 exit code 和输出。推荐方式是:脚本末尾用 exit(0) 表示成功,exit(1) 或其他非零值表示失败,并把关键日志写入标准输出或临时文件。
- 编辑 crontab:
crontab -e - 添加一行(例如每小时执行一次):
0 * * * * /usr/bin/php /path/to/deploy.php > /tmp/deploy.log 2>&1 -
> /tmp/deploy.log 2>&1把 stdout 和 stderr 都存下来,供后续读取分析
二、PHP 脚本内判断成败并触发邮件
不要在 cron 行里直接写 mail 命令(难调试、无上下文)。应在 PHP 脚本结尾处统一处理:
- 用
file_get_contents('/tmp/deploy.log')读取本次执行日志 - 检查是否含关键词(如 "Deployed")、是否出现 "Exception" 或 "Error",或直接依赖上一步
exit()的状态码 - 构造结构化邮件内容:包含时间、脚本名、退出码、前 20 行日志摘要
- 调用 PHPMailer(强烈推荐)发送,而非原生
mail():它支持 SMTP 认证、TLS/SSL、明确异常捕获,且能避免因 sendmail 配置问题导致静默失败
三、邮件配置必须绕过常见陷阱
90% 的“发不出”问题出在配置层,不是代码逻辑:
立即学习“PHP免费学习笔记(深入)”;
- SMTP 主机、端口、加密方式必须严格匹配服务商要求:QQ 邮箱用
smtp.qq.com + 587 + TLS,163 邮箱用smtp.163.com + 465 + SSL - 密码字段填 SMTP 授权码,不是邮箱登录密码(尤其 QQ/163/Gmail)
- 云服务器(阿里云、腾讯云)默认屏蔽 25/465/587 出站端口,需在安全组和实例防火墙中手动放行
- 本地开发时,若用 Docker,确认容器网络能访问外网 SMTP 服务(可
docker exec -it xxx ping smtp.qq.com测试)
四、增强健壮性:防重复、防阻塞、可追溯
生产环境不能靠“试一次就完事”:
- 给每次任务生成唯一 ID(如
date('YmdHis') . '_' . bin2hex(random_bytes(4))),写入日志和邮件主题,方便追踪 - 邮件发送逻辑用
try/catch包裹,失败只记录到 error_log,不中断主流程 - 避免在 Web 请求中同步发信——计划任务脚本本身就是 CLI 模式,天然异步,无需队列;但若任务本身耗时长,可考虑把发信逻辑单独拆成一个轻量脚本,用
exec("nohup php notify.php ... &")异步启动 - 保留最近 7 天的日志文件,按日期轮转,防止磁盘打满



















