Python消息'对象没有属性'get_body

Python Message' object has no attribute 'get_body

我正在尝试搜索电子邮件正文,但遇到了一些问题:

 #!/usr/local/bin/python3
from email.message import EmailMessage
import email
import imaplib
import re
import sys
import logging
import base64
import os
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

###########log in to mailbox########################
user = 'email@company.com'
pwd = 'pwd'

conn = imaplib.IMAP4_SSL("outlook.office365.com")
conn.login(user,pwd)
conn.select("test")
count = conn.select("test")

resp, items = conn.uid("search" ,None, '(OR (FROM "some@email) (FROM "some@email"))')

items = items[0].split()
for emailid in items:
    resp, data = conn.uid("fetch",emailid, "(RFC822)")
    if resp == 'OK':
        email_body = data[0][1]#.decode('utf-8')
        mail = email.message_from_bytes(email_body)

        #get all emails with words "PA1" or "PA2" in subject
        if mail["Subject"].find("PA1") > 0 or mail["Subject"].find("PA2") > 0:
           print (mail)

我在以下行中遇到问题:

body = mail.get_body(preferencelist=('plain', 'html'))

得到:

AttributeError: 'Message' 对象没有属性 'get_body'

如果您可以先从文本中删除所有换行符=^M\n,那么就很简单了:

import re

email_body = open("1.txt").read().replace("=^M\n", "")

matches = re.findall(r"(?<=MACHINE:)\s*(\w+)", email_body)

print(matches)
print(list(set(matches)))

输出:

['p1prog07', 'p2prog06', 'p2prog06', 'p1prog07', 'ldnv260']
['p2prog06', 'ldnv260', 'p1prog07']

正向后视是一个非捕获组,因此正则表达式中唯一捕获的组是您想要的字符串。

您不应将 MIME 结构转换为字符串,然后将其提供给 message_from_string。相反,将其保留为 bytes 对象。

from email.policy import default as default_policy
...
items = items[0].split()
for emailid in items:
    resp, data = conn.uid("fetch",emailid, "(RFC822)")
    if resp == 'OK':
        email_blob = data[0][1]
        mail = email.message_from_bytes(email_blob, policy=default_policy)
        if not any(x in mail['subject'] for x in ('PA1', 'PA2')):
            continue

你没有展示你是如何遍历 MIME 结构的,所以我假设你目前根本没有这样做。可能你想要像

这样的东西
        # continuation for the above code
        body = mail.get_body(preferencelist=('plain', 'html'))
        for lines in body.split('\n'):
            if line.startswith('MACHINE:'):
                result = line[8:].strip()
                break

您的电子邮件正文部分似乎使用 Content-Transfer-Encoding: quoted-printable 编码。上面的代码对各种编码都很健壮,因为 email 库会为您透明地解码封装,从而消除任何 QP 转义的换行符,就像您问题中的换行符一样。作为记录,quoted-printable 可以在任何地方打断一长行,包括在您尝试提取的值的中间,因此您确实希望在尝试提取任何内容之前进行解码。

要处理消息:

AttributeError: 'Message' 对象没有属性 'get_body'

创建 Message 对象时,您需要指定一个策略,否则您将获得默认的 email.policy.Compat32 策略。 get_body() 和其他几种方法在 Python 3.2.

中不存在

创建邮件对象的行应该是:

mail = email.message_from_bytes(data, policy=email.policy.default)

更多信息:

https://docs.python.org/3/library/email.policy.html