2012-08-22 27 views
4

我用PHP發送了一封HTML電子郵件,但我的客戶端將其作爲純代碼接收。這裏是PHP代碼來發送郵件:Outlook收到PHP HTML電子郵件爲代碼?

$subject = 'HTML e-mail test'; 
$message = '<html> 
    <body> 
     <h1>TEST</h1> 
    </body> 
</html>'; 
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; 
$headers .= "To: <".$to.">\r\n"; 
$headers .= "From: <".$email.">\r\n"; 

$mailb = mail($to, $subject, $message, $headers); 

它工作正常的我,但他們收到爲:

Content-type: text/html; charset=iso-8859-1 

To: <[email protected]> 
From: <[email protected]> 

<html> 
    <body> 
     <h1>TEST</h1> 
    </body> 
</html> 

有什麼錯我的頭?或者是他們的Outlook? 我該如何解決這個問題?
在此先感謝!

+0

請使用一個數組,甚至nowdoc語法來處理像這樣的長blob。 http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc – Incognito

+0

@Incognito - mail()中的標題是字符串,而不是數組,並且正式應該有以'\ r \ n'結尾的行(不僅僅是系統的換行符)。除非你正在想'implode()'在飛行中嗎?你會如何確保nowdoc具有正確的行結尾? – ghoti

+0

@ghoti我用'。='來表達他的字符串構建操作。該數組將提供一個有意義的抽象,至少可以包含邏輯幫助防止像'TO:'字段被提供的事情'[email protected] \ r \ n到:[email protected] \ r \ n \ r \ nSpamSpamSpam \ r \ n。\ r \ n \ r \ N'。 - 此外,只需使用像您在下面建議的現有解決方案是首選。 – Incognito

回答

3

我看到:

Content-typetext/html; charset=iso-8859-1 

,我應該看到:

Content-type: text/html; charset=iso-8859-1 

那是一個剪切/粘貼錯誤?在你的代碼中,還是在你的結果中?因爲只有HTML的郵件經常會得到很高的垃圾郵件分數(使用SpamAssassin,SpamBouncer等),因此您可能希望在多部分郵件中包含文本/純文本和文本/ html類型

更新#1:

看來,\r\n被解釋爲兩個新行而不是一個。不同的平臺在實施SMTP時可能會有不同的錯誤。您可能會將您的線路結局更改爲\n。如果它適用於你的系統,不要依賴它,因爲它可能不適用於不同的系統。

此外,請考慮切換到另一種發送郵件的方法。推薦使用phpMailerSwiftMailer,而不是PHP的內部mail()函數。

更新#2:

大廈無痕的建議,這裏的代碼,你可以用它來組織你的頭更好,以及創建一個明文部分:

filter_var($to, FILTER_VALIDATE_EMAIL) or die("Invalid To address"); 
filter_var($email, FILTER_VALIDATE_EMAIL) or die("Invalid From address"); 

$subject = 'HTML e-mail test'; 

$messagetext = 'TEST in TEXT'; 

$messagehtml = '<html> 
    <body> 
     <h1>TEST</h1> 
     <p>in HTML</p> 
    </body> 
</html>'; 

// We don't need real randomness here, it's just a MIME boundary. 
$boundary="_boundary_" . str_shuffle(md5(time())); 

// An array of headers. Note that it's up to YOU to insure they are correct. 
// Personally, I don't care whether they're a string or an imploded array, 
// as long as you do input validation. 
$headers=array(
    'From: <' . $email . '>', 
    'MIME-Version: 1.0', 
    'Content-type: multipart/alternative; boundary="' . $boundary . '"', 
); 

// Each MIME section fits in $sectionfmt. 
$sectionfmt = "--" . $boundary . "\r\n" 
     . "Content-type: text/%s; charset=iso-8859-1\r\n" 
     . "Content-Transfer-Encoding: quoted-printable\r\n\r\n" 
     . "%s\n"; 

$body = "This is a multipart message.\r\n\r\n" 
     . sprintf($sectionfmt, "html", $messagehtml) 
     . sprintf($sectionfmt, "plain", $messagetext) 
     . "--" . $boundary . "--\r\n"; 

$mailb = mail($to, $subject, $body, implode("\r\n", $headers)); 

我不是說這是以任何方式做到這一點的正確方法,但是如果策略吸引你,並且你認爲在沒有查看它6或12個月(即乍一看有意義)之後可以保持這樣的代碼,然後隨意使用或適應它。

聲明:這是未經測試的,有時我會犯錯誤......只是爲了讓人們保持腳趾頭。 :)

+0

對不起,這是一個錯字,但這就是他們如何接收它。 –

+0

這是一個剪切/粘貼(類型)的錯誤,在代碼中是正常的。他們收到HTML消息,就像我的第二個示例中的代碼,沒有標記。我怎樣才能發送純文本信息? –

0

一個很好的辦法,以確保是改變你的頭到這個:

$to = '[email protected]'; 

$subject = 'Website Change Reqest'; 

$headers = "From: " . strip_tags($_POST['req-email']) . "\r\n"; 
$headers .= "Reply-To: ". strip_tags($_POST['req-email']) . "\r\n"; 
$headers .= "CC: [email protected]\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 

此外,仔細比較這個檢查你的代碼的其餘部分:

http://css-tricks.com/sending-nice-html-email-with-php/

0

我會建議不要使用PHP的mail()函數。是的,它可以發送電子郵件,但對於任何複雜的事情來說,這隻會讓事情變得困難。

我建議使用類如phpMailer,這會給你更多的靈活性。它使得發送HTML郵件,添加附件和使用替代MTA等事情變得更加容易。

+0

感謝您的回答,我同意PHP郵件功能已損壞,但是PHP郵件功能不能正常工作?就像我的例子一樣。 –

+0

郵件標題的格式是一種神祕的藝術形式。 PHP的'mail()'函數期望你知道如何去做,並做好準備。是的,它確實有用,但是phpMailer可以讓你免於麻煩。 – SDC

0

我自己有這個問題,它是通過\ n而不是\ r \ n修復的。 我只在標題的最後一行使用\ r \ n。

0

問題是,某些防病毒電子郵件掃描程序會將MIME標頭之後的任何內容視爲正文文本。

修復是讓你mime頭最後一個。

我剛剛和我的一個客戶有同樣的問題,並且讓我重新開始了一段時間。

0

這是Microsoft Outlook(Windows)的一個問題。

解決方法是刪除標題末尾的「\ r」,然後使用「\ n」。

+0

這可能會回答這個問題,但它被掩埋在不重要的信息中(例如「我有這個問題」),請在以後的帖子中嘗試更加清楚(我已經嘗試過編輯,請檢查一下)。 – BradleyDotNET