如何使用 Python 高效解析电子邮件而不触及附件

2023-11-26

我正在使用 Python imaplib (Python 2.6) 从 GMail 获取电子邮件。我用方法获取电子邮件的所有内容http://docs.python.org/library/imaplib.html#imaplib.IMAP4.fetch我收到整封电子邮件。我只需要文本部分,还可以解析附件的名称,而无需下载它们。如何做到这一点?我发现 GMail 返回的电子邮件遵循浏览器发送到 HTTP 服务器的相同格式。


看看这个食谱:http://code.activestate.com/recipes/498189/

我对其进行了稍微修改,以打印发件人、主题、日期、附件名称和消息正文(现在只是纯文本 - 添加 html 消息很简单)。

在本例中我使用了 Gmail pop3 服务器,但它也应该适用于 IMAP。

import poplib, email, string

mailserver = poplib.POP3_SSL('pop.gmail.com')
mailserver.user('recent:YOURUSERNAME') #use 'recent mode'
mailserver.pass_('YOURPASSWORD') #consider not storing in plaintext!

numMessages = len(mailserver.list()[1])
for i in reversed(range(numMessages)):
    message = ""
    msg = mailserver.retr(i+1)
    str = string.join(msg[1], "\n")
    mail = email.message_from_string(str)

    message += "From: " + mail["From"] + "\n"
    message += "Subject: " + mail["Subject"] + "\n"
    message += "Date: " + mail["Date"] + "\n"

    for part in mail.walk():
        if part.is_multipart():
            continue
        if part.get_content_type() == 'text/plain':
            body = "\n" + part.get_payload() + "\n"
        dtypes = part.get_params(None, 'Content-Disposition')
        if not dtypes:
            if part.get_content_type() == 'text/plain':
                continue
            ctypes = part.get_params()
            if not ctypes:
                continue
            for key,val in ctypes:
                if key.lower() == 'name':
                    message += "Attachment:" + val + "\n"
                    break
            else:
                continue
        else:
            attachment,filename = None,None
            for key,val in dtypes:
                key = key.lower()
                if key == 'filename':
                    filename = val
                if key == 'attachment':
                    attachment = 1
            if not attachment:
                continue
            message += "Attachment:" + filename + "\n"
        if body:
            message += body + "\n"
    print message
    print

这应该足以让您朝着正确的方向前进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python 高效解析电子邮件而不触及附件 的相关文章

随机推荐

  • 如何升级到 C++17?

    我使用 Atom 作为我的 IDE 我当前的 cplusplus 201402这是 C 14 我的编译器是g 海湾合作委员会 9 2 0 如何升级到 C 17 或 C 20 我搜索到的所有内容都涉及使用另一个 IDE Microsoft V
  • 检测基于纬度/经度的多边形中的点

    我想在服务器端仅使用 C 检测基于纬度 经度的坐标是否位于由基于纬度 经度的点组成的区域 多边形 内 我相信正确的方法是光线投射 但也许已经有一个 C 实现了 因为它并不简单 另外 我知道 SQL Server 有一些几何函数 例如STIn
  • 解析 Joda 时间部分

    我想从字符串生成部分 但在 API 中找不到任何支持该功能的内容 显然 我可以在 Joda Time 框架之外编写自己的解析器并创建 Partials 但我无法想象 API 尚不具备执行此操作的能力 使用 Threeten JSR 310
  • java.sql.SQLException:此驱动程序不支持 SQL Server 版本 8。 SQL 状态 = 08S01,错误代码 = 0

    我已将我的应用程序升级到Websphere 7 0from Websphere 6 1 我在用Microsoft SQL server jdbc driver 4 0对于这个应用程序 当我使用sqljdbc4 jar连接到数据库进行身份验证
  • 如何使用 pandas 从 Word 文档 (.docx) 文件中的表创建数据框

    我有一个带有数据表的word文件 docx 我正在尝试使用该表创建一个pandas数据框 我使用了docx和pandas模块 但我无法创建数据框 from docx import Document document Document req
  • 使用 char(36) 类型对第一列进行编码

    所以我有一个 UserProfile 模型类作为 SimpleMembership 的一部分 在其中 我需要存储存在于另一个类型的数据库中的遗留标识符char 36 我很想将其更改为更明智的内容 例如 uniqueIdentifier 但这
  • Spring Security:如何以编程方式清除“记住我”cookie?

    我在网络应用程序中使用注销方法 如下所示 但如果我检查remember me注销不起作用 因为 cookie 未清除 如何在我的方法中以编程方式清除此 cookie 或如何制定更好的注销方法 public void logout Anony
  • 使用 setAs() 在 R 中指定 colClasses 时收到警告 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我尝试使用这里提供的答案 Greg Snowquest
  • 为什么 urllib.urlopen.read() 与源代码不对应?

    我正在尝试获取以下网页 import urllib urllib urlopen http www gallimard jeunesse fr searchjeunesse advanced order author catalog 0 1
  • C++ 模板模板参数的语法

    我很难理解 C 模板模板参数的语法 根据精彩的描述 我明白它们为什么有用here 我只是发现他们的语法很难理解 两个例子取自上述网站 还有其他 template
  • 简单注入器,无法覆盖现有注册

    我目前是第一次使用简单注射器 在我的 NET 项目中 我正在运行测试和模拟从 Web 服务返回的数据 并将对象注册到容器 如下所示 container Register
  • 如何在 virtualenv 中添加 PYTHONPATH 路径

    我正在尝试添加 PYTHONPATH 环境变量的路径 该路径仅在特定的 virtualenv 环境中可见 I tried SET PYTHONPATH 在 virtualenv 命令提示符下 但这会为整个环境设置变量 我该如何实现这一目标
  • 空 div 与具有 inline-block 属性的文本的 div

    想知道这种行为的原因 CSS div display inline block margin right 2px width 20px background color red 空div div style height 20px div
  • 远程事后核心转储分析,无需共享系统库的精确调试符号

    您通常如何解决这个问题 想象一下 一个线程在 Computer1 上的 libc 代码 系统共享库 内部崩溃 然后生成核心转储 但要分析此 coredump 的 Computer2 可能具有不同版本的 libc So 在远程计算机上拥有相同
  • Material Design:如何断开浮动标签以供选择?

    我需要创建没有浮动标签的选择字段 但我想要有占位符和默认值 我阅读文档https material angular io components form field overview floating label并尝试自己做
  • 如何将数据库上传到 Heroku

    我有一个共享的heroku应用程序 现在我不想使用相同的代码在heroku中创建一个测试应用程序 所以我创建了一个新的应用程序 好的 问题是要使该应用程序正常工作 它需要一个数据库 所以我正在尝试上传本地数据库 但不知道如何上传 谁能告诉我
  • 如何在 条目中获取红色星号

    如何在条目中添加红色星号 以便可以将其显示在文本末尾以指示其为必填字段 例如 输入您的姓名 星号将为红色 或者 就此而言 文本中的任何位置 您无法通过 xml 字符串资源来做到这一点 这只能通过代码来完成 为此 您需要使用Spannable
  • 将 mysql 跳过网络设置为关闭

    我正在尝试设置我的 Ubuntu 12 10 服务器以接受远程 mysql 连接 但是我在将跳过网络设置为关闭时遇到困难 注意我已经将绑定地址设置为面向互联网的 IP 而不是 127 0 0 1 当我查看 etc mysql my conf
  • jQuery.parseJSON 与 JSON.parse

    jQuery parseJSON and JSON parse是执行相同任务的两个函数 如果 jQuery 库已经加载 将使用jQuery parseJSON比使用更好JSON parse 在性能方面 如果是 为什么 如果不是 为什么不呢
  • 如何使用 Python 高效解析电子邮件而不触及附件

    我正在使用 Python imaplib Python 2 6 从 GMail 获取电子邮件 我用方法获取电子邮件的所有内容http docs python org library imaplib html imaplib IMAP4 fe