2010-09-14 74 views
2

我創建了一個小型的shell腳本,它將所有的輸入記錄到一個日誌文件中,我以爲我可以替換sendmail二進制文件,從而實現了一種簡單的方法來模擬電子郵件傳遞設置一個可用的sendmail。用虛擬腳本模擬sendmail

但是,這失敗了。原因我不明白。我已經看了PHP的mail.c源碼,並且據我所知(介意你,我在C中不是很有經驗),PHP執行並直接與二進制文件進行通信(在sendmail_path中設置)。但是,當我使用腳本替換sendmail二進制文件時,沒有創建日誌文件,並且腳本替換sendmail將在執行時始終創建日誌文件,而不管是否存在輸入。

該腳本本身工作正常。它的'返回代碼應該符合sendmail的。不同之處在於我的腳本總是返回0,不管輸入是什麼,因爲我並不是真的有興趣檢查輸入是否有效 - 只是我正在得到一些輸入。

是否有可能實現我想要的,即使用sendmail模擬器?

腳本源提供如下:

#!/bin/bash 

LOGDIR=/tmp/sendmail-sim 
NOW=$(date +%Y%m%dT%H%M) 
CNT=1 
FILENAME="$LOGDIR/$NOW.$CNT.log" 

while [ -f $FILENAME ]; do 
    CNT=$(($CNT + 1)) 
    FILENAME="$LOGDIR/$NOW.$CNT.log" 
done 

echo "$0 $*" > $FILENAME 

while read BUF 
do 
    echo $BUF >> $FILENAME 
done 

exit 0 

PS。我目前的sendmail(或者實際上,postfix)確實收到來自PHP的電子郵件,但我不想實際發送任何電子郵件或需要在其開發中的郵件隊列中進行挖掘。

+0

確認 - 您的sendmail腳本在從命令行調用時起作用,但不能從PHP中調用?我不知道PHP運行時如何工作,但我想知道它是否試圖鏈接郵件二進制對象,而不是託管到Unix環境? – JulesLt 2010-09-14 16:36:14

+0

是的,它的工作原理。我還沒有嘗試過使用郵件命令。 (現在在電車上,但會很快測試。) – 2010-09-14 16:47:16

+0

@Jules:我現在使用'mail'命令測試了我的腳本,並且可以確認它的工作原理。現在我修改了腳本,它甚至可以正常工作。 (第一個版本,即使它工作了,只讀'stdin',直到一個空行,這導致消息部分被省略。) – 2010-09-14 17:31:37

回答

0

問題是用戶錯誤,因爲通常。所以,男孩和女孩,不要忘記檢查所有相關文件夾的寫入權限。

1

如果您需要測試PHP應用程序是否能正確格式化併發送電子郵件而不實際發送郵件,我建議您使用Pear Mail軟件包。擺弄你的系統不是一個好主意。

如果您使用郵件從梨,您可以通過將驅動程序從'sendmail'或'smtp'更改爲'模擬'從sendmail切換到smtp到郵件界面的模擬實現。

http://pear.php.net/package/Mail/docs/latest/Mail/Mail.html

http://pear.php.net/package/Mail/docs/latest/Mail/Mail_mock.html

如果你的代碼看起來是這樣的:

mail('[email protected]', 'My Subject', $message); 

然後改變其使用是可檢驗的PEAR郵件:

include('Mail.php'); 
function sendEmail($recipient, $subject, $body, $driver = 'mail') { 
    $m = Mail::factory("mail"); 
    $headers = array(
     "From"=>"[email protected]", 
     "To" => $recipient, 
     "Subject"=> $subject); 
    $m->send($recipient, $headers, $body); 
    return $m; 
} 

// In Production: 
sendEmail('[email protected]', 'My Subject', $message); 

// During testing: 
$m = sendEmail('[email protected]', 'My Subject', $message, 'mock'); 
var_dump($m->sentMessages); 

這是非常粗糙的,既然你應該使用PHPUnit或SimpleTest,但這是另一個時間和地點的主題:)

+0

我很欣賞這個輸入,但我需要一個不管技術如何,都可以工作的解決方案,而不僅僅是PHP腳本。當然PHP是寫這個的最初原因,但是後來發現它有用,例如, shell腳本。幹運行在其模擬中可以有一個較少的抽象層。 – 2011-03-04 05:35:58

+0

即使我的例子是針對PHP的,我認爲您必須使用其他語言的類似方法,而不是替換系統二進制文件。如果你更換它們,你會遇到問題。 1.在更換二進制文件之前,您的軟件將在另一臺機器上運行不同。 2.在同一臺機器上運行的其他軟件的行爲方式與預期不同。 – 2011-03-04 12:12:48

1

的說明,如果你只是想抓住標準輸入,並將其寫入到一個文件,你不需要一條線路在同一時間:你可以寫

cat - >> $FILENAME 
2

我用Fakemail爲這個目的在過去。它接受SMTP連接,但將所有郵件寫入文件,而不是將它們作爲電子郵件發送。有python和perl的實現。

http://www.lastcraft.com/fakemail.php

我們配置Apache來服務於Fakemail被寫入該目錄。這對於員工來說是一種快速簡便的方式,可以查看Fakemail收到的內容和目的地等信息。由於各種原因,HTML電子郵件的格式有些不穩定,所以它對於審查HTML電子郵件的格式不是很有用。