![如何将 PHP mail.log 输出传递给脚本](https://linux22.com/image/645566/%E5%A6%82%E4%BD%95%E5%B0%86%20PHP%20mail.log%20%E8%BE%93%E5%87%BA%E4%BC%A0%E9%80%92%E7%BB%99%E8%84%9A%E6%9C%AC.png)
我使用 php.ini 中的 mail.log 设置记录所有 php 邮件输出。我不想记录到文件中,而是想将日志数据发送到脚本进行实时解析以发出警报。
我已经尝试过:mail.log="|/path/to/script.php"
希望它能像 /etc/aliases 一样工作,但那行不通。任何想法都非常感谢 :-)
系统是 Debian 上的 Postfix。
答案1
一种可能的解决方案是使用 sendmail 命令的包装器,例如,您可以创建如下脚本:
#!/bin/sh
# file: sendmail-wrapper-php
# env vars: ${HTTP_HOST}, ${REMOTE_ADDR}, ${SCRIPT_NAME}, ${PWD}, ${UID}
# ....
# check and alert
#send email.
/usr/sbin/sendmail -t -i $*
并将php_set_envs.php
一些 PHP 变量设置为 shell 环境:
<?php
putenv("HTTP_HOST=".@$_SERVER["HTTP_HOST"]);
putenv("SCRIPT_NAME=".@$_SERVER["SCRIPT_NAME"]);
putenv("SCRIPT_FILENAME=".@$_SERVER["SCRIPT_FILENAME"]);
putenv("DOCUMENT_ROOT=".@$_SERVER["DOCUMENT_ROOT"]);
putenv("REMOTE_ADDR=".@$_SERVER["REMOTE_ADDR"]);
现在您强制所有客户使用此包装器脚本,而不是原始/usr/sbin/sendmail
二进制文件。修改您的php.ini
并添加/更改:
sendmail_path = /usr/sbin/sendmail-wrapper-php
auto_prepend_file = /www/php/php_set_envs.php
确保它具有正确的访问权限:
$ chown root /usr/sbin/sendmail-wrapper-php
$ chmod 755 /usr/sbin/sendmail-wrapper-php
我希望这会有所帮助。
答案2
使用 cron 执行每分钟扫描 mail.log 文件的脚本。
//every minute
* * * * * * php -f /path/to/script.php
我认为这个解决方案你必须使用数据库来记住扫描的条目