2011-07-12 20 views
1

我正在使用函數發送UTF8電子郵件。 由於至少有一個收件人與我的函數發送的電子郵件問題(不是UTF8,所以特殊字符打破;一些郵件標題出現在正文中),我想知道是否必須在標題字符串的末尾放置另一個換行符:郵件()頭必須用換行符結束嗎? (IncrediMail問題)

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") 
{ 
    $header_ = 'MIME-Version: 1.0'."\r\n".'Content-type: text/plain; charset=UTF-8'."\r\n"; 
    $header_ .= "From: [email protected]"; //Should be optional... 
    if (!empty($header)) $header_ .= "\r\n".$header; 
    $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_); 

    return $out; 
} 

那麼,什麼是正確的 - mail_utf8("[email protected]", "", "blah", "")mail_utf8("[email protected]", "", "blah", "\r\n")

編輯:這種問題的顯而易見的資源 - www.php.net/mail - 僅在示例#4中使用了這種換行符,與#2中不同。

編輯2:所以這裏是當前版本。查看更多信息的評論。

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") 
{ 
$linebreak = PHP_EOL; //Seems to work everywhere, including IncrediMail 
$linebreak = "\n"; //Debug 
$header_ = 'MIME-Version: 1.0'.$linebreak.'Content-type: text/plain; charset=UTF-8'.$linebreak; 
$header_ .= "From: [email protected]".$linebreak; 
if (!empty($header)) $header_ .= $header.$linebreak; //Last line break !? 
$out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_); 

return $out; 
} 
+0

那麼你正在使用無論是在你的代碼。 –

+0

「*部分郵件標題出現在主體*中*」部分讓我認爲您的標題中可能有*空行*,就像'「Content-type:text/plain; charset = UTF-8 \ r \ n \ r \ n另一個標題:值「'。我會將'\ r \ n'追加到'From:'行,並確保'$ headers'參數不以'\ r \ n'開頭。 – binaryLV

+0

@binaryLV:正如我在下面寫的,似乎IncrediMail(電子郵件客戶端 - 非郵件服務器)在「MIME-Version:1.0」之後產生了第一個雙重換行符,這可以解釋爲什麼「Content-Type:...」是第一條身體線(僅在IncrediMail中)。但是通過使用「\ n」而不是「\ r \ n」,我不符合標準,對吧? – basic6

回答

1

嘗試終止每個報頭符合只是\n,代替\r\n

如果未收到消息,請嘗試僅使用LF(\ n)。一些差的 質量Unix郵件傳輸代理自動取代LF由CRLF (如果使用CRLF,會導致CR翻倍)。這應該是最後的 度假村,因爲它不符合»RFC 2822

來源:PHP mail() Function

+0

好吧,這顯然可以解決表面上的問題。有我的電子郵件問題的人使用IncrediMail作爲客戶端。我已經檢查過它,並且使用我的函數發送的電子郵件(無終止換行符),並且使用IncrediMail接收的電子郵件都已損壞 - 第一個正文行是「Content-Type:...」。但是隻有「\ n」作爲分隔符(最後仍然沒有換行符),IncrediMail會正確顯示電子郵件,除非用戶輸入(