我试图在这篇文章中包含尽可能多的信息。
我在Amazon EC2 Ubuntu服务器上使用Postfix,似乎我没有触发地址的PHP脚本。邮件工作正常,但脚本没有解雇。我可能错过了一些简单的东西,并会对此有任何其他想法。
以下代码是脚本的代码。目前,只是一个基本脚本,可以将php://stdin
的内容写入文件。我不确定这是否是编写此脚本的最佳方式,但现在似乎没问题,因为它只是用于解决此问题的临时脚本。
#!/usr/bin/php -q
<?php
$data = '';
$fileName = "parsedData.txt";
$stdin = fopen('php://stdin', 'r');
$fh = fopen($fileName, 'w');
while(!feof($stdin))
{
$data .= fgets($stdin, 8192);
}
fwrite($fh, $data);
fclose($stdin);
fclose($fh);
?>
我已经通过传递包含一些文本的.txt文件验证了这一点。
./test2.php < data.txt
既然我的PHP脚本似乎在本地工作正常,我需要确保它被正确调用。 sudo chmod 777
已在test2.php脚本上运行。这是相关的/ etc / aliases文件条目。
test: "|/usr/bin/php -q /var/test/php/test2.php"
每次更改时都会运行newaliases。这似乎是最正确的语法,因为它完全指定了php的位置。当test@mydomain
未设置为别名时,postfix/local[2117]: 022AB407CC: to=<test@mydomain.com>, relay=local, delay=0.5, delays=0.43/0.02/0/0.05, dsn=2.0.0, status=sent **(delivered to command: /usr/bin/php -q /var/test/php/test2.php)**
会收到来自内部和外部的精美电子邮件。根据syslog,这成功传递给命令而不是maildir。
test: |"php -q /var/test/php/test2.php"
test: "|php -q /var/test/php/test2.php"
test: |"/usr/bin/php -q /var/test/php/test2.php"
test: "| php -q /var/test/php/test2.php"
test: "|/var/test/php/test2.php"
test: |"/var/test/php/test2.php"
别名也是用以下方式编写的,没有成功(因为它们由于语法错误而转到maildir而不是命令,或者脚本没有触发)。
myhostname = domainnamehere.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = domainnamehere.com, internalawsiphere, localhostinternalaws, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command =
home_mailbox = Maildir/
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
我的postfix main.cf文件的相关部分看起来像这样 -
error_log("script has started!");
我在test2.php
的开头有php://stdin
,以便在成功调用脚本时它会出现在php日志文件中。我确保进入php.ini打开error_logging并指定一个位置以便保存到但我无法让它工作。能够让它工作是有帮助的,因为我可以判断脚本在转到{{1}}函数时是否失败,因为处理电子邮件而不是cat'ed .txt文件可能存在一些问题。
我的最终目标是获得一项服务,将某些地址上的电子邮件及其附件保存到MySQL数据库,然后将每个文件/电子邮件的唯一代码返回给用户。有没有比使用PHP脚本更简单的方法来做这样的事情?做squirrelmail或dbmail之类的东西吗?
我用这个完全用尽了我的想法。也许我应该尝试另一种电子邮件服务?
StackOverflow的睿智人士,帮助我!
答案 0 :(得分:1)
首先,chmod 777 <foo>
几乎总是一个巨大的错误。我知道你处于一种绝望状态 - 正如你运行这个命令所表明的那样。您希望为系统的每个部分配置least amount of required privilege系统,以正确完成其工作。这有助于防止安全漏洞和减少needless coupling。但是可执行文件应该不可以被除可执行文件所有者之外的任何人写入 - 即便如此,我强烈建议不要使用它。
现在,关于你的问题:
#!/usr/bin/php -q
<?php
$data = '';
$fileName = "parsedData.txt";
您指的是使用 relative 路径名的文件。这很好,如果你总是对它启动的目录有信心,或者你希望用户控制它启动的目录,但它通常是糟糕的自动化工具的想法。 /etc/aliases
机制可以在postfix
主目录中运行别名命令,它可能会在为此目的创建的/var
中选择一个空目录,并且将来的版本或多或少可以自由更改他们希望这种行为。将此路径名更改为绝对路径名,以显示您希望在何处创建此文件 - 或者在脚本开头插入显式chdir()
调用以将目录更改为你想要你的数据。
下一步:
$fh = fopen($fileName, 'w');
while(!feof($stdin))
{
$data .= fgets($stdin, 8192);
}
fwrite($fh, $data);
您无法确保文件实际已打开。检查这些返回值。他们会很快为您报告失败,帮助您查找代码中的错误或本地配置错误。我不太了解PHP足以告诉你相当于perror(3)
函数会告诉你什么失败了,但是它确实不会太难以让人类阅读解释器中的错误代码。不要忽视错误代码 - 在部署代码后,了解Permission Denied
与File or directory not found
之间的差异可以节省小时。
而且,作为Michael points out,mandatory access control工具可以阻止应用程序在特定位置书写。 Ubuntu上的“默认”MAC工具是AppArmor,但SELinux,TOMOYO或SMACK都是绝佳的选择。运行dmesg
并查看/var/log/audit/audit.log
以查看是否存在违反政策的行为。如果有,修复问题的步骤取决于您使用的MAC系统。因为你在Ubuntu,AppArmor最有可能;运行aa-status
以快速了解系统中限制的服务,aa-logprof
应提示您根据需要修改策略。 (不要盲目地说“允许” - 也许主动漏洞利用尝试被拒绝。)
(如果您还没有使用MAC系统,请考虑这样做。我已经在AppArmor项目上工作了12年,并且不会考虑不限制所有通信的应用程序网络 - 但这是我自己的安全需求。更偏执的人可能希望限制他们的系统,更少偏执的人可能希望限制他们的系统。)