2009-09-22 15 views
28

पायथन 2.6 में एक आरएफसी 822 संदेश को देखते हुए, मैं सही टेक्स्ट/सादा सामग्री भाग कैसे प्राप्त कर सकता हूं? असल में, एल्गोरिथ्म मैं चाहता हूँ यह है:पायथन का उपयोग करके मुझे ईमेल संदेश की टेक्स्ट सामग्री कैसे मिल सकती है?

message = email.message_from_string(raw_message) 
if has_mime_part(message, "text/plain"): 
    mime_part = get_mime_part(message, "text/plain") 
    text_content = decode_mime_part(mime_part) 
elif has_mime_part(message, "text/html"): 
    mime_part = get_mime_part(message, "text/html") 
    html = decode_mime_part(mime_part) 
    text_content = render_html_to_plaintext(html) 
else: 
    # fallback 
    text_content = str(message) 
return text_content 
इन बातों का

, मैं get_mime_part और पैट नीचे has_mime_part है, लेकिन मैं काफी यकीन है कि कैसे माइम हिस्से से डीकोड पाठ पाने के लिए नहीं कर रहा हूँ। मैं get_payload() का उपयोग कर इनकोडिंग पाठ प्राप्त कर सकते हैं, लेकिन अगर मैं get_payload() विधि के decode पैरामीटर का उपयोग करने का प्रयास करें (the doc देखें) मैं कोई त्रुटि मिलती है जब मैं पाठ/सादे ओर से यह कहते हैं:

File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/email/message.py", line 189, in get_payload 
    raise TypeError('Expected list, got %s' % type(self._payload)) 
TypeError: Expected list, got <type 'str'> 

इसके अलावा, मुझे नहीं पता कि एचटीएमएल कैसे लेना है और जितना संभव हो सके पाठ को प्रस्तुत करना है।

+1

मैं http://ginstrom.com/scribbles/2007/11/19/parsing-multilingual-email-with- में कुछ इसी तरह के लिए एक उपयोगी समाधान नहीं मिला पायथन/ – beldaz

उत्तर

69

एक मल्टीपार्ट ई-मेल में, email.message.Message.get_payload() प्रत्येक भाग के लिए एक आइटम के साथ एक सूची देता है। एक गैर बहुखण्डीय संदेश, सभी पैदल करने की कोई आवश्यकता के लिए

import email 
msg = email.message_from_string(raw_message) 
for part in msg.walk(): 
    # each part is a either non-multipart, or another multipart message 
    # that contains further parts... Message is organized like a tree 
    if part.get_content_type() == 'text/plain': 
     print part.get_payload() # prints the raw text 

: सबसे आसान तरीका संदेश चलना और प्रत्येक भाग पर पेलोड प्राप्त करने के लिए है। Content_type पर ध्यान दिए बिना, आप सीधे get_payload() पर जा सकते हैं।

msg = email.message_from_string(raw_message) 
msg.get_payload() 

सामग्री इनकोडिंग है, तो आप Noneget_payload() को पहले पैरामीटर, यह सच है (डिकोड झंडा दूसरा पैरामीटर है) के बाद के रूप में पारित करने के लिए की जरूरत है। उदाहरण के लिए, मान लीजिए कि मेरा ई-मेल एक एमएस वर्ड दस्तावेज़ अनुलग्नक:

msg = email.message_from_string(raw_message) 
for part in msg.walk(): 
    if part.get_content_type() == 'application/msword': 
     name = part.get_param('name') or 'MyDoc.doc' 
     f = open(name, 'wb') 
     f.write(part.get_payload(None, True)) # You need None as the first param 
               # because part.is_multipart() 
               # is False 
     f.close() 

एक HTML भाग का एक उचित सादे-पाठ सन्निकटन प्राप्त करने के लिए के रूप में, मुझे लगता है कि html2text काम करता है सुंदर रफ़ू अच्छी तरह से मिल गया है।

+1

+1, बहुत स्पष्ट और उपयोगी स्पष्टीकरण। –

+0

यह एक उत्कृष्ट स्पष्टीकरण है ... जो कि मुझे पहले से ही मिला है; जैसा कि मैंने उल्लेख किया है, भाग के नंगे पेलोड को ढूंढ और निकाल सकते हैं। हालांकि, अगर यह डीकोड किया गया है, तो मैं भाग को डीकोड नहीं कर सकता, और न ही टेक्स्ट/एचटीएमएल भाग पाठ में प्रस्तुत कर सकता हूं यदि कोई टेक्स्ट/सादा हिस्सा उपलब्ध न हो। –

+0

(पुनः पढ़ने पर - क्षमा करें, कॉफी की कमी है!) ठीक है, ठीक है, तो आपने मेरी एचटीएमएल को टेक्स्ट समस्या हल कर दी है :) –

-1

फ्लैट नेस्ट की तुलना में बेहतर है,)

from email.mime.multipart import MIMEMultipart 
assert isinstance(msg, MIMEMultipart) 

for _ in [k.get_payload() for k in msg.walk() if k.get_content_type() == 'text/plain']: 
    print _ 
+0

यह सभी 'टेक्स्ट/सादा' भागों को अंधाधुंध निकाल देता है, जिन पर कोई ध्यान नहीं दिया जाता है। – tripleee

+0

@ ट्रिपली आम तौर पर हम एक सादे, एक एचटीएमएल भाग, और कई छवि भागों का उपयोग करते हैं। यहां तक ​​कि यदि सादे भागों से अधिक है, तो आप कैसे जानते हैं कि कौन सा सही है? – guneysus

+1

सामान्य मामले में, एक अपूर्ण 'मल्टीपार्ट/वैकल्पिक' के साथ जहां केवल एक हिस्सा 'टेक्स्ट/सादा' है, वह एक।अधिक सामान्य मामले में, मुझे नहीं लगता कि एक ही सही उत्तर है, क्योंकि यह आपके आवेदन के उद्देश्य और प्राप्तकर्ता की प्राथमिकताओं पर निर्भर करता है। – tripleee

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

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