2009-02-27 11 views
7

मेरा आवेदन पायथन में लिखा गया है। मैं जो कर रहा हूं वह है कि मैं पोस्टफिक्स द्वारा प्राप्त प्रत्येक ईमेल पर एक स्क्रिप्ट चला रहा हूं और ईमेल सामग्री के साथ कुछ करता हूं। ईमेल के रूप में ईमेल लेने के लिए स्क्रिप्ट चलाने के लिए Procmail जिम्मेदार है। समस्या तब शुरू हुई जब मैं इनपुट संदेश (टेक्स्ट हो सकता है) को ईमेल_मेसेज ऑब्जेक्ट में परिवर्तित कर रहा था (क्योंकि बाद वाला काम आसान है)। मैं email.message_from_string का उपयोग कर रहा हूं (जहां ईमेल डिफ़ॉल्ट ईमेल मॉड्यूल है, पाइथन के साथ आता है)।ईमेल बॉडी कभी-कभी एक स्ट्रिंग और कभी-कभी एक सूची होती है। क्यूं कर?

import email message = email.message_from_string(original_mail_content) message_body = message.get_payload()

यह MESSAGE_BODY कभी कभी एक सूची [email.message.Message उदाहरण, email.message.Message उदाहरण] लौटा रहा है और कुछ समय के लिए एक स्ट्रिंग (आने वाली ईमेल की वास्तविक शरीर सामग्री) लौटने। क्यों यह है। और यहां तक ​​कि मुझे एक और अवलोकन मिला। जब मैं email.message.getess.get_payload() docstring के माध्यम से ब्राउज़ कर रहा था, मुझे यह मिला ..
"" पेलोड या तो एक सूची ऑब्जेक्ट या स्ट्रिंग होगा। अगर आप सूची वस्तु को संशोधित करते हैं, तो आप संशोधित करते हैं संदेश का पेलोड स्थान पर ..... ""

तो मेरे पास पाइथन के माध्यम से ईमेल के शरीर को प्राप्त करने के लिए सामान्य तरीका कैसे है? कृपया मेरी मदद करें।

उत्तर

11

खैर, उत्तर सही हैं, आप डॉक्स पढ़ना चाहिए, लेकिन एक सामान्य तरीके का एक उदाहरण के लिए:

def get_first_text_part(msg): 
    maintype = msg.get_content_maintype() 
    if maintype == 'multipart': 
     for part in msg.get_payload(): 
      if part.get_content_maintype() == 'text': 
       return part.get_payload() 
    elif maintype == 'text': 
     return msg.get_payload() 

यह कुछ आपदा की संभावना है, के रूप में यह कल्पना भागों खुद को multiparts हो सकता है , और यह वास्तव में केवल पहला टेक्स्ट भाग देता है, इसलिए यह भी गलत हो सकता है, लेकिन आप इसके साथ खेल सकते हैं।

+0

संदेश सूची में मैंने बात की, मैंने प्रत्येक ऑब्जेक्ट पर get_payload() चलाने का प्रयास किया। दोनों एक ही चीज़ लौटते हैं। क्या एक ऑब्जेक्ट दूसरे प्रकार का क्लोन है, ताकि अगर मुझे एक ही भाग पर get_payload कहा जाता है तो ??? –

+0

आपको जो भेजा गया है उस पर निर्भर करता है। उदाहरण के लिए, आप आमतौर पर एक पाठ/एचटीएमएल और एक ही चीज़ का एक पाठ/सादा संस्करण प्राप्त कर सकते हैं। आप अन्य टेक्स्ट/प्रकारों पर टेक्स्ट/सादा सामग्री प्रकार को देखने और पसंद करने के लिए फ़ंक्शन को संशोधित कर सकते हैं। – bobince

+0

बहुत बढ़िया बॉबन्स।आप बिल्कुल सही हैं: डी –

10

के रूप में पागल कभी कभी स्ट्रिंग के लिए कारण है, कभी कभी सूची-अर्थ विज्ञान given in the documentation हैं। असल में, मल्टीपार्ट संदेशों को सूचियों के रूप में वापस कर दिया जाता है।

+0

है। है। पागल। –

9

के बजाय, उपयोग की पैदल दूरी पर बस एक उप-भाग की तलाश में() संदेश सामग्री के माध्यम से पुनरावृति करने के लिए

def walkMsg(msg): 
    for part in msg.walk(): 
    if part.get_content_type() == "multipart/alternative": 
     continue 
    yield part.get_payload(decode=1) 

की पैदल दूरी पर() विधि पुनरावर्तक देता है कि आप कर सकते हैं के साथ पाश (यानी यह एक जनरेटर है) । अगर संदेश भागों के कंटेनर नहीं है (यानी कोई अनुलग्नक या वैकल्पिक नहीं है), तो चलने() विधि फिर एक तत्व के साथ एक पुनरावर्तक लौटाएगी - संदेश स्वयं।

आप किसी भी 'मल्टीपार्ट' भागों को छोड़ना चाहते हैं क्योंकि वे सिर्फ गोंद हैं।

उपर्युक्त विधि सभी पठनीय भागों को वापस लाती है। यदि आप अपनी इच्छित जानकारी को शामिल करते हैं तो आप टेक्स्ट पार्ट्स को वापस लौटने के लिए इसका विस्तार करना चाह सकते हैं।

ध्यान दें कि अजगर 2.5 के रूप में, तरीकों get_type(), get_main_type(), और get_subtype() हटा दिया गया है ->http://docs.python.org/library/email.message.html#email.message.Message.walk

+0

यह ओपी, आईएमएचओ द्वारा स्वीकार किए गए एक से बेहतर जवाब है। –

+0

मुझे लगता है कि अगर कथन – veered

+0

में एकल '=' होना चाहिए '==' धन्यवाद - सही – timbo

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