सवाल पायथन: कच्चे ईमेल से शरीर को कैसे पार्स करें, यह देखते हुए कि कच्चे ईमेल में "बॉडी" टैग या कुछ भी नहीं है


यह प्राप्त करना आसान लगता है

From
To
Subject

आदि के माध्यम से

import email
b = email.message_from_string(a)
bbb = b['from']
ccc = b['to']

ऐसा मानते हुए "a" कच्ची ईमेल स्ट्रिंग है जो इस तरह कुछ दिखती है।

a = """From root@a1.local.tld Thu Jul 25 19:28:59 2013
Received: from a1.local.tld (localhost [127.0.0.1])
    by a1.local.tld (8.14.4/8.14.4) with ESMTP id r6Q2SxeQ003866
    for <ooo@a1.local.tld>; Thu, 25 Jul 2013 19:28:59 -0700
Received: (from root@localhost)
    by a1.local.tld (8.14.4/8.14.4/Submit) id r6Q2Sxbh003865;
    Thu, 25 Jul 2013 19:28:59 -0700
From: root@a1.local.tld
Subject: oooooooooooooooo
To: ooo@a1.local.tld
Cc: 
X-Originating-IP: 192.168.15.127
X-Mailer: Webmin 1.420
Message-Id: <1374805739.3861@a1>
Date: Thu, 25 Jul 2013 19:28:59 -0700 (PDT)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="bound1374805739"

This is a multi-part message in MIME format.

--bound1374805739
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

ooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooo

--bound1374805739--"""

प्रश्न

आप कैसे प्राप्त करते हैं Body पाइथन के माध्यम से इस ईमेल का?

अभी तक यह एकमात्र कोड है जिसे मैं जानता हूं लेकिन मुझे अभी तक इसका परीक्षण नहीं करना है।

if email.is_multipart():
    for part in email.get_payload():
        print part.get_payload()
else:
    print email.get_payload()

क्या यह सही तरीका है?

या शायद कुछ आसान है जैसे ...

import email
b = email.message_from_string(a)
bbb = b['body']

?


44
2017-07-26 06:25


मूल




जवाब:


उपयोग Message.get_payload

b = email.message_from_string(a)
if b.is_multipart():
    for payload in b.get_payload():
        # if payload.is_multipart(): ...
        print payload.get_payload()
else:
    print b.get_payload()

51
2017-07-26 06:30



@ गगनदीपसिंह, सही के लिए धन्यवाद। - falsetru
वैसे भी इसे डीकोडेड सादा पाठ में दिखाने के लिए?
कोई बात नहीं! मुझे एहसास हुआ कि मैं बस बेस 64 लाइब्रेरी का उपयोग कर सकता हूं और base64.b64decode ()
मैं इसे ढूंढ रहा हूं। धन्यवाद! मेरे लिए पूरी तरह से काम किया! : डी - hocuspocus31


अत्यधिक सकारात्मक होने के लिए आप वास्तविक ईमेल निकाय के साथ काम करते हैं (फिर भी, संभावना है कि आप सही हिस्से को पार्स नहीं कर रहे हैं), आपको संलग्नक छोड़ना होगा, और सादे या HTML भाग (अपनी आवश्यकताओं के आधार पर) पर ध्यान देना होगा प्रसंस्करण।

जैसा कि पहले उल्लिखित अनुलग्नक टेक्स्ट / सादा या टेक्स्ट / एचटीएमएल भाग के अक्सर होते हैं, यह गैर-बुलेट प्रूफ नमूना सामग्री-स्वभाव शीर्षलेख की जांच करके उन्हें छोड़ देता है:

b = email.message_from_string(a)
body = ""

if b.is_multipart():
    for part in b.walk():
        ctype = part.get_content_type()
        cdispo = str(part.get('Content-Disposition'))

        # skip any text/plain (txt) attachments
        if ctype == 'text/plain' and 'attachment' not in cdispo:
            body = part.get_payload(decode=True)  # decode
            break
# not multipart - i.e. plain text, no attachments, keeping fingers crossed
else:
    body = b.get_payload(decode=True)

Btw, walk() माइम भागों पर अद्भुत ढंग से पुनरावृत्त करता है, और get_payload(decode=True) आपके लिए डीकोडिंग बेस 64 आदि पर गंदा काम करता है।

कुछ पृष्ठभूमि - जैसा कि मैंने निहित किया है, एमआईएमई ईमेल की अद्भुत दुनिया संदेश निकाय को खोजने में "गलत तरीके से" बहुत सारी समस्याएं प्रस्तुत करती है। सबसे सरल मामले में यह एकमात्र "टेक्स्ट / सादा" भाग में है और get_payload () बहुत मोहक है, लेकिन हम एक साधारण दुनिया में नहीं रहते हैं - यह अक्सर मल्टीपार्ट / वैकल्पिक, संबंधित, मिश्रित आदि सामग्री से घिरा हुआ होता है। विकिपीडिया इसे कड़ाई से वर्णन करता है - माइम, लेकिन नीचे दिए गए इन सभी मामलों पर विचार मान्य हैं - और आम - किसी को सुरक्षा नेट पर विचार करना होगा:

बहुत आम - सामान्य संपादक (जीमेल, आउटलुक) में आपको जो कुछ मिलता है वह संलग्नक के साथ स्वरूपित पाठ भेजता है:

multipart/mixed
 |
 +- multipart/related
 |   |
 |   +- multipart/alternative
 |   |   |
 |   |   +- text/plain
 |   |   +- text/html
 |   |      
 |   +- image/png
 |
 +-- application/msexcel

अपेक्षाकृत सरल - बस वैकल्पिक प्रतिनिधित्व:

multipart/alternative
 |
 +- text/plain
 +- text/html

अच्छे या बुरे के लिए, यह संरचना भी मान्य है:

multipart/alternative
 |
 +- text/plain
 +- multipart/related
      |
      +- text/html
      +- image/jpeg

उम्मीद है इससे कुछ मदद मिली होगी।

अनुलेख मेरा मुद्दा ईमेल से हल्के से संपर्क नहीं करता है - जब आप कम से कम इसकी उम्मीद करते हैं तो यह काटता है :)


53
2017-09-29 09:30



इस पूरी तरह से उदाहरण के लिए धन्यवाद और एक चेतावनी वर्तनी के लिए - स्वीकृत उत्तर के विपरीत। मुझे लगता है कि यह एक बेहतर / सुरक्षित दृष्टिकोण है। - Simon Steinberger


कोई नहीं है b['body'] अजगर में आपको get_payload का उपयोग करना होगा।

if isinstance(mailEntity.get_payload(), list):
    for eachPayload in mailEntity.get_payload():
        ...do things you want...
        ...real mail body is in eachPayload.get_payload()...
else:
    ...means there is only text/plain part....
    ...use mailEntity.get_payload() to get the body...

शुभ लाभ।


4
2017-07-26 06:36





बहुत अच्छा है पैकेज उचित दस्तावेज के साथ ईमेल सामग्री पार्स करने के लिए उपलब्ध है।

import mailparser

mail = mailparser.parse_from_file(f)
mail = mailparser.parse_from_file_obj(fp)
mail = mailparser.parse_from_string(raw_mail)
mail = mailparser.parse_from_bytes(byte_mail)

कैसे इस्तेमाल करे:

mail.attachments: list of all attachments
mail.body
mail.to

2
2018-03-15 09:05