如何使用 Python 从电子邮件内容中获取附加的 eml 文件?

Rah*_*our 5 python imaplib python-3.x python-3.7

我正在使用 python 3.7 和电子邮件,imap 库读取电子邮件并提取电子邮件和附件的内容,所有附件(如 excel、csv、pdf)都作为附件下载,但是当我在电子邮件中收到任何 .eml 文件时,它显示错误,请找到以下代码以读取电子邮件内容和附件,如果收到 eml 文件作为附件,则会显示错误。它在写入 eml 文件时显示错误。在写入时 part.get_payload(decode=True) 在 eml 文件中变为空白。

filename = part.get_filename()
if filename is not None:
    dot_position = filename.find('.')
    file_prefix = filename[0:dot_position]
    file_suffix = filename[dot_position:len(filename)]
    # print(dot_position)
    # print(file_prefix)
    # print(file_suffix)
    now = datetime.datetime.now()
    timestamp = str(now.strftime("%Y%m%d%H%M%S%f"))
    newFileName = file_prefix + "_" + timestamp + file_suffix
    sv_path = os.path.join(svdir, newFileName)
    # allfiles = allfiles.append([{"oldfilename": filename, "newfilename": newFileName}])
    mydict = filename + '$$' + newFileName
    mydict1 = mydict1 + ',' + mydict
    print(mydict1)
    if not os.path.isfile(sv_path):
        print("oldpath:---->" + sv_path)
        # filename = os.rename(filename, filename + '_Rahul')
        # sv_path = os.path.join(svdir, filename)
        # print("Newpath:---->" + sv_path)
        fp = open(sv_path, 'wb')
        # print("Rahul")
        print(part.get_payload(decode=True))
        # try:
        # newFileByteArray = bytearray(fp)
        # if part.get_payload(decode=True) is not None:
        fp.write(part.get_payload(decode=True))
        # except (TypeError, IOError):
        #    pass
        fp.close()
Run Code Online (Sandbox Code Playgroud)

错误是

<class 'TypeError'> ReadEmailUsingIMAP.py 129
a bytes-like object is required, not 'NoneType'
Run Code Online (Sandbox Code Playgroud)

Eri*_*les 1

只是为了解释为什么会发生这种情况(它也让我震惊),引用 v.3.5 库文档。(v2 也这么说):

如果消息是多部分的并且解码标志为 True,则返回 None。

如果您的附件是 .EML,则它几乎总是由多部分组成,因此无。

如果您只期望 .EML 多部分附件(不确定是否有任何其他用例),Jin Thakur 的解决方法是合适的;它应该被接受为答案。