2011-11-07 33 views
1

我有一個用於處理收到的電子郵件的簡單腳本。以下是測試場景:PHP腳本無法使用電子郵件管道向文件寫入

A.腳本功能是發送一封電子郵件,指出在管道地址收到一封電子郵件。

通過瀏覽器-tested - 成功

通過CLI -tested - 成功

-tested通過管道 - 成功

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, "[email protected]", "From: [email protected]"); 
} else { 
    fwrite($fdw, $email); 
} 

fclose($fdw); 

/* Script End */ 

的錯誤消息。怎麼辦?管道調用腳本運行的用戶是什麼?

+1

啓用錯誤日誌記錄和記錄所有的錯誤,包括警告和注意事項。然後在調用管道後檢查錯誤日誌。它向您顯示您的錯誤。如果您不明白錯誤信息,請將它們添加到您的問題中,並詢問您不瞭解的內容。 http://php.net/error-reporting – hakre

+0

請原諒我的無知......我有錯誤報告,但是當我通過瀏覽器測試時,我的錯誤不會發生。我有一臺運行雪豹服務器的Xserve。我看到的唯一日誌文件是針對網站的。有什麼我可以查看的PHP日誌? – vmaxheli

+0

是的PHP有它自己的日誌記錄 - 如果你配置PHP錯誤日誌記錄(請參閱我的prev評論中的鏈接,滾動一下,所有與包括日誌記錄在內的錯誤處理相關的php ini設置都在該頁面上)。配置它,然後你可以檢查錯誤日誌。 – hakre

回答

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'); 
+0

我加了die()條件。這是我迷路的地方......我在哪裏尋找消息「無法打開mail.txt輸出。」? – vmaxheli

+0

cron jobs將他們的輸出發送到他們運行的帳戶。你可以使用'error_log'('...')'來讓PHP寫出這些信息,但是你又在同一條船上 - 如果錯誤日誌文件不能被寫入,沒有任何消息。 –

+0

如果無法寫入錯誤日誌,請將其配置爲syslog(臨時)。 http://php.net/manual/en/function.error-log.php - 請參閱目標參數。 – hakre