跳转到主要内容

将EmailMessage对象转换为dict

项目描述

Project Status: Active — The project has reached a stable, usable state and is being actively developed. CI Status https://codecov.io/gh/jwodder/email2dict/branch/master/graph/badge.svg https://img.shields.io/pypi/pyversions/email2dict.svg MIT License

GitHub | PyPI | 问题

注意: 此项目已更名为mailbits。请参阅那里以获取所有未来的更新和新功能。

email2dict 将Python MessageEmailMessage 实例转换为结构化的 dict。需要检查一个 Message 但发现内置的Python API过于繁琐?需要检查 Message 是否具有您期望的内容和结构?需要比较两个 Message 实例以检查相等性?需要格式化打印 Message 的结构?那么 email2dict 就是您的得力助手。

安装

email2dict 需要 Python 3.6 或更高版本。只需使用 Python 3 的 pip 安装即可(您有 pip 吗?)

python3 -m pip install email2dict

示例

Python文档中的电子邮件示例页面(https://docs.pythonlang.cn/3/library/email.examples.html)包含了一个使用替代纯文本版本构建HTML电子邮件的示例(标题为“午餐时我们吃芦笋”的那个示例)。将生成的EmailMessage对象传递给email2dict()函数会产生以下输出结构

{
    "unixfrom": None,
    "headers": {
        "subject": "Ayons asperges pour le déjeuner",
        "from": [
            {
                "display_name": "Pepé Le Pew",
                "address": "pepe@example.com",
            },
        ],
        "to": [
            {
                "display_name": "Penelope Pussycat",
                "address": "penelope@example.com",
            },
            {
                "display_name": "Fabrette Pussycat",
                "address": "fabrette@example.com",
            },
        ],
        "content-type": {
            "content_type": "multipart/alternative",
            "params": {},
        },
    },
    "preamble": None,
    "content": [
        {
            "unixfrom": None,
            "headers": {
                "content-type": {
                    "content_type": "text/plain",
                    "params": {},
                },
            },
            "preamble": None,
            "content": (
                "Salut!\n"
                "\n"
                "Cela ressemble à un excellent recipie[1] déjeuner.\n"
                "\n"
                "[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718\n"
                "\n"
                "--Pepé\n"
            ),
            "epilogue": None,
        },
        {
            "unixfrom": None,
            "headers": {
                "content-type": {
                    "content_type": "multipart/related",
                    "params": {},
                },
            },
            "preamble": None,
            "content": [
                {
                    "unixfrom": None,
                    "headers": {
                        "content-type": {
                            "content_type": "text/html",
                            "params": {},
                        },
                    },
                    "preamble": None,
                    "content": (
                        "<html>\n"
                        "  <head></head>\n"
                        "  <body>\n"
                        "    <p>Salut!</p>\n"
                        "    <p>Cela ressemble à un excellent\n"
                        "        <a href=\"http://www.yummly.com/recipe/Roasted-Asparagus-"
                        "Epicurious-203718\">\n"
                        "            recipie\n"
                        "        </a> déjeuner.\n"
                        "    </p>\n"
                        "    <img src=\"cid:RANDOM_MESSAGE_ID\" />\n"
                        "  </body>\n"
                        "</html>\n"
                    ),
                    "epilogue": None,
                },
                {
                    "unixfrom": None,
                    "headers": {
                        "content-type": {
                            "content_type": "image/png",
                            "params": {},
                        },
                        "content-disposition": {
                            "disposition": "inline",
                            "params": {},
                        },
                        "content-id": ["<RANDOM_MESSAGE_ID>"],
                    },
                    "preamble": None,
                    "content": b'IMAGE BLOB',
                    "epilogue": None,
                },
            ],
            "epilogue": None,
        },
    ],
    "epilogue": None,
}

API

email2dict模块提供了一个名为email2dict的单个函数

email2dict(msg: email.message.Message, include_all: bool = False) -> Dict[str, Any]

将一个Message对象转换为一个dict。所有编码的文本和字节都将解码成它们的自然值。

默认情况下,任何特定于消息编码方式的信息(如内容类型参数、内容传输编码等)都不会被报告,因为重点是实际内容,而不是表示它的选择。如果仍然想包含这些信息,请将include_all设置为True

输出结构包含以下字段

unixfrom

如果有的话,表示mbox中消息开始的“From “行

headers

一个将小写标题字段名映射到值的dict。以下标题有特殊表示

subject

一个单独的字符串

fromtoccbccresent-fromresent-toresent-ccresent-bccreply-to

一个包含组/地址的列表。地址表示为具有两个字符串字段的dictdisplay_name(如果没有给出则为空字符串)和address。组表示为具有group字段(给出组的名称)和addresses字段(给出组中地址的列表)的dict

message-id

一个单独的字符串

content-type

包含一个content_type字段(形式为maintype/subtype的字符串,例如,“text/plain”)和一个params字段(具有字符串键和值的dict)。除非include_allTrue,否则将丢弃charsetboundary参数。

date

一个datetime.datetime实例

orig-date

一个datetime.datetime实例

resent-date

一个datetime.datetime实例的列表

sender

一个单独的地址dict

resent-sender

地址dict的列表

content-disposition

包含一个disposition字段(值为“inline”或“attachment”)和一个params字段(具有字符串键和值的dict)的dict

content-transfer-encoding

一个单独的字符串。除非include_allTrue,否则将丢弃此标题。

mime-version

一个单独的字符串。除非include_allTrue,否则将丢弃此标题。

所有其他标题都表示为字符串的列表。

preamble

消息的前言

content

如果消息是多部分的,这是一个与顶级 dict 结构相同格式的消息 dict 列表。如果消息的 Content-Type 是 message/rfc822message/external-body,这是一个单独的消息 dict。如果消息的 Content-Type 是 text/*,这是一个表示消息内容的 str。否则,这是一个表示消息内容的 bytes

结尾

消息的 结尾

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

email2dict-0.1.0.post1.tar.gz (28.4 kB 查看哈希)

上传时间

构建分布

email2dict-0.1.0.post1-py3-none-any.whl (7.7 kB 查看哈希)

上传时间 Python 3

由以下支持