2017-03-24 21 views
0

我是Perl的新手,但不是一般的編程。我一直在尋找任何提示如何從Perl中的open()中跳出來,但一直沒有幸運,這就是我在這裏問的原因。從open打開()

我有一個:

$mailprog = '/usr/lib/sendmail'; 
open(MAIL,"|$mailprog -t"); 

read(STDIN, $buffer, 18); 

print MAIL "To: [email protected]\n"; 
print MAIL "From: [email protected]\n"; 
print MAIL "Subject: xxx\n"; 
print MAIL $buffer; 
close (MAIL); 

有什麼辦法我怎麼能塑造輸入到$緩衝區,以便從sendmail的逃避?緩衝區輸入長度是任意的。輸入完全在我的控制之下。非常感謝任何想法!

+2

你是什麼意思「從sendmail轉義」? – choroba

+0

'關閉MAIL'如何?目前還不清楚你想做什麼。 – Borodin

+0

猜測,'read'是阻塞的。因爲否則我不知道。 – Sobrique

回答

0

man sendmail說:

默認情況下,後綴的sendmail(1)從標準輸入讀取 一個消息,直到EOF或直到它讀取一行只用。字符,並且 安排遞送。 Postfix sendmail(1)依靠postdrop(1) 命令在maildrop目錄中創建隊列文件。

所以你會希望你的輸入包含序列"\n.\n"某處。

+0

不需要;現有的'close(MAIL)'將提供必要的EOF。 – ikegami

0

只有一個序列對於sendmail來說是特殊的,一旦它開始讀取主體:包含單個.的行表示輸入的結束。 (EOF也是如此。)

這意味着如果您的輸入包含的行只包含.,那麼您需要將其轉義。默認傳輸編碼不提供轉義手段,因此您需要指定一個避免此問題的Content-Transfer-Encoding(例如base64),或者允許您跳過該時間段(例如quote-printable),並相應地對內容進行編碼。


這給我們帶來了您選擇的content transfer encoding的限制。

默認內容傳輸編碼7bit需要不超過998個字節的行由CRLF終止。這些行可能只包含[1,127]中的八位字節,並且八位字節10和13可能僅顯示爲行終止符的一部分。

如果您選擇的內容傳輸編碼不適合對您的輸入進行編碼,則需要選擇不同的編碼。


你真的應該使用,而不是在這樣一個低水平的工作有點像Email::Sender

+0

感謝您的回答,這是真正的信息。然而,我已經將正確答案授予第一人。我仍然不清楚在我之後的其餘輸入中會發生什麼。 ? sendmail存在並且open()關閉? – kak

相關問題