2010-02-15 14 views
25

मुझे ई-मेल भेजते समय विदेशी पात्रों के साथ कुछ परेशानी हो रही है। क्या कोई मुझे सलाह दे सकता है कि क्या करना है। मुझे लगता है कि समस्या तीन चीजों में से एक हो सकती है।PHP ई-मेल एन्कोडिंग?

1) एचटीएमएल पेज एन्कोडिंग गलत है। (क्या यह फॉर्म से POST डेटा को प्रभावित करेगा?) 2) मेल फ़ंक्शन में कोई एन्कोडिंग नहीं है। इस प्रकार कार्यक्रम को यह नहीं पता कि इसे कैसे पढ़ा जाए। (सबसे अधिक संभावना) 3) फ़ाइल में सही एन्कोडिंग नहीं है और इस प्रकार समस्याएं पैदा हो रही हैं। (शायद काफी संभावना नहीं है)

क्या कोई अन्य संभावित कारण हैं?

मैं समस्या को तब तक 1 से 1 तक दस्तक देने की कोशिश कर रहा हूं जब तक मुझे समस्या नहीं मिलती। मुझे लगता है कि विकल्प 2 सबसे संभावित कारण है। मैं एक मेल फ़ंक्शन में उचित - सार्वभौमिक एन्कोडिंग कैसे जोड़ूं?

इस समय मेरे पास यही है।

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

मुझे वर्तमान में पता है कि फॉर्म पॉलिश या स्वीडिश पात्र नहीं भेजता है।

अगर कोई अन्य संभावित कारण बता सकता है और मुझे बताएगा कि ई-मेल भेजने के लिए मुझे किस एन्कोडिंग की आवश्यकता है, तो मैं बहुत आभारी हूं।

बहुत बहुत धन्यवाद।

उत्तर

28

जहां तक ​​मुझे पता है कि PHP यूटीएफ -8 को अपने तारों के लिए डिफ़ॉल्ट एन्कोडिंग के रूप में समर्थन नहीं देता है। आपको एन्कोडिंग के लिए प्रासंगिक एन्कोडिंग/हैंडलिंग फ़ंक्शंस का उपयोग करने की आवश्यकता है।

अपने ईमेल शीर्षलेखों में 'सामग्री-प्रकार: टेक्स्ट/एचटीएमएल; charset = utf-8' भी जोड़ें, इसलिए ईमेल क्लाइंट वर्णों को सही तरीके से प्रदर्शित करेंगे (या पसंद के आपके एन्कोडिंग के साथ प्रतिस्थापित करें)।

+9

का उपयोग करें: 'सामग्री प्रकार: पाठ/सादे; charset = utf-8' –

+0

आप कोड पोस्ट सकते हैं? –

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 आपको आउटगोइंग ई-मेल एन्कोडिंग सेट करने और आपके लिए संदेश बनाता है।

इसके अलावा, यूटीएफ -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

क्या कोई विशिष्ट कारण है कि आप "सामग्री-स्थानांतरण-एन्कोडिंग: 8 बिट" के पीछे \ r \ n के बजाय \ 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

क्या आप मुझे बता सकते हैं कि आप 7 बिट ट्रांसफर एन्कोडिंग का उपयोग क्यों करते हैं, क्योंकि मैं अक्सर 8 बिट देखता हूं? – Lexib0y

+0

जो मैंने पाया है, 7 बिट ईमेल के लिए डिफ़ॉल्ट है, क्योंकि कुछ वास्तव में पुराने मेल क्लाइंट और सर्वर 8 बिट से निपट नहीं सकते हैं। 7 बिट उद्धृत-प्रिंट करने योग्य भेजना सिर्फ इसे सुरक्षित खेल रहा है। उस ने कहा, आप बिना किसी समस्या के 8 बिट आईएसओ -885 9 -1 या 8 बिट यूटीएफ -8 भेज सकते हैं। – Adrian

+0

विषय पर base64_encode() पर +1। पहले कभी नहीं सोचा था। धन्यवाद – 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); 
पाठ आधारित ईमेल (html में नहीं) के लिए
संबंधित मुद्दे