Composer脚本本身不能发邮件,需借助系统命令(如mail、sendmail)或调用外部PHP脚本;推荐用shell脚本封装构建与邮件逻辑,或通过curl调用SendGrid等邮件网关API实现可靠通知。

Composer脚本里不能直接发邮件,得靠外部命令
Composer 的 scripts 本质是执行 shell 命令或 PHP 回调,它本身不提供 SMTP 或邮件发送能力。想发构建结果邮件,必须借助系统命令(如 mail、sendmail)或调用外部 PHP 脚本。硬塞 mail() 函数进去容易失败——多数 Composer 运行环境没配好 PHP 的 sendmail_path,且无法可靠捕获构建输出。
- 推荐用
php -r写一行脚本调用mail(),但仅限开发机或可控服务器;生产环境更建议用curl推送到邮件网关(如 Mailgun、SendGrid 的 API) - 构建结果要发邮件,关键不是“怎么发”,而是“怎么捕获结果”:Composer 默认不输出结构化状态,需用
--no-ansi --quiet控制输出,并用$?拿退出码 - 别在
post-install-cmd里直接发——它可能被composer install和composer update共用,而你通常只关心 CI 构建失败通知
用 shell 脚本封装构建 + 邮件逻辑最稳
在项目根目录放一个 build-and-notify.sh,由 CI 工具(如 GitHub Actions、GitLab CI)调用,而不是塞进 composer.json 的 scripts。这样能完整控制流程、错误处理和变量注入。
示例片段(假设用 mail 命令):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
#!/bin/bash set -e LOG_FILE="/tmp/composer-build-$(date +%s).log" if composer install --no-ansi --quiet > "$LOG_FILE" 2>&1; then SUBJECT="[OK] Build success for $(basename $PWD)" BODY="Composer install succeeded.\n\n$(tail -n 20 "$LOG_FILE")" else SUBJECT="[FAIL] Build failed for $(basename $PWD)" BODY="Composer install exited with code $?.\n\n$(tail -n 20 "$LOG_FILE")" fi echo -e "$BODY" | mail -s "$SUBJECT" admin@example.com
-
set -e确保任意命令失败立即退出,避免误发“成功”邮件 -
tail -n 20控制邮件体长度,防止日志过大被拒收或卡住 SMTP - 别依赖
mail命令存在——Docker 容器常没装mailutils,改用curl+ SendGrid 更可靠
用 curl 调 SendGrid API 发构建报告(免装依赖)
比系统 mail 命令兼容性更好,尤其适合容器化部署。SendGrid 免费层够用,API 调用只需 CURL 和一个 API Key。
在 build-and-notify.sh 里替换最后的 mail 行为:
curl -X "POST" "https://api.sendgrid.com/v3/mail/send" \
-H "Authorization: Bearer $SENDGRID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"personalizations": [{"to": [{"email": "admin@example.com"}]}],
"from": {"email": "ci@yourapp.com"},
"subject": "'"$SUBJECT"'",
"content": [{"type": "text/plain", "value": "'"$BODY"'"}]
}'
-
$SENDGRID_API_KEY必须作为环境变量注入,绝不要硬编码进脚本或composer.json - Subject 和 Body 中的双引号、换行符要用
"$VAR"包裹并配合单引号拼接,否则 JSON 格式会崩 - SendGrid 返回 HTTP 202 表示接受,但不保证送达;加
-f参数让curl报错时退出,配合set -e才能触发重试逻辑
CI 环境下注意 PATH 和权限,本地测试容易误导
本地 composer install 成功不代表 CI 里能发邮件——CI runner(如 GitHub Actions 的 ubuntu-latest)默认没装 mail,也未必允许外连 SMTP 端口。调试时最容易忽略的是用户权限和环境隔离。
- GitHub Actions 中,
run: ./build-and-notify.sh前必须加chmod +x build-and-notify.sh,否则 Permission denied - GitLab CI 的
alpine镜像没有curl,得先apk add curl;Ubuntu 镜像则默认有,但可能没装ca-certificates,导致 HTTPS 请求失败 - 邮件内容里别写
$_SERVER['USER']或get_current_user()——CI 环境下这些常返回root或空,没实际意义

















