2012-04-18 87 views
1

我有這樣的代碼通過PHP發送電子郵件:HTML電子郵件發送純文本與PHP

// Prepare email. 
$headers = "From: Mi9 Vault <[email protected]>\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=ISO-8859-1"; 

$msg = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/edm/confirmation.html'); 
$msg = str_replace('{first_name}', $contact["First Name"], $msg); 


// Send email 
mail($contact["Email Address"], "Your Mi9 Registration is Confirmed", $msg, $headers); 

confirmation.html是,我們已經建立了一個HTML電子郵件。

我從來沒有遇到任何上述用於發送電子郵件的PHP代碼的麻煩,但我似乎可以得到的是一個包含所有HTML而不是實際的HTML格式電子郵件的電子郵件。

基本上我收到一封電子郵件,以此爲內容:

MIME-Version: 1.0 

Content-type: text/html; charset=ISO-8859-1 
Message-Id: <[email protected]> 
Date: Wed, 18 Apr 2012 01:03:25 -0700 (PDT) 

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
    </head> 
    <body> 
     ..... 

我在其他網站上使用相同的主機相同的PHP代碼,它工作正常...

+0

我以前遇到過這個問題,並通過玩弄'\ r \ n'來解決它。您可能想嘗試Dante的解決方案。 – 2012-04-18 08:18:31

+0

實際上,內聯HTML只能用於非常不嚴格(不合規)的用戶代理。如果您已經在ehaders中修復了換行符問題,您可能會根據需要在電子郵件客戶端中顯示此內容,但您應該使用7位傳輸編碼,並且應該將html標記爲mime內嵌內容 – symcbean 2012-04-18 12:30:04

回答

6

它似乎不知怎麼,你的頭文件的每兩行之間會有額外的換行符。由於您的代碼不會將它們放在那裏,因此我無法確定它是如何發生的。接收郵件服務器可能會以某種方式搞砸,並將\r\n解釋爲兩個換行符而不是一個換行符。首先,我會刪除\r,只留下\n,看看會發生什麼。我知道這不適合每個RFC - 但從此開始。

爲了讓您感覺更好,我使用了非常類似的代碼 - 並且電子郵件得到正確傳遞。

+0

我帶走了'\ r \ n'離開第一行(使用'From:'),現在它完美地工作......這太奇怪了。 – Marty 2012-04-18 08:16:33

+0

@MartyWallace哦,順便嘗試在頭部的最後一行加上'\ r \ n \ r \ n',而不是拿掉'\ r' - 可能會被缺少的雙重結束符所迷惑,在標題的末尾添加行 – 2012-04-18 08:19:35

+0

剛剛發出了accros相同的問題,並通過刪除'\ r'確實解決了這個問題。感謝這個:-) – 2013-10-22 15:25:17

0

嘗試改變:

$headers = "From: Mi9 Vault <[email protected]>\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=ISO-8859-1"; 

$headers = 'From: Mi9 Vault <[email protected]>' . "\r\n"; 
$headers .= 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
0

嘗試從你的HTML電子郵件刪除html和head標籤,只是把簡單的HTML內容無需添加HTML額外的標籤,和Body 開始你身體開始標記後的HTML標記

2

你不知道你運行的是哪個平臺以及哪個郵件程序使用mail()。看來你正在使用的郵件是期待\ n成爲分隔符。您可以使用PHP_EOL而不是\ r \ n或\ n,在這種情況下,它將使用運行平臺中使用的行分隔符。

對於在Linux/Unix系統,

線在頭打破應該是哪個PHP運行 系統自然行的結局。

mail()函數沒有與SMTP服務器通信,所以RFC2822不會在這裏適用 。 mail()與 本地系統上的命令行程序交談,期望程序要求 系統本地換行符是合理的。

source

從長遠來看,可以考慮使用電子郵件()有幾個類似的問題一般整理出來的替代品。郵件()是一個非常「原始」的功能,有幾個陷阱,包括標題注入。例如,Swift MailerPHPMailer已解決這些類型的問題。