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)
更多信息:
我正在尝试搜索电子邮件正文,但遇到了一些问题:
#!/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)
更多信息: