php
  • email
  • 2010-12-11 25 views 3 likes 
    3

    當我從PHP與\ r \ n發送郵件在標題(as it should be according to documentation從php發送郵件:標題被解釋爲正文?

    $headers = "From: $email\r\n"; 
    $headers .= "Reply-To: Just me <$email>\r\n"; 
    $headers .= 'Content-type: text/plain; charset=iso-8859-1' . "\r\n"; 
    $headers .= "Content-Transfer-Encoding: 8bit\r\n"; 
    $subject = "Hello world"; 
    $body = "<html><p>Hey, whats up?</p></html>"; 
    
    mail($to, $subject, $body, $headers); 
    

    一些郵件客戶端會解釋\ r \ n爲在兩個斷行斷行。因此,對於這個郵件()以上真正的郵件內容是這樣的:

    X-Message-Delivery: Vj0LEdMMtPAYT0xO0Q9MTtTQ0w9MA== 
    X-Message-Status: n 
    Received: from server75.publicompserver.de ([92.43.108.63]) by snt0-mc2-f13.Snt0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); 
    Thu, 9 Dec 2010 12:09:22 -0800 
    Message-ID: <[email protected]> 
    [lots of other headers] 
    Date: Thu, 09 Dec 2010 21:09:32 +0100 
    X-OriginalArrivalTime: 09 Dec 2010 20:09:22.0873 (UTC) FILETIME=[F88C3A90:01CB97DC] 
    From: $email 
    
    Reply-To: Just me <$email> 
    
    Content-type: text/html; charset=iso-8859-1 
    
    Content-Transfer-Encoding: 8bit 
    
    <html><p>Hey, whats up?</p></html> 
    

    現在有些客戶端(Googlemail電子郵件爲例)將忽略這些額外的換行符。其他人(thunderbird)會將第一個額外的換行解釋爲頭部的結尾,並將其餘的頭部行解釋爲身體的一部分(丟失頭部信息,在這種情況下將郵件呈現爲文本而不是html)。

    我也看到了其他郵件發送網站的相同問題。

    這裏發生了什麼? \ r \ n是根據doc的正確換行符,還是其他地方出錯了? 如何解決?將換行符改爲\ n而不是\ r \ n似乎有所幫助,但由於文檔中提到「你應該使用\ r \ n」,這是不對的,可以嗎?

    +0

    在你之前的問題中,我提到了'PHP_EOL'常量。你試過這個嗎? – 2010-12-11 07:56:06

    +0

    由於這些腳本在Apache/Unix上運行,PHP_EOL將是\ n,而不是? – Sam 2010-12-11 07:57:55

    +0

    也許有人可以清楚地知道unix sendmail腳本如何將'\ n'轉換爲'\ r \ n' – 2010-12-11 08:05:43

    回答

    8

    這在文檔http://php.net/manual/en/function.mail.php中提到:「如果沒有收到消息,請嘗試使用LF(\ n)。一些質量差的Unix郵件傳輸代理會自動用CRLF替換LF(如果CRLF導致CR翻倍)這應該是最後的手段,因爲它不符合»RFC 2822。「

    所以,如你所說:這是不對的,但它是現實。

    +1

    因此,我應該使用\ r \ n直到其中一個郵件接收器發出抱怨,而不是切換到\ n呢?但我怎麼能確定他們抱怨(特別是如果回覆標題丟失),所以我會注意到,而不是隻是刪除該消息? – Sam 2010-12-11 08:04:33

    +2

    我的猜測是爲了獲得最大的兼容性,只能使用\ n,只要你的測試顯示這種方法沒有問題,RFC就會被詛咒。 – 2010-12-11 08:07:21

    0

    正如您在上一個問題中所述。每個平臺以不同的方式(CRLF或LF)分隔線條。最好通過PHP_EOL常量將此決定留給PHP,PHP將負責處理它。

    +0

    PHP_EOL對於\ n在unix平臺上的寫法是不同的,所有這些腳本都在unix系統上運行,所以你會說我應該忽略RFC 2822並改用\ n來代替它。 – Sam 2010-12-11 08:03:28

    +0

    此文檔中的評論引起了一些注意:http://www.php.net/manual/en/function.mail.php#100563 – 2010-12-11 08:07:27

    +0

    有關\ r \ n被更改爲\ r \ r \ n的評論捨棄了一些解決問題的方法如下:http://www.php.net/manual/en/function.mail.php#100193 – Sam 2010-12-11 08:13:45

    0

    在您的代碼中,您對一些標題行使用\ r \ n,而對其他標題行只使用\ n。如果你一致,也許這個問題不會發生。

    +0

    對不起,這不是真正的代碼,這只是我隨時匆匆掠過的一些示例 - 代碼本身是一致的,我的錯誤! – Sam 2010-12-11 08:11:57

    相關問題