Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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 IMAPClient库和电子邮件包之间的交互_Python_Email_Imap_Imapclient - Fatal编程技术网

Python IMAPClient库和电子邮件包之间的交互

Python IMAPClient库和电子邮件包之间的交互,python,email,imap,imapclient,Python,Email,Imap,Imapclient,我有一个Django项目,我正在处理一个电子邮件客户端。我决定使用python而不是标准库的imaplib来访问消息。目前,我没有使用来编码/解码从中收到的响应,我有一种感觉,我手动实现了应该由我来处理的事情 下载附件的示例代码: def download_attachment(server, msgid, index, encoding): # index and encoding is known from previous analysis of bodystructure

我有一个Django项目,我正在处理一个电子邮件客户端。我决定使用python而不是标准库的
imaplib
来访问消息。目前,我没有使用来编码/解码从中收到的响应,我有一种感觉,我手动实现了应该由我来处理的事情

下载附件的示例代码:

def download_attachment(server, msgid, index, encoding):
    # index and encoding is known from previous analysis of bodystructure
    file_content = f_fetch(server, msgid, index)
    # the below code should be handled by email's message_from_bytes 
    # and subsequent get_payload(decode = True) function
    if encoding == 'base64':
        file_content = base64.b64decode(file_content)
    elif ...
    ...
    endif
    #writing file_content to a folder
    return

def f_fetch(server, msgid, index):
    if not index:
        index = '1'
    response = server.fetch(msgid, 'BODY[' + index + ']')
    key = ('BODY[' + index + ']').encode('utf-8')
    if type(msgid) is str:
        msgid = int(msgid)
    return response[msgid][key]
所以问题是,我应该如何重写这段代码来利用。
具体来说,我应该如何处理来自IMAPClient的响应以将其传递到电子邮件的message\u from\u bytes()函数?

如果您希望使用电子邮件包的message\u from\u bytes()函数解析电子邮件,则需要为其提供完整的原始电子邮件正文。要获取此信息,请使用如下所示的
RFC822
选择器获取:

fetch_data = server.fetch(msgid, ['RFC822'])
parsed = email.message_from_bytes(fetch_data[msgid][b'RFC822'])

如果您正在从IMAP服务器提取单个邮件部分/附件,那么服务器将有效地为您执行解析工作,您不需要使用电子邮件包的解析器。

如果您想使用电子邮件包,您可能应该直接使用imaplib,因为IMAPClient已经解析了邮件。@Serge,那么,这是否意味着只要我使用IMAPClient,我就应该忘记
电子邮件
软件包?不确定(为什么它是评论而不是答案…)。我不使用IMAPClient,但我认为它的主要兴趣之一是解析消息。如果您不需要,我只是不确定您如何使用IMAPClient,以及为什么它比imaplib更好。很抱歉,无法帮助您更多…好的。谢谢)我是否正确理解,如果我的邮件包含一些重附件,例如视频文件,那么
RFC822
将下载所有内容。因此,如果用户只想看到消息的
纯文本/HTML
和附件的名称,那么下载
RFC822
就不是最佳选择。