重複の可能性:
python の imaplib で括弧付きリストを解析中
Python の電子メール パッケージを使用すると、電子メール メッセージの全文を取得して部分に解析し、さまざまな部分を見ていくことができます。BODYSTRUCTURE
しかし、 IMAP プロトコルによって返された応答を部分的に解析するライブラリはありemail.message.Message
ますか?
編集:
PHP の同等のメソッドはimap_fetchbody()
、構造の解析を自動的に処理する です。
EDIT2:
この質問は重複として誤ってクローズされました。ネストされた式を便利な形式 (辞書など) に解析BODYSTRUCTURE
することであり、生の文字列を解析して Python 型にすることではありません。いずれにせよ、私は独自のソリューションを展開することになりました。これは、将来同様の問題に遭遇した人のためのコードです。imapclient
ライブラリと一緒に使用することを目的としています
# ----- Parsing BODYSTRUCTURE into parts dictionaries ----- #
def tuple2dict(pairs):
"""get dict from (key, value, key, value, ...) tuple"""
if not pairs:
return None
return dict([(k, tuple2dict(v) if isinstance(v, tuple) else v)
for k, v in zip(pairs[::2], pairs[1::2])])
def parse_singlepart(var, part_no):
"""convert non-multipart into dic"""
# Basic fields for non-multipart (Required)
part = dict(zip(['maintype', 'subtype', 'params', 'id', 'description', 'encoding', 'size'], var[:7]), part_no=part_no)
part['params'] = tuple2dict(part['params'])
# Type specific fields (Required for 'message' or 'text' type)
index = 7
if part['maintype'].lower() == 'message' and part['subtype'].lower() == 'rfc822':
part.update(zip(['envelope', 'bodystructure', 'lines'], var[7:10]))
index = 10
elif part['maintype'].lower() == 'text':
part['lines'] = var[7]
index = 8
# Extension fields for non-multipart (Optional)
part.update(zip(['md5', 'disposition', 'language', 'location'], var[index:]))
part['disposition'] = tuple2dict(part['disposition'])
return part
def parse_multipart(var, part_no):
"""convert the multipart into dict"""
part = { 'child_parts': [], 'part_no': part_no }
# First parse the child parts
index = 0
if isinstance(var[0], list):
part['child_parts'] = [parse_part(v, ('%s.%d' % (part_no, i+1)).replace('TEXT.', '')) for i, v in enumerate(var[0])]
index = 1
elif isinstance(var[0], tuple):
while isinstance(var[index], tuple):
part['child_parts'].append(parse_part(var[index], ('%s.%d' % (part_no, index+1)).replace('TEXT.', '')))
index += 1
# Then parse the required field subtype and optional extension fields
part.update(zip(['subtype', 'params', 'disposition', 'language', 'location'], var[index:]))
part['params'] = tuple2dict(part['params'])
part['disposition'] = tuple2dict(part['disposition'])
return part
def parse_part(var, part_no=None):
"""Parse IMAP email BODYSTRUCTURE into nested dictionary
See http://tools.ietf.org/html/rfc3501#section-6.4.5 for structure of email messages
See http://tools.ietf.org/html/rfc3501#section-7.4.2 for specification of BODYSTRUCTURE
"""
if isinstance(var[0], (tuple, list)):
return parse_multipart(var, part_no or 'TEXT')
else:
return parse_singlepart(var, part_no or '1')