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

Posted

技术标签:

【中文标题】如何使用 Python 从电子邮件内容中获取附加的 eml 文件?【英文标题】:How can I get an attached eml file from email message content using Python? 【发布时间】:2020-03-18 08:40:03 【问题描述】:

我正在使用 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()

错误是

<class 'TypeError'> ReadEmailUsingIMAP.py 129
a bytes-like object is required, not 'NoneType'

【问题讨论】:

代码中的哪一行生成了该错误消息? fp.write(part.get_payload(decode=True)) ,在写入.eml文件时显示错误 get_payload iscoming None.. 您能否提供所有必要的代码和数据,以便我们运行您的程序?请参阅:minimal reproducible example. @RahulGour 至少,partsvdirmydict1 是什么? 您能否也发布完整的输出(包括打印语句的输出和完整的堆栈跟踪?) 【参考方案1】:

使用 eml_parser https://pypi.org/project/eml-parser/ 导入日期时间 导入json 导入 eml_parser

def json_serial(obj):
    if isinstance(obj, datetime.datetime):
        serial = obj.isoformat()
        return serial


with open('sample.eml', 'rb') as fhdl:
    raw_email = fhdl.read()

parsed_eml = eml_parser.eml_parser.decode_email_b(raw_email)

print(json.dumps(parsed_eml, default=json_serial))

【讨论】:

以上是关于如何使用 Python 从电子邮件内容中获取附加的 eml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 App 中将 ImageView 中的图像附加到电子邮件

使用GAE python接收邮件,但是邮件正文中包含意外信息

如何使用python将文件附加到电子邮件中?

如何在 PHP 中将特定 PDF 附加到电子邮件中?

从NSString中删除一些特殊字符,以获取附加到电子邮件的文件名PDF

在没有 CSV 的情况下将 CSV 附加到 Python 中的电子邮件