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() もトリガーされない場合、それは権限の問題ではありません。

文体的なことの 1 つとして、実際のコードがはるかに複雑で、stdin をチャンクで処理したい場合を除き、次のようにすることができます。

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