Python - 从纯文本邮件中提取正文
Posted
技术标签:
【中文标题】Python - 从纯文本邮件中提取正文【英文标题】:Python - Extract the body from a mail in plain text 【发布时间】:2015-11-05 04:51:42 【问题描述】:我只想提取邮件正文并将其返回。 我可以过滤字段并显示 sn-p 但不能显示正文。
def GetMimeMessage(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
print 'Message snippet: %s' % message['snippet']
msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
mime_msg = email.message_from_string(msg_str)
return mime_msg
except errors.HttpError, error:
print 'An error occurred: %s' % error
https://developers.google.com/gmail/api/v1/reference/users/messages/get
【问题讨论】:
【参考方案1】:谢谢。所以经过一些修改,这里的解决方案:
def GetMessageBody(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
mime_msg = email.message_from_string(msg_str)
messageMainType = mime_msg.get_content_maintype()
if messageMainType == 'multipart':
for part in mime_msg.get_payload():
if part.get_content_maintype() == 'text':
return part.get_payload()
return ""
elif messageMainType == 'text':
return mime_msg.get_payload()
except errors.HttpError, error:
print 'An error occurred: %s' % error
【讨论】:
我今天刚收到一封电子邮件,其中multipart
嵌套在另一个 multipart
中,但未能成功。现在尝试其他方式,这似乎很有希望docs.python.org/3.4/library/…
TypeError: initial_value 必须是 str 或 None,而不是 bytes
试试 email.message_from_bytes()
感谢 message_from_bytes() 选项@F***Bosler 我遇到了同样的错误。【参考方案2】:
试试这个:
mail
参数是你的 mime_msg
变量
def get_mpart(mail):
maintype = mail.get_content_maintype()
if maintype == 'multipart':
for part in mail.get_payload():
# This includes mail body AND text file attachments.
if part.get_content_maintype() == 'text':
return part.get_payload()
# No text at all. This is also happens
return ""
elif maintype == 'text':
return mail.get_payload()
def get_mail_body(mail):
"""
There is no 'body' tag in mail, so separate function.
:param mail: Message object
:return: Body content
"""
body = ""
if mail.is_multipart():
# This does not work.
# for part in mail.get_payload():
# body += part.get_payload()
body = get_mpart(mail)
else:
body = mail.get_payload()
return body
【讨论】:
【参考方案3】:base64url 编码的字符串在传入解码函数之前需要进行一些修改,如下所示:
msg_str = base64.urlsafe_b64decode(message['raw'].replace('-_', '+/').encode('ASCII'))
看看有没有帮助
【讨论】:
以上是关于Python - 从纯文本邮件中提取正文的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用 BeautifulSoup 从脚本标签中提取文本
从 MBOX 文件中提取纯文本/文本和 html 正文到列表