Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编码错误:通过AWS SES在MIME文件数据中_Python_Django_Mime_Amazon Ses - Fatal编程技术网

Python 编码错误:通过AWS SES在MIME文件数据中

Python 编码错误:通过AWS SES在MIME文件数据中,python,django,mime,amazon-ses,Python,Django,Mime,Amazon Ses,我试图通过aws SES从MIME检索附件数据,如文件格式和文件名。不幸的是,有时文件名编码会发生更改,例如文件名为“3_amrishmishra_入门级简历-02.pdf”,在MIME中显示为“=?UTF-8?Q?amrishmishra=5FEntry_级简历=E2=80=93_02=2Epdf?=”,有没有办法获得准确的文件名 if email_message.is_multipart(): message = '' if "apply" in receiver_email.split('

我试图通过aws SES从MIME检索附件数据,如文件格式和文件名。不幸的是,有时文件名编码会发生更改,例如文件名为“3_amrishmishra_入门级简历-02.pdf”,在MIME中显示为“=?UTF-8?Q?amrishmishra=5FEntry_级简历=E2=80=93_02=2Epdf?=”,有没有办法获得准确的文件名

if email_message.is_multipart():
message = ''
if "apply" in receiver_email.split('@')[0].split('_')[0] and isinstance(int(receiver_email.split('@')[0].split('_')[1]), int):
    for part in email_message.walk():
        content_type = str(part.get_content_type()).lower()
        content_dispo = str(part.get('Content-Disposition')).lower()
        print(content_type, content_dispo)

        if 'text/plain' in content_type and "attachment" not in content_dispo:
            message = part.get_payload()


        if content_type in ['application/pdf', 'text/plain', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'] and "attachment" in content_dispo:
            filename = part.get_filename()
            # open('/tmp/local' + filename, 'wb').write(part.get_payload(decode=True))
            # s3r.meta.client.upload_file('/tmp/local' + filename, bucket_to_upload, filename)

            data = {
                'base64_resume': part.get_payload(),
                'filename': filename,
            }
            data_list.append(data)
    try:
        api_data = {
            'email_data': email_data,
            'resumes_data': data_list
        }
        print(len(data_list))
        response = requests.post(url, data=json.dumps(api_data),
                                 headers={'content-type': 'application/json'})
        print(response.status_code, response.content)
    except Exception as e:
        print("error %s" % e)

此语法
“=?UTF-8?Q?..?=”
是一种语法。在MIME电子邮件中,当标题值包含非ASCII字符(中的血淋淋的详细信息)时,会使用它。您的附件文件名包含一个“en-dash”字符,这就是它以这种编码发送的原因

处理它的最佳方法取决于您使用的Python版本

Python 3

Python 3的更新包可以为您正确解码RFC 2047头:

#Python 3
从电子邮件导入消息\u从\u字节,策略
原始消息字节=b“>”
message=message\u from\u字节(原始\u message\u字节,policy=policy.default)
对于message.iter_attachments()中的附件:
#(EmailMessage.iter_附件在Python 3中是新的)
打印(附件。获取文件名())
#amrishmishra_入门级简历–02.pdf
您必须特别请求
策略。默认值
。如果不这样做,解析器将使用复制Python 2.7错误行为(包括不解码RFC 2047)的
compat32
策略。(另外,早期的Python 3版本仍然在新的电子邮件包中消除bug,因此请确保您使用的是Python 3.5或更高版本。)

Python 2

如果您使用的是Python2,最好的选项是升级到Python3.5或更高版本(如果可能的话)。Python2的电子邮件解析器有许多缺陷和限制,这些缺陷和限制通过Python3中的大规模重写得以修复。(重写增加了方便的新功能,如上图所示的
iter\u attachments()

如果无法切换到Python 3,则可以使用以下方法自行解码RFC 2047文件名:

但是,如果您试图用Python2.7解析现实世界中的电子邮件,请注意,这可能只是您将遇到的几个问题中的第一个


我维护的包包括一个
email.parser.BytesParser
,它试图解决Python2.7电子邮件解析中的几个(但不是全部)问题。出于您的目的,您可以借用该(内部)代码。(或者,由于您将问题标记为Django,您可能需要研究Anymail的规范化处理,其中包括Amazon SES支持。)

此语法
'=?UTF-8?Q?…='
是一种语法。在MIME电子邮件中,当标题值包含非ASCII字符(中的血淋淋的详细信息)时,会使用它。您的附件文件名包含一个“en-dash”字符,这就是它以这种编码发送的原因

处理它的最佳方法取决于您使用的Python版本

Python 3

Python 3的更新包可以为您正确解码RFC 2047头:

#Python 3
从电子邮件导入消息\u从\u字节,策略
原始消息字节=b“>”
message=message\u from\u字节(原始\u message\u字节,policy=policy.default)
对于message.iter_attachments()中的附件:
#(EmailMessage.iter_附件在Python 3中是新的)
打印(附件。获取文件名())
#amrishmishra_入门级简历–02.pdf
您必须特别请求
策略。默认值
。如果不这样做,解析器将使用复制Python 2.7错误行为(包括不解码RFC 2047)的
compat32
策略。(另外,早期的Python 3版本仍然在新的电子邮件包中消除bug,因此请确保您使用的是Python 3.5或更高版本。)

Python 2

如果您使用的是Python2,最好的选项是升级到Python3.5或更高版本(如果可能的话)。Python2的电子邮件解析器有许多缺陷和限制,这些缺陷和限制通过Python3中的大规模重写得以修复。(重写增加了方便的新功能,如上图所示的
iter\u attachments()

如果无法切换到Python 3,则可以使用以下方法自行解码RFC 2047文件名:

但是,如果您试图用Python2.7解析现实世界中的电子邮件,请注意,这可能只是您将遇到的几个问题中的第一个


我维护的包包括一个
email.parser.BytesParser
,它试图解决Python2.7电子邮件解析中的几个(但不是全部)问题。出于您的目的,您可以借用该(内部)代码。(或者,由于您将问题标记为Django,您可能需要研究Anymail的规范化处理,其中包括Amazon SES支持。)

您的代码在哪里?@dirkgroten updated:)什么是
电子邮件?我是说什么课?如何从SES获取它?我已经设置了直接保存电子邮件MIME文件的规则,以保存到S3 bucket。我正在使用Lambdac读取MIME文件。您可以编辑您的问题,并描述如何打开文件并将其处理为
email\u message
(以及
email\u message
是什么类别?您的代码在哪里?@dirkgroten updated:)什么是电子邮件?我是说什么课?你是如何从SES获取的?我已经设置了直接保存电子邮件MIME文件的规则,以保存,从他们的S3 bucket中我正在使用lambdac读取MIME文件。你可以编辑你的问题,并描述你如何打开文件并将其处理成
电子邮件消息
(什么是
email\u message
?很抱歉延迟了回复。非常感谢。我使用的是python 2.7。这有助于@AmrishMishra。我更新了我的答案,以便更好地涵盖python 3和python 2.7的选项。我很高兴。(去年为Anymail花了很多时间调试这些内容;很高兴这些信息可以帮助其他人。)很抱歉延迟了回复。非常感谢。我使用的是python 2.7。这有助于@AmrishMishra。我更新了我的答案,以便更好地涵盖python 3和python 2.7的选项。我很高兴。(去年为Anymail花了很多时间调试这些东西;很高兴
# Python 2 (also works in Python 3, but you shouldn't need it there)
from email.header import decode_header

filename = '=?UTF-8?Q?amrishmishra=5FEntry_Level_Resume_=E2=80=93_02=2Epdf?='
decode_header(filename)
# [('amrishmishra_Entry Level Resume \xe2\x80\x93 02.pdf', 'utf-8')]

(decoded_string, charset) = decode_header(filename)[0]
decoded_string.decode(charset)
# u'amrishmishra_Entry Level Resume – 02.pdf'