2012-04-24 15 views
9

मैं जीमेल में "मूल दिखाएँ" पर क्लिक करके आपको जो भी मिलता है उसके समान संपूर्ण कच्चे ईमेल डेटा (संलग्नक सहित) डाउनलोड करने का एक तरीका ढूंढ रहा हूं।आईमैप एक्सटेंशन के साथ कच्चे ईमेल डेटा कैसे प्राप्त करें?

वर्तमान में, मैं इस कोड से कच्चे शीर्षक और मेल शरीर के कुछ भागों प्राप्त कर सकते हैं:

$this->MailBox = imap_open($mailServer, $userName, $password, OP_SILENT); 
... 
$email->RawEmail = imap_fetchbody($this->MailBox, $msgNo, "0"); 
$email->RawEmail .= "\n".imap_fetchbody($this->MailBox, $msgNo, "1"); 

इसके अलावा मुझे पता है कि imap_fetchbody 3 पैरामीटर को बदलने इनकोडिंग लगाव वापस कर सकती है। मान लीजिए कि मुझे कच्चे ईमेल हिस्से को भाग से प्राप्त करने के लिए यहां एक लूप की आवश्यकता है, लेकिन लूप को रोकने की स्थिति क्या है?

क्या एक बार में पूरा ईमेल प्राप्त करने का कोई आसान तरीका है?

किसी भी मदद की सराहना की जाएगी।

उत्तर

5

आप सभी को लाने के लिए चाहते हैं, आप

  • हेडर imap_fetchheader लाने की जरूरत है।
  • संदेश imap_fetchstructure पर निकायों की संख्या प्राप्त करें।
  • प्रत्येक खान-शीर्षकों में एक शरीर imap_fetchmime है।
  • प्रत्येक शरीर में imap_fetchbody है।

चूंकि माइम-संदेश में कई निकायों हो सकते हैं, तो आपको दूसरे भाग के बाद प्रत्येक भाग को संसाधित करने की आवश्यकता है। सर्वर को लोड को कम करने के लिए imap_fetchheader के लिए विकल्प का उपयोग करें। कुछ उदाहरण code about imap_fetchstructure in another answer जो इंपैप कनेक्शन को संभालने और पहले से ही encapsulation के माध्यम से किसी संदेश के हिस्सों पर पुनरावृत्ति दिखाता है।

+1

'imap_fetchbody ($ imap_stream, $ msg_num, "") का उपयोग करके नीचे स्क्रॉल करें,' 'बहुत आसान है और एक आकर्षण की तरह काम करता है! –

+0

मुझे यह भी अनिश्चितता है कि अगर यह सवाल का जवाब देता है क्योंकि उसे सीमाएं नहीं मिलती हैं। – MrMesees

8

हैकर द्वारा उत्तर अधूरा है, अगर आपको वास्तव में संरचना की परवाह नहीं है तो आपको imap_fetchstructure की आवश्यकता नहीं होगी।

एक साधारण 'शो स्रोत' के लिए आपको केवल imap_fetchheader और imap_body की आवश्यकता होनी चाहिए।

उदाहरण:

$conn = imap_open('{'."$mailServer:$port/pop3}INBOX", $userName, $password, OP_SILENT && OP_READONLY); 
$msgs = imap_fetch_overview($conn, '1:5'); /** first 5 messages */ 
foreach ($msgs as $msg) { 
    $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno); 
    print $source; 
} 
0

एक आम गलती "\n" या PHP_EOL उपयोग करने के लिए है।

आरएफसी आरएफसी 821, आरएफसी 2060 के अनुसार, आरएफसी 1 9 3 9 "\r\n" का उपयोग किया जाना चाहिए। जबकि कुछ मेलसर्वर ऑटो उस गलतियों को परिवर्तित करते हैं, साइरस एक अच्छी त्रुटि नहीं करता है और फेंक देता है।

PHP_EOL आधार पर निरंतर, यह "\n" लिनक्स, विंडोज पर "\r" मैक पर और "\r\n" पर है, उदाहरण के लिए एक प्रणाली है।

इसके अलावा imap_fetchheader() में पिछला "\r\n" अपेक्षित है। तो सही उदाहरण होगा:

$source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno); 
12

मैं इस प्रश्न पर आया जब मैं एक ही मुद्दे की खोज कर रहा था। मुझे पता था कि इसे हाकर द्वारा समाधान से आसान होना था और मुझे imap_fetchbody के लिए post from 5 years ago पर पृष्ठ पर सही उत्तर मिला।

प्राप्त करने के लिए पूर्ण कच्चे संदेश सिर्फ निम्नलिखित का उपयोग करें:

$imap_stream = imap_open($server, $username, $password); 
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, ""); 

सूचना imap_fetchbody इस के तीसरे पैरामीटर के रूप में रिक्त स्ट्रिंग सभी भागों और ईमेल के उप-भागों हेडर और सभी निकायों सहित, का प्रतीक है।

+0

कमाल! क्या यह अनुलग्नक लाता है? – VeeeneX

+2

@ वीनेक्स हाँ, यह सब कुछ लाता है। अनुलग्नकों को डीकोड करने की आवश्यकता होती है, वे सामान्य रूप से बेस 64 एन्कोडेड होते हैं। आजकल ईमेल प्रदाता OneDrive/GoogleDrive का उपयोग करके "अनुलग्नक" भेजने की अनुमति देते हैं, ये वास्तविक अनुलग्नक नहीं हैं, वे नहीं लाए जाएंगे। –

+0

यह सबसे अच्छा समाधान है - पूरा संदेश पुनर्प्राप्त करने के लिए केवल एक पंक्ति ताकि आप इसे एक पार्सर में खिला सकें। $ raw_full_email = imap_fetchbody ($ हैंडल, $ num, ""); $ पार्सर = नया PhpMimeMailParser \ Parser(); $ पार्सर-> सेटटेक्स्ट ($ raw_full_email); – Tramov

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