我编写了一个简单的脚本来处理收到的电子邮件。以下是经过测试的方案:
一个。脚本功能是发送一封电子邮件,表明在管道地址收到了电子邮件。
通过浏览器测试 - 成功
由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 */
错误消息已通过电子邮件发送。怎么办?管道调用脚本运行的用户是什么用户?
答案 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');