Python: como processar coisas como: de, para, corpo, a partir de uma fonte de E-mail raw w/Python [duplicado]

Esta pergunta já tem uma resposta:

o e-mail cru normalmente parece-se com isto

From [email protected] 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 <[email protected]>; 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: [email protected]
Subject: ooooooooooooooooooooooo
To: [email protected]
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

ooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooo

--bound1374805739--
Então, se eu quisesse codificar um script PYTHON para obter o

From
To
Subject
Body
Este é o código que estou à procura para construir ou há um método melhor?

a='<title>aaa</title><title>aaa2</title><title>aaa3</title>'

import re
a1 = re.findall(r'<(title)>(.*?)<(/title)>', a)
Author: Ro Yo Mi, 2013-07-26

5 answers

Eu realmente não entendo o que seu excerto de código final tem a ver com qualquer coisa - Você não mencionou nada sobre HTML até esse ponto, então eu não sei por que de repente você estaria dando um exemplo de análise HTML (o que você nunca deveria fazer com um regex de qualquer maneira).

De qualquer forma, para responder à sua pergunta original sobre como obter os cabeçalhos de uma mensagem de E-mail, o Python inclui um código para fazer isso na biblioteca padrão:

import email
msg = email.message_from_string(email_string)
msg['from']  # '[email protected]'
msg['to']    # '[email protected]'
 9
Author: Daniel Roseman, 2013-07-26 03:03:41

Felizmente o Python torna isto mais simples: http://docs.python.org/2.7/library/email.parser.html#email.parser.Parser

from email.parser import Parser
parser = Parser()

emailText = """PUT THE RAW TEXT OF YOUR EMAIL HERE"""
email = parser.parsestr(emailText)

print email.get('From')
print email.get('To')
print email.get('Subject')
O corpo é mais complicado. Call email.is_multipart(). Se isso for falso, você pode obter o seu corpo chamando email.get_payload(). No entanto, se for verdade, email.get_payload() devolverá uma lista de mensagens, por isso terá de ligar get_payload() para cada uma delas.
if email.is_multipart():
    for part in email.get_payload():
        print part.get_payload()
else:
    print email.get_payload()
 7
Author: Kiwi, 2013-07-26 03:09:04

Provavelmente devias usar e-mail.analisador

s = """
From [email protected] 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 <[email protected]>; 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: [email protected]
Subject: ooooooooooooooooooooooo
To: [email protected]
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

ooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooo

--bound1374805739--
"""

import email.parser

msg = email.parser.Parser().parsestr(s)
help(msg)
 1
Author: Mark Roberts, 2013-07-26 03:03:50

"corpo" não está presente no seu email de amostra

Pode usaremail Módulo:

import email
    msg = email.message_from_string(email_message_as_text)

Depois utilizar:

print email['To']
print email['From']

... ... etc

 1
Author: P0W, 2013-07-26 03:09:12

Podias escrever esse conteúdo em bruto num ficheiro

Então leia o ficheiro assim:

with open('in.txt', 'r') as file:
    raw = file.readlines()

get_list = ['From:','To:','Subject:']
info_list = []

for i in raw:
    for word in get_list:
        if i.startswith(word):
            info_list.append(i)

Agora {[2] } será:

['From: [email protected]', 'Subject: ooooooooooooooooooooooo', 'To: [email protected]']

Não vejo {[3] } no seu conteúdo bruto

 0
Author: Serial, 2013-07-26 03:03:26