当前位置: 首页 > 面试题库 >

如何使用Python获取电子邮件的文本内容?

孟新知
2023-03-14
问题内容

给定Python 2.6中的RFC822消息,如何获得 正确的 文本/纯文本内容部分?基本上,我想要的算法是这样的:

message = email.message_from_string(raw_message)
if has_mime_part(message, "text/plain"):
    mime_part = get_mime_part(message, "text/plain")
    text_content = decode_mime_part(mime_part)
elif has_mime_part(message, "text/html"):
    mime_part = get_mime_part(message, "text/html")
    html = decode_mime_part(mime_part)
    text_content = render_html_to_plaintext(html)
else:
    # fallback
    text_content = str(message)
return text_content

这些事,我get_mime_parthas_mime_part拍下来,但我不太清楚如何从MIME部分解码的文本。我可以使用来获取 编码后的
文本get_payload(),但是如果尝试使用方法decode参数get_payload()(请参阅doc),则在text
/ plain部分调用它时会出现错误:

File

“/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
email/message.py”, line 189, in get_payload
raise TypeError(‘Expected list, got %s’ % type(self._payload))
TypeError: Expected list, got

另外,我不知道如何获取HTML并将其尽可能地呈现为文本。


问题答案:

在多部分电子邮件中,email.message.Message.get_payload()返回一个列表,其中每个部分都有一个项目。最简单的方法是遍历消息并获取每个部分的有效负载:

import email
msg = email.message_from_string(raw_message)
for part in msg.walk():
    # each part is a either non-multipart, or another multipart message
    # that contains further parts... Message is organized like a tree
    if part.get_content_type() == 'text/plain':
        print part.get_payload() # prints the raw text

对于非多部分消息,无需进行所有遍历。无论content_type如何,您都可以直接进入get_payload()。

msg = email.message_from_string(raw_message)
msg.get_payload()

如果内容已编码,则需要None将第一个参数传递给get_payload(),然后传递True(解码标志是第二个参数)。例如,假设我的电子邮件包含MS
Word文档附件:

msg = email.message_from_string(raw_message)
for part in msg.walk():
    if part.get_content_type() == 'application/msword':
        name = part.get_param('name') or 'MyDoc.doc'
        f = open(name, 'wb')
        f.write(part.get_payload(None, True)) # You need None as the first param
                                              # because part.is_multipart() 
                                              # is False
        f.close()

至于获得HTML部分的合理的纯文本近似,我发现html2text的效果很好。



 类似资料:
  • 问题内容: 我想从IMAP4服务器获取整个邮件。在python文档中,如果发现此代码有效: 我想知道我是否总是可以相信data [0] [1]返回消息的主体。当我运行“ RFC822.SIZE”时,我只有一个字符串而不是一个元组。 我已经浏览了rfc1730,但无法弄清楚“ RFC822”的正确响应结构。也很难从imaplib文档中得知获取结果的结构。 这是我在获取时得到的: 但是当我获取时,我得

  • 问题内容: 我已经从配置文件构造了Build版本,并将该版本号值保存到了我的工作空间中的文件中。该文件的内容将包含类似2014.4.3.87的值 现在,我需要将此值传递给Jenkins电子邮件正文。我已经安装了电子邮件扩展插件。我该怎么做。 问题答案: 您可以使用shell命令回显文件内容并将其保存到另一个文件中,例如content =“ real content” 例如: 您可以使用env in

  • 我试图了解Gmail API的工作原理。我的目标是在用户的收件箱中检索所有电子邮件的列表,并将其下载到。 目前的工作流程如下: > 使用Google提供的框架用OAuth 2.0授权我的iOS应用,我已经完成了这一步,我的应用可以成功授权一个gmail帐户。 下载电子邮件: 从文档来看,这似乎是显示消息列表的API调用: 去找https://www.googleapis.com/gmail/v1/

  • 我在我的系统中使用谷歌广告API PHP库。但是我没有在这里提供的API列表中找到以下2个APIhttps://developers.google.com/google-ads/api/docs/account-management/create-account: API,以查明用户是否已经存在使用电子邮件的谷歌广告帐户?如果找到,则返回其10位数的客户ID。 我在几个网站上见过同样的过程。每当用

  • 问题内容: 我的Android应用程序中有一个Facebook登录选项,但尝试获取用户的电子邮件失败。在用户登录并添加到Parse.com用户表(具有有效的访问令牌)之后,我请求Facebook用户信息,但仅获取其ID和名称(即使电子邮件已设置为权限之一) )。 这是我的代码(在我的按钮的OnClickListener内部): 问题答案: 我想这与Graph API v2.4中的更改有关,该更改使

  • 问题内容: 我正在使用Graph API,但无法弄清楚如何获取登录用户的电子邮件地址。 Graph简介指出:“ Graph API可以提供您通常会以注册表格形式请求的所有基本帐户注册数据的访问权限,包括名称,电子邮件地址,个人资料图片和生日” 很好,但是如何访问该信息? 这是我到目前为止的内容: 问题答案: 获取用户电子邮件地址的唯一方法是在电子邮件字段上请求扩展权限。用户必须允许您看到此内容,并