0

我正在IMAPClient使用Python. 我可以下载电子邮件中的附件。我只对 Excel 文件感兴趣。

我有兴趣从电子邮件中提取收件人列表。知道怎么做Python吗?

这是可能有用的代码片段

for ind_mail in emails:
    msg_string = ind_mail['RFC822'].decode("utf-8")
    #print(msg_string.decode("utf-8"))
    email_msg = email.message_from_string(msg_string)

    for part in email_msg.walk():

        # Download only Excel File
        filetype = part.get_content_type()

        if(filetype == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'):
            #download
4

2 回答 2

0

您的问题的直接答案是获取相应标题的值,即:

to_rcpt = email_msg.get_all('to', [])
cc_rcpt = email_msg.get_all('cc', [])

,在第一个循环内。MIME 标准不强制标头的唯一性(尽管强烈建议这样做),因此 get_all; 如果不存在,您仍然会有一个连续循环的空列表。

但正如 Tripleee 正确指出的那样,mime 标题很容易被审查、欺骗或简单地删除。然而,这是服务器保存和返回的唯一信息,所有邮件客户端都用来呈现给我们:)

于 2015-10-13T08:25:39.723 回答
0

调用msg.get_all将返回一个列表,其中每个标题包含一个条目,因此如果您有多个标题,您将获得每个标题的列表

如果一个标头以逗号分隔的方式包含多封电子邮件,则您只会得到一个字符串,并且必须将其拆分。

拥有来自特定标头的所有电子邮件列表的最佳方法是使用getaddresseshttps://docs.python.org/3/library/email.utils.html#email.utils.getaddresses

from email.utils import getaddresses

to_rcpt = getaddresses(email_msg.get_all('to', []))

get_all 将返回一个包含所有“To:”标头的数组,getaddresses并将解析每个条目并返回每个标头上存在的尽可能多的电子邮件。例如:

message = """
To: "Bob" <email1@gmail.com>, "John" <email2@gmail.com>
To: email3@gmail.com, email4@gmail.com
"""

to_rcpt = getaddresses(email_msg.get_all('to', []))
=> [('Bob', 'email1@gmail.com'), ('John', 'email2@gmail.com'), ('', 'email3@gmail.com'), ('', 'email4@gmail.com')]
于 2021-09-21T15:09:55.257 回答