使用Python读取存储在文本文件中的MIME消息

0 投票
1 回答
6566 浏览
提问于 2025-04-17 02:26

我有一个存储在 'text/plain' 文件中的 MIME 消息,内容大概是这样的:

http://pastebin.com/sPWWC9LL

这个 MIME 消息应该是一个多部分的消息。

我该如何在 Python 中解析它呢?我试过使用 email.message_from_string(),但是它仍然是以 'text/plain' 的格式编码的,所以我无法使用 email 库来解析它。

我的代码看起来是这样的:

f = open(settings.MEDIA_ROOT + '/raw.txt', 'r')
msg = email.message_from_string(f.read())
i = 1

for part in msg.walk():
    if part.get_content_maintype() == 'multipart':
        continue

    ext = mimetypes.guess_extension(part.get_content_type())
    filename = 'part-%03d%s' % (i, ext)

    fp = open(settings.MEDIA_ROOT + '/' + filename, 'wb')
    fp.write(part.get_payload(decode=True))
    fp.close()
    i += 1

如果有人能帮我,我将非常感激!

1 个回答

5

你应该能够解析这个消息,并用代码逐步处理各个部分,具体可以参考这个回答。不过,首先你需要在消息的开头添加

Content-type: multipart/alternative;  
    boundary="cbsms-main-boundary"

或者保留完整的原始消息。


我相信你的代码是可以工作的。在把上面那两行添加到MIME_Message_in_text_file.txt后,我运行了

test.py:

import os
import sys
import mimetypes
import email

msg = email.message_from_file(open(sys.argv[1]))

for i,part in enumerate(msg.walk(),1):
    if part.get_content_maintype() == 'multipart':
        continue
    ext = mimetypes.guess_extension(part.get_content_type())
    filename='part-%03d%s'%(i, ext)
    # filename=os.path.join('settings.MEDIA_ROOT', filename)
    print(filename)
    with open(filename, 'wb') as fp:
        fp.write(part.get_payload(decode=True))

这样:

% test.py MIME_Message_in_text_file.txt

然后得到了:

part-002.xml
part-004.jpe
part-005.ksh

撰写回答