2010-02-09 116 views
1

我已經在雪豹上設置了一個本地開發環境,並且已經設置了postfix來通過我的isp郵件服務器發送郵件。Postfix搞砸了電子郵件標題!

我終於得到了postfix工作後,很多挫折,但現在當我的電子郵件發送標題信息被封殺了!

我用下面的PHP代碼:

 
$email = "[email protected]"; 
$subject = "Email tester"; 
$body = "Simple test"; 
$header = "From: [email protected] \r\n"; 
$header .= "MIME-VERSION: 1.0\r\n"; 
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
$phpversion = phpversion(); 
$header .= "X-Mailer: PHP v$phpversion\r\n"; 
mail($email,$subject,$body,$header); 

echo "message sent!"; 

To:和主題:標題顯示爲他們應該在標題!但在電子郵件正文其餘顯示。這使得電子郵件看起來像電子郵件客戶端中的從字段是空的。

我已經嘗試了各種PHP腳本,一些非常簡單,但它是同樣的東西,標題始終顯示在電子郵件正文中。

我在想這可能是一個後綴問題,但不知道,任何人遇到過這種類型的問題?

+0

我試過

\n
行結尾無效:( – 2010-02-09 23:44:02

回答

3

在* additional_headers *中使用PHP_EOL而不是\ r \ n,例如在您的示例中爲$ header。 PHP_EOL會將換行符替換爲您正在運行的操作系統。

另外,消息應該只包含LN,即\ n。這相應於PHP文檔。 每行應該用LF(\ n)分隔。行不應超過70個字符。

確保你在你的腳本中符合兩個標準 - 我試圖實現它,並最終得到它與Postfix的默認配置工作。

+0

我不會使用PHP_EOL,因爲RFC 821明確要求行結束符是CRLF。有些郵件服務器會拒絕帶有非標準行結尾的消息,例如LN only(iirc qmail does not) – Cedric 2011-05-17 01:01:33

+0

這裏我們不談論RFC,而是PHP和Postfix。PHP明確規定,只有LN應該用在發送給mail()函數的正文消息中。做了進一步的處理 - 可能是它將最終發送到Postfix的消息轉換爲正確的格式 – 2011-05-18 15:52:13

+0

對於消息正文是,但不是對於頭文件摘自PHP文檔:「多個額外的頭文件應該用CRLF分隔( \ r \ n)。「 – Cedric 2011-05-18 16:36:56

2

這幾乎是100%不是Postfix問題,而是由您的代碼引起的問題。標題後看到一個空白的CRLF後,主體就會啓動。

你應該傾銷你的電子郵件正文文本,看看你是否不小心引入額外的CRLF。

0

進一步調查這個問題(基本上是因爲我不想僅僅爲此而改進大量腳本),我已經發現PHP和Postfix開發者之間存在強烈的衝突,這是不固定的到現在。你可以在這裏閱讀廣泛的信息:

http://www.mail-archive.com/[email protected]/msg03226.html

後綴預計停產將LF在UNIX上拿起從Sendmail郵件時和 替換有CRLF發送時。 當它得到CRLF時,它仍然取代了 LF,我們得到CRCRLF

它解釋了破損的標題。爲了解決這個問題,你必須知道你的Postfix和PHP /郵件系統是如何工作的。如果您遇到上述問題,請使用「\ n」而不是「\ r \ n」。如果你編寫一個可以在Windows/Unix上運行的複雜系統,只需引入一個額外的參數,如$ eeol =「\ r \ n」;而不是直接的「\ r \ n」標籤,這種方式可以很容易地配置爲任何系統。

我想這是該方法的Postfix筆者建議:

這將是非常好的,如果PHP應用程序開發人員的郵件格式以一致的方式。例如,他們可以使用包含END-OF-LINE終止符的變量,而不是在整個地方對LF或CRLF行終止符進行硬編碼。