1

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

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

- 浏览器测试 - 成功

- 由 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 */

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

4

1 回答 1

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() 都没有触发,那么这不是权限问题。

作为一件风格的事情,除非您的真实代码要复杂得多并且确实想要分块处理标准输入,否则您可以这样做:

$email = file_get_contents('php://stdin');
于 2011-11-07T17:14:38.487 回答