必须用shell脚本包装composer update,通过$?捕获退出码,失败时调用mail命令发utf-8编码中文邮件;邮件正文需用composer show --direct生成json快照并jq比对获取真实包变更差异;邮箱地址须通过环境变量配置,避免硬编码。

Composer update失败时如何触发中文邮件通知
Composer本身不提供失败钩子,直接在composer.json里写scripts无法捕获错误退出码。必须用shell包装命令,靠$?判断上一条命令是否成功。
- 在
composer.json的scripts中定义"post-update-cmd": "sh ./scripts/notify-after-update.sh" -
./scripts/notify-after-update.sh需先执行composer install --no-interaction或composer update --no-interaction,再检查$? - 失败时调用
mail命令发中文邮件,注意设置-a "Content-Type: text/plain; charset=utf-8",否则中文会乱码 - 避免用
sendmail裸调,推荐用mutt或mail并确保系统已配置SMTP(如msmtp)
如何让邮件内容含真实更新差异(而非固定模板)
单纯发“更新完成”没意义,管理员需要知道改了哪些包。Composer没有内置diff输出,得靠临时文件+Git对比实现。
- 运行
composer show --direct --format=json > composer.lock.before.json前先备份当前依赖快照 - 执行
composer update后,再跑一次composer show --direct --format=json > composer.lock.after.json - 用
jq比对两个JSON:例如jq -s 'reduce .[] as $item ({}; .[$item.name] = $item.version)' composer.lock.{before,after}.json | jq -r 'to_entries[] | select(.value[0] != .value[1]) | "\(.key): \(.value[0]) → \(.value[1])"' > diff.txt - 把
diff.txt内容作为邮件正文,用cat diff.txt | mail -s "? Composer更新摘要" -a "From: admin@site.com" admin@example.com
为什么用PHP内置mail()函数容易失败
PHP的mail()函数默认走本地sendmail,多数云服务器(如阿里云、腾讯云)屏蔽25端口,且不支持UTF-8邮件头,中文主题和正文基本不可用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 即使配置
sendmail_path指向msmtp -t,仍需额外设置default_charset = "UTF-8"和mbstring.internal_encoding = "UTF-8" -
mail()无法可靠获取发送结果,失败时静默丢弃,不利于监控 - 更稳妥的做法是用PHP调用
shell_exec("mutt -e 'set content_type=text/plain' ..."),或直接集成phpmailer(但需额外require,破坏轻量原则)
管理员邮箱配置该放哪里才安全又灵活
硬编码邮箱地址在composer.json或脚本里,既不安全也不便于多环境切换。环境变量是唯一合理选择。
- 在部署机的
/etc/environment或用户~/.bashrc中设ADMIN_EMAIL="admin@company.com" - 脚本里用
ADMIN_EMAIL=${ADMIN_EMAIL:-"fallback@example.com"}兜底 - 禁止把邮箱写进Git仓库——哪怕加到
.gitignore,历史提交里也可能残留 - 若用Docker,通过
-e ADMIN_EMAIL=...传入,比挂载配置文件更干净
真正麻烦的不是发邮件,而是确保每次更新都生成可读的差异摘要,并让邮件在各种Linux发行版上稳定送达。UTF-8编码、SMTP认证、环境变量隔离,三者缺一不可。










