2010-02-15 99 views
25

我在發送電子郵件時遇到了外國字符問題。有人能告訴我該怎麼做。我認爲這個問題可能是三件事之一。PHP電子郵件編碼?

1)html頁面編碼不正確。 (這會影響表單中的POST數據嗎?) 2)郵件功能沒有任何編碼。因此程序不知道如何讀取它。 (很有可能) 3)文件本身沒有正確的編碼,因此造成問題。 (很可能不太可能)

是否還有其他可能的原因?

我試圖敲掉這些1,直到我找到問題。我認爲選項2是最可能的原因。如何爲郵件功能添加適當的通用編碼?

這是我目前所擁有的。

$mail_sent = mail($client_email, $title, $message, "From: {$visitor_email}"); 

我目前知道表單不發送波蘭語或瑞典語字符。

如果有人能指出任何其他可能的原因並告訴我需要用什麼編碼發送電子郵件,我將不勝感激。

非常感謝。

回答

28

據我所知,PHP不支持UTF-8作爲其默認的字符串編碼。您需要使用相關的編碼/處理函數來進行編碼。

還加上「的Content-Type:text/html的;字符集= utf-8」到您的電子郵件標題使電子郵件客戶端將正確顯示的字符(或與您所選擇的編碼代替)。

+9

基於文本的郵件(在HTML)使用: '內容類型:text/plain的;字符集= utf-8' –

+0

能否請您發佈的代碼? – 2014-01-12 16:24:20

20

沒有指定內容的類型和編碼。試試這個:

$headerFields = array(
    "From: {$visitor_email}", 
    "MIME-Version: 1.0", 
    "Content-Type: text/html;charset=utf-8" 
); 
$mail_sent = mail($client_email, $title, $message, implode("\r\n", $headerFields)); 
2

使用PHP郵件包裝器,它會保存你的理智(從這裏的經驗來講)。例如,PHPMailer允許您設置傳出電子郵件編碼併爲您構建消息。

此外,使用UTF-8;它現在幾乎得到普遍支持,涵蓋了你所需要的所有角色。

4

我使用下面的代碼:

$text = ""; 
    $text .= "<html>\n"; 
    $text .= "<body style=\"font-family:Arial; \">\n"; 

    $text .= "<b>Add Your text here . . .</b>"; 
    $text .= date("d.m.Y") . " <br><br>\n\n"; 

    $text .= "</body>\n"; 
    $text .= "</html>\n"; 

$headers = 'From: ' . $myEmail . "\r\n"; 
$headers .= 'To: ' . $depEmail . "\r\n";  
$headers .= 'Return-Path: ' . $myEmail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $text . "\r\n"; 

set_time_limit(30); 
if (!mail('', 'Demande information', '', $headers)) { 
    Alert(...) 
+1

是否有一個特定的原因,您在「Content-Transfer-Encoding:8bit」後面使用\ n \ r \ n而不是\ r \ n? – Lexib0y

+0

可能只是從示例文件中複製而來,它的工作:) – Atara

6

除了我們前面所說,這不是強制性的發送郵件的HTML能夠使用UTF-8,你也可以將其格式化爲簡單的文字在標題:

'Content-Type: text/plain;charset=utf-8' 
6

使用此代碼

function mail_send($arr) 
{ 
    if (!isset($arr['to_email'], $arr['from_email'], $arr['subject'], $arr['message'])) { 
     throw new HelperException('mail(); not all parameters provided.'); 
    } 

    $to   = empty($arr['to_name']) ? $arr['to_email'] : '"' . mb_encode_mimeheader($arr['to_name']) . '" <' . $arr['to_email'] . '>'; 
    $from  = empty($arr['from_name']) ? $arr['from_email'] : '"' . mb_encode_mimeheader($arr['from_name']) . '" <' . $arr['from_email'] . '>'; 

    $headers = array 
    (
     'MIME-Version: 1.0', 
     'Content-Type: text/html; charset="UTF-8";', 
     'Content-Transfer-Encoding: 7bit', 
     'Date: ' . date('r', $_SERVER['REQUEST_TIME']), 
     'Message-ID: <' . $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['SERVER_NAME'] . '>', 
     'From: ' . $from, 
     'Reply-To: ' . $from, 
     'Return-Path: ' . $from, 
     'X-Mailer: PHP v' . phpversion(), 
     'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'], 
    ); 

    mail($to, '=?UTF-8?B?' . base64_encode($arr['subject']) . '?=', $arr['message'], implode("\n", $headers)); 
} 

來自:http://php.net/manual/en/function.mail.php

+1

請問您爲什麼使用7bit傳輸編碼,因爲我經常看到8bit? – Lexib0y

+0

從我發現的情況來看,7bit是電子郵件的默認值,因爲一些真正舊的郵件客戶端和服務器無法處理8位。發送7位quoted-printable只是在玩它的安全。也就是說,你可以發送8bit的iso-8859-1或者8bit的utf-8,沒有任何問題。 – Adrian

+0

+1與base64_encode()有關的主題。以前從未想過這件事。謝謝 – Alexandre

1

我用這個代碼來解決與舊部落郵件希臘編碼的問題。

$headers = 'From: ' . $youremail . "\r\n"; 
$headers .= 'To: ' . $to . "\r\n";  
$headers .= 'Return-Path: ' . $youremail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=utf-8' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $message . "\r\n"; 

mail('', 'Request from Site yoursite', '', $headers);