2012-11-08 9 views
5

का उपयोग करते समय मैं इस PHP IMAP क्लास का उपयोग कर रहा हूं: http://code.google.com/p/php-imap/source/browse/trunk/ImapMailbox.php वर्तमान प्रोजेक्ट पर। कुछ संशोधनों के बाद कक्षा काम कर रही है। हालांकि जब भी कक्षा डाउनलोड करता है। डॉक्स फाइलें वे हमेशा भ्रष्ट होती हैं और उन्हें कार्यालय द्वारा पुनर्प्राप्त करना होता है।भ्रष्ट .docx फ़ाइलें जब एक PHP IMAP वर्ग

protected function initMailPart(IncomingMail $mail, $partStruct, $partNum) { 
    $data = $partNum ? $this->imap_fetchbody($this->mbox, $mail->mId, $partNum, FT_UID) : $this->imap_body($this->mbox, $mail->mId, FT_UID); 

    if($partStruct->encoding == 1) { 
     $data = $this->imap_utf8($data); 
    } 
    elseif($partStruct->encoding == 2) { 
     $data = $this->imap_binary($data); 
    } 
    elseif($partStruct->encoding == 3) { 
     $data = $this->imap_base64($data); 
    } 
    elseif($partStruct->encoding == 4) { 
     $data = $this->imap_qprint($data); 
    } 
    $data = trim($data); 

    $params = array(); 
    if(!empty($partStruct->parameters)) { 
     foreach($partStruct->parameters as $param) { 
      $params[strtolower($param->attribute)] = $param->value; 
     } 
    } 
    if(!empty($partStruct->dparameters)) { 
     foreach($partStruct->dparameters as $param) { 
      $params[strtolower($param->attribute)] = $param->value; 
     } 
    } 
    if(!empty($params['charset'])) { 
     $data = iconv($params['charset'], $this->serverEncoding, $data); 
    } 

    // attachments 
    if($this->attachmentsDir) { 
     $filename = false; 
     $attachmentId = $partStruct->ifid ? trim($partStruct->id, " <>") : null; 
     if(empty($params['filename']) && empty($params['name']) && $attachmentId) { 
      $filename = $attachmentId . '.' . strtolower($partStruct->subtype); 
     } 
     elseif(!empty($params['filename']) || !empty($params['name'])) { 
      $filename = !empty($params['filename']) ? $params['filename'] : $params['name']; 
      $filename = $this->decodeMimeStr($filename); 
      $filename = $this->quoteAttachmentFilename($filename); 
     } 
     if($filename) { 
      if($this->attachmentsDir) { 
       $filepath = rtrim($this->attachmentsDir, '/\\') . DIRECTORY_SEPARATOR . $filename; 
       file_put_contents($filepath, $data); 
       $mail->attachments[$filename] = $filepath; 
      } 
      else { 
       $mail->attachments[$filename] = $filename; 
      } 
      if($attachmentId) { 
       $mail->attachmentsIds[$filename] = $attachmentId; 
      } 
     } 
    } 
    if($partStruct->type == 0 && $data) { 
     if(strtolower($partStruct->subtype) == 'plain') { 
      $mail->textPlain .= $data; 
     } 
     else { 
      $mail->textHtml .= $data; 
     } 
    } 
    elseif($partStruct->type == 2 && $data) { 
     $mail->textPlain .= trim($data); 
    } 
    if(!empty($partStruct->parts)) { 
     foreach($partStruct->parts as $subpartNum => $subpartStruct) { 
      $this->initMailPart($mail, $subpartStruct, $partNum . '.' . ($subpartNum + 1)); 
     } 
    } 
} 

protected function decodeMimeStr($string, $charset = 'UTF-8') { 
    $newString = ''; 
    $elements = $this->imap_mime_header_decode($string); 
    for($i = 0; $i < count($elements); $i++) { 
     if($elements[$i]->charset == 'default') { 
      $elements[$i]->charset = 'iso-8859-1'; 
     } 
     $newString .= iconv($elements[$i]->charset, $charset, $elements[$i]->text); 
    } 
    return $newString; 
} 
+0

अनुलग्नक प्रारूप को दो बार जांचें। क्या वे दस्तावेज़ हमेशा एक विशिष्ट ईमेल क्लाइंट से जुड़े होते हैं (उदाहरण के लिए माइक्रोसॉफ्ट आउटलुक?)। – hakre

+0

वे निश्चित रूप से हैं। डॉक्स को 2007 से सहेजा गया है और यह वही है जब ईमेल जीमेल, आउटलुक 2007 और हॉटमेल – Chardard

+0

से भेजे जाते हैं, जानना अच्छा है! क्या आप संलग्न करने से पहले और उसके बाद एमडी 5 चेकसम बना सकते हैं? फ़ाइल आकार भी भिन्न होता है? इसके अलावा मैं परीक्षण उद्देश्यों के लिए फ़ाइल के कई संस्करणों को अलग-अलग एन्कोडिंग के साथ सहेज दूंगा। मैं वहां कुछ गंध करता हूं, लेकिन स्वाभाविक रूप से कोड को स्कैन करने से बस कहना मुश्किल है। आपके पास खाली वर्णमाला पर कुछ निर्णय हैं और ऐसे में, शायद वहां कुछ गड़बड़ है। – hakre

उत्तर

1

एक अच्छा संपादक के साथ बाइनरी फ़ाइलों में जूझने, दोनों से पहले और IMAP से राउंड ट्रिप के बाद, वहाँ अगर कुछ स्पष्ट देखने के लिए प्रयास करें। मुझे ऐसी ही समस्याएं थीं जहां व्हाइटस्पेस ने PHP स्क्रिप्ट में अपना रास्ता बनाया (उदा। बंद होने के बाद फ़ाइल के अंत में?> टैग); अधिकांश प्रारूपों को झपकी नहीं होगी, लेकिन अंत में सफेद जगह पर छोड़ा गया है, तो डॉक्स को रिकवरी में लात मार दिया जा सकता है।

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