2011-12-24 7 views
7

मैं अपने आने वाले मेल को PHP स्क्रिप्ट पर पाइप करने की कोशिश कर रहा हूं ताकि मैं उन्हें डेटाबेस और अन्य चीज़ों में संग्रहीत कर सकूं। मैं कक्षा MIME E-mail message parser (registration required) का उपयोग कर रहा हूं हालांकि मुझे नहीं लगता कि यह महत्वपूर्ण है।आने वाले ईमेल विषय को डीकोड करने का उचित तरीका (utf 8)

मुझे ईमेल विषयों के साथ समस्या है। यह ठीक काम करता है जब शीर्षक अंग्रेजी में है, लेकिन विषय गैर-लैटिन वर्णों का उपयोग करता है अगर मैं یک دو سه

मैं इस तरह विषय को डिकोड की तरह एक शीर्षक के लिए की तरह

=?UTF-8?B?2KLYstmF2KfbjNi0?= 

कुछ पाने:

$subject = str_replace('=?UTF-8?B?' , '' , $subject); 
    $subject = str_replace('?=' , '' , $subject);  
    $subject = base64_decode($subject); 

यह 10-15 वर्णों के साथ छोटे विषयों के साथ ठीक काम करता है लेकिन लंबे समय तक मुझे मूल शीर्षक का आधा अंत में जैसे कुछ मिलता है।

यदि शीर्षक लंबा है, 30 वर्णों की तरह, मुझे कुछ भी नहीं मिलता है। क्या मैं इसे ठीक से कर रहा हूं?

+1

यह आपके द्वारा चुने गए उच्चतम गुणवत्ता वाले सॉफ़्टवेयर नहीं है। Http://stackoverflow.com/questions/4721410/best-way-to-handle-email-parsing-decoding-in-php देखें, वे शायद सभी डिकोडिंग करते हैं और ऐसे रिसीवल हैक की आवश्यकता नहीं होती है। – mario

उत्तर

12

इस तथ्य के बावजूद कि यह लगभग एक वर्ष पुराना है - मुझे यह मिला और मुझे एक ही समस्या का सामना करना पड़ रहा है।

मुझे यकीन नहीं है कि आपको अजीब पात्र क्यों मिल रहे हैं, लेकिन शायद आप उन्हें कहीं भी प्रदर्शित करने की कोशिश कर रहे हैं तो आपका वर्णसेट असमर्थित है।

यहां कुछ कोड लिखा गया है जो वर्णमाला रूपांतरण को छोड़कर सब कुछ संभालना चाहिए, जो एक बड़ी समस्या है कि कई पुस्तकालय बहुत बेहतर संभालते हैं। (PHP के MB library, उदाहरण के लिए)

class mail { 
    /** 
     * If you change one of these, please check the other for fixes as well 
    * 
    * @const Pattern to match RFC 2047 charset encodings in mail headers 
    */ 
    const rfc2047header = '/=\?([^ ?]+)\?([BQbq])\?([^ ?]+)\?=/'; 

    const rfc2047header_spaces = '/(=\?[^ ?]+\?[BQbq]\?[^ ?]+\?=)\s+(=\?[^ ?]+\?[BQbq]\?[^ ?]+\?=)/'; 

    /** 
    * http://www.rfc-archive.org/getrfc.php?rfc=2047 
    * 
    * =?<charset>?<encoding>?<data>?= 
    * 
    * @param string $header 
    */ 
    public static function is_encoded_header($header) { 
     // e.g. =?utf-8?q?Re=3a=20Support=3a=204D09EE9A=20=2d=20Re=3a=20Support=3a=204D078032=20=2d=20Wordpress=20Plugin?= 
     // e.g. =?utf-8?q?Wordpress=20Plugin?= 
     return preg_match(self::rfc2047header, $header) !== 0; 
    } 

    public static function header_charsets($header) { 
     $matches = null; 
     if (!preg_match_all(self::rfc2047header, $header, $matches, PREG_PATTERN_ORDER)) { 
      return array(); 
     } 
     return array_map('strtoupper', $matches[1]); 
    } 

    public static function decode_header($header) { 
     $matches = null; 

     /* Repair instances where two encodings are together and separated by a space (strip the spaces) */ 
     $header = preg_replace(self::rfc2047header_spaces, "$1$2", $header); 

     /* Now see if any encodings exist and match them */ 
     if (!preg_match_all(self::rfc2047header, $header, $matches, PREG_SET_ORDER)) { 
      return $header; 
     } 
     foreach ($matches as $header_match) { 
      list($match, $charset, $encoding, $data) = $header_match; 
      $encoding = strtoupper($encoding); 
      switch ($encoding) { 
       case 'B': 
        $data = base64_decode($data); 
        break; 
       case 'Q': 
        $data = quoted_printable_decode(str_replace("_", " ", $data)); 
        break; 
       default: 
        throw new Exception("preg_match_all is busted: didn't find B or Q in encoding $header"); 
      } 
      // This part needs to handle every charset 
      switch (strtoupper($charset)) { 
       case "UTF-8": 
        break; 
       default: 
        /* Here's where you should handle other character sets! */ 
        throw new Exception("Unknown charset in header - time to write some code."); 
      } 
      $header = str_replace($match, $data, $header); 
     } 
     return $header; 
    } 
} 

जब एक स्क्रिप्ट के माध्यम से चलाने के लिए और का उपयोग कर एक ब्राउज़र में प्रदर्शित UTF-8, परिणाम है:

آزمایش

आप यह इतना की तरह चलाने होगा:

$decoded = mail::decode_header("=?UTF-8?B?2KLYstmF2KfbjNi0?="); 
+0

आप '$ data = iconv ($ charset, 'UTF-8 // TRANSLIT', $ डेटा) का उपयोग कर सकते हैं;' या '$ data = mb_convert_encoding ($ डेटा, 'UTF-8', $ charset);' के लिए असामान्य पात्रों को डीकोड करना।मैं दूसरा रास्ता पसंद करता हूं। – Stalinko

+0

धन्यवाद .. @razzed – NaveenDA

6

आप अपने स्ट्रिंग डिकोड करने के लिए mb_decode_mimeheader() फ़ंक्शन का उपयोग कर सकते हैं।

+0

एक अपवित्र मिस्टर – snez

2

उपयोग php समारोह:

<?php 
imap_utf8($text); 
?> 
2

उपयोग php देशी समारोह

<?php 
mb_decode_mimeheader($text); 
?> 

इस समारोह iso-8859-1 स्ट्रिंग के रूप में रूप में अच्छी तरह UTF8 संभाल कर सकते हैं। मैंने इसका परीक्षण किया है।

+0

है यह गैर utf8 विषयों को भी डीकोड करेगा। कोशिश करें (preg_match ('/ \? Utf-8 \? /', $ विषय)) $ subject = mb_decode_mimeheader ($ विषय); – Juergen

संबंधित मुद्दे