email.message_from_string() 和 imaplib 添加 '<' '>'

Posted

技术标签:

【中文标题】email.message_from_string() 和 imaplib 添加 \'<\' \'>\'【英文标题】:email.message_from_string() and imaplib adding '<' '>'email.message_from_string() 和 imaplib 添加 '<' '>' 【发布时间】:2015-05-10 10:22:44 【问题描述】:

好的,所以我使用 imaplib 从 gmail 加载电子邮件,然后当我尝试解析电子邮件时,它不会以可用格式分离任何内容。我怀疑这是因为进程中的某处“”被添加到原始电子邮件中。

这是我调用该方法后调试器向我显示的内容: 正如你所看到的,它并没有真正将任何东西解析成可用的格式。

这是我正在使用的代码:(注意:.replace('&gt;', '') 似乎对最终结果没有影响。)

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('myEmail@gmail.com', 'password')
mail.list()
mail.select('inbox')
typ, data = mail.search(None, 'ALL')
ids = data[0]
id_list = ids.split()

# get the most recent email id
latest_email_id = int( id_list[-1] )

# iterate through 15 messages in descending order starting with latest_email_id
# the '-1' dictates reverse looping order

for i in range( latest_email_id -10, latest_email_id-15, -1 ):
    typ, data = mail.fetch( str(i), '(RFC822)' )

    for response_part in data:
        if isinstance(response_part, tuple):
            msg = str(response_part[1]).replace('<', '')
            msg = msg.replace('>', '')
            msg = email.message_from_string(msg)
            #msg = feedparser.parse(response_part[1])
            varSubject = msg['subject']
            varFrom = msg['from']

python email.message_from_string() parse problems 和 Parsing email with Python 对我来说都有非常相似和相同的问题(我认为),他们通过更改电子邮件解决了这个问题,但是我直接从 Google 的服务器阅读我的电子邮件,所以我不确定由于删除所有 '' 显然是行不通的,如何对电子邮件进行修复。

那么,如何修复从 imaplib 读取的电子邮件,以便使用 email.message_from_string() 轻松读取它? (或任何其他改进/可能的解决方案,因为我不能 100% 确定 '' 实际上是问题所在,我只是根据提出的其他问题进行猜测。)

干杯

【问题讨论】:

【参考方案1】:

您不应该解析&lt;&gt; 和它们之间的数据 - 这就像解析 html,但要复杂得多。有现有的解决方案可以做到这一点。 这是我的代码,可以读取带有附件的邮件,提取可用于进一步使用的数据并将其处理为人工和代码可读格式.如您所见,所有任务均由第三方模块完成。

from datetime import datetime
import imaplib
import email
import html2text
from os import path

class MailClient(object):
    def __init__(self):
        self.m = imaplib.IMAP4_SSL('your.server.com')
        self.Login()


    def Login(self):
        result, data = self.m.login('login@domain.com', 'p@s$w0rd')
        if result != 'OK':
            raise Exception("Error connecting to mailbox: ".format(data))


    def ReadLatest(self, delete = True):
        result, data = self.m.select("inbox")
        if result != 'OK':
            raise Exception("Error reading inbox: ".format(data))
        if data == ['0']:
            return None
        latest = data[0].split()[-1]
        result, data = self.m.fetch(latest, "(RFC822)")
        if result != 'OK':
            raise Exception("Error reading email: ".format(data))
        if delete:
            self.m.store(latest, '+FLAGS', '\\Deleted')

        message = email.message_from_string(data[0][1])
        res = 
            'From' : email.utils.parseaddr(message['From'])[1],
            'From name' : email.utils.parseaddr(message['From'])[0],
            'Time' : datetime.fromtimestamp(email.utils.mktime_tz(email.utils.parsedate_tz(message['Date']))),
            'To' : message['To'],
            'Subject' : email.Header.decode_header(message["Subject"])[0][0],
            'Text' : '',
            'File' : None 
        

        for part in message.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get_content_maintype() == 'text':
                # reading as HTML (not plain text)

                _html = part.get_payload(decode = True)
                res['Text'] = html2text.html2text(_html)

            elif part.get_content_maintype() == 'application' and part.get_filename():
                fname = path.join("your/folder", part.get_filename())
                attachment = open(fname, 'wb')
                attachment.write(part.get_payload(decode = True))
                attachment.close()
                if res['File']:
                    res['File'].append(fname)
                else:
                    res['File'] = [fname]

        return res


    def __del__(self):
        self.m.close()

【讨论】:

以上是关于email.message_from_string() 和 imaplib 添加 '<' '>'的主要内容,如果未能解决你的问题,请参考以下文章

Python:鉴于原始电子邮件没有“正文”标签或任何东西,如何从原始电子邮件中解析正文