mailcap — Mailcap 文件处理

源代码: Lib/mailcap.py

自版本 3.11 起已弃用,将在版本 3.13 中移除:mailcap 模块已弃用(有关详细信息,请参见 PEP 594)。mimetypes 模块提供了一种替代方案。


Mailcap 文件用于配置 MIME 感知应用程序(例如邮件阅读器和网络浏览器)如何对具有不同 MIME 类型的文件做出反应。(名称“mailcap”源自短语“mail capability”。)例如,mailcap 文件可能包含类似 video/mpeg; xmpeg %s 的行。然后,如果用户遇到 MIME 类型为 video/mpeg 的电子邮件或网络文档,%s 将被替换为文件名(通常属于临时文件),并且可以自动启动 xmpeg 程序来查看文件。

Mailcap 格式在 RFC 1524 中进行了记录,“多媒体邮件格式信息的使用者配置机制”,但不是互联网标准。但是,大多数 Unix 系统都支持 mailcap 文件。

mailcap.findmatch(caps, MIMEtype, key='view', filename='/dev/null', plist=[])

返回一个 2 元组;第一个元素是一个包含要执行的命令行的字符串(可以传递给 os.system()),第二个元素是给定 MIME 类型的 mailcap 条目。如果找不到匹配的 MIME 类型,则返回 (None, None)

key 是所需字段的名称,它表示要执行的活动类型;默认值为“view”,因为在最常见的情况下,您只需查看 MIME 类型数据的正文。如果您想创建给定 MIME 类型的正文或更改现有正文数据,其他可能的值可能是“compose”和“edit”。有关这些字段的完整列表,请参见 RFC 1524

filename 是要替换命令行中 %s 的文件名;默认值为 '/dev/null',这几乎肯定不是您想要的,因此通常您会通过指定文件名来覆盖它。

plist 可以是包含命名参数的列表;默认值只是一个空列表。列表中的每个条目都必须是一个字符串,其中包含参数名称、等号 ('=') 和参数的值。Mailcap 条目可以包含命名参数,例如 %{foo},它将被替换为名为“foo”的参数的值。例如,如果命令行 showpartial %{id} %{number} %{total} 在 mailcap 文件中,并且 plist 设置为 ['id=1', 'number=2', 'total=3'],则生成的命令行将为 'showpartial 1 2 3'

在 mailcap 文件中,可以指定“test”字段来测试一些外部条件(例如机器架构或正在使用的窗口系统),以确定 mailcap 行是否适用。 findmatch() 将自动检查此类条件,并在检查失败时跳过该条目。

在 3.11 版中更改:为了防止 shell 元字符(在 shell 命令行中具有特殊效果的符号)出现安全问题,findmatch 将拒绝将字母数字字符以外的 ASCII 字符和 @+=:,./-_ 注入到返回的命令行中。

如果在 filename 中出现不允许的字符,findmatch 将始终返回 (None, None),就像没有找到条目一样。如果此类字符出现在其他位置(plist 中的值或 MIMEtype 中),findmatch 将忽略使用该值的所有 mailcap 条目。在这两种情况下都会引发 warning

mailcap.getcaps()

返回一个将 MIME 类型映射到邮件功能文件条目列表的字典。此字典必须传递给 findmatch() 函数。一个条目存储为字典列表,但不需要了解此表示的详细信息。

信息来自系统上找到的所有邮件功能文件。用户邮件功能文件 $HOME/.mailcap 中的设置将覆盖系统邮件功能文件 /etc/mailcap/usr/etc/mailcap/usr/local/etc/mailcap 中的设置。

一个示例用法

>>> import mailcap
>>> d = mailcap.getcaps()
>>> mailcap.findmatch(d, 'video/mpeg', filename='tmp1223')
('xmpeg tmp1223', {'view': 'xmpeg %s'})