PHP脚本无法使用电子邮件管道写入文件

时间:2011-11-07 16:41:38

标签: php email permissions piping

我编写了一个简单的脚本来处理收到的电子邮件。以下是经过测试的方案:

一个。脚本功能是发送一封电子邮件,表明在管道地址收到了电子邮件。

通过浏览器测试 - 成功

由CLI测试 - 成功

通过管道测试 - 成功

B中。脚本功能是解析文件并将文件写入文件夹,并发送电子邮件,表明电子邮件是通过管道地址接收的

由浏览器测试 - 写入的文件和发送的电子邮件。

由CLI测试 - 编写的文件和发送的电子邮件。

通过管道测试 - 未写入文件,但发送电子邮件。

我已将脚本简化为读取和写入管道消息的基本功能。我怀疑这个问题是一个许可问题,但我找不到任何支持证据。

我不熟悉CLI,但可以执行某些任务。我不知道在哪里查找管道方案的日志文件。

管道在所有测试场景中都能正常工作。以下是管道调用时失败的简化代码:

#!/usr/bin/php -q
<?php
/* Read the message from STDIN */
$fd = fopen("php://stdin", "r"); 
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
/* Saves the data into a file */
$fdw = fopen("/my/folder/mail.txt", "w");
fwrite($fdw, $email);
fclose($fdw);
/* Script End */

感谢您的帮助。

修改代码:

#!/usr/bin/php -q
<?php
/* Read the message from STDIN */
$email = file_get_contents('php://stdin');

/* Saves the data into a file */
$fdw = fopen("/Volumes/Cobra/Sites/email/mail.txt", "w+");
if (! $fdw) {
    error_log("Unable to open mail.txt for output.", 1, "myemail@mydomain.com", "From: admin@mydomain.com");
} else {
    fwrite($fdw, $email);
}

fclose($fdw);

/* Script End */

错误消息已通过电子邮件发送。怎么办?管道调用脚本运行的用户是什么用户?

1 个答案:

答案 0 :(得分:0)

如果是权限问题,那么fopen将在失败时返回FALSE。你没有检查那个案例,并假设一切正常。尝试

$fd = fopen('php://stdin', 'r');
if (!$fd) {
   die("Unable to open stdin for input");
}

$fdw = fopen(...);
if (!$fdw) {
   die("Unable to open mail.txt for output");
}

如果die()都没有触发,那么它不是权限问题。

作为一种风格的东西,除非你的真实代码更复杂,并且想要以块的形式处理stdin,你可以这样做:

$email = file_get_contents('php://stdin');