Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 如何将电子邮件保存到文件而不加载到内存中?_Python_Email_Python 2.7_Poplib - Fatal编程技术网

Python 如何将电子邮件保存到文件而不加载到内存中?

Python 如何将电子邮件保存到文件而不加载到内存中?,python,email,python-2.7,poplib,Python,Email,Python 2.7,Poplib,如何将电子邮件保存到文件而不加载到内存中? 我用 但是消息被加载到内存中。python反对使用POP3协议。您的邮件服务器可能理解IMAP,因此您可以使用它来获取部分邮件,并立即将每个部分写入磁盘 但是如果您有使用POP3,那么您就很幸运了:POP3协议是面向行的。Python的poplib库是纯Python的,通过查看添加迭代器是一件小事。我没有费心从POP3类派生,所以这里介绍了如何通过猴子补丁实现这一点: from poplib import POP3 def iretr(self, w

如何将电子邮件保存到文件而不加载到内存中? 我用

但是消息被加载到内存中。

python反对使用POP3协议。您的邮件服务器可能理解IMAP,因此您可以使用它来获取部分邮件,并立即将每个部分写入磁盘

但是如果您使用POP3,那么您就很幸运了:POP3协议是面向行的。Python的poplib库是纯Python的,通过查看添加迭代器是一件小事。我没有费心从
POP3
类派生,所以这里介绍了如何通过猴子补丁实现这一点:

from poplib import POP3

def iretr(self, which):
    """
    Retrieve whole message number 'which', in iterator form.
    Return content in the form (line, octets)
    """    
    self._putcmd('RETR %s' % which)
    resp = self._getresp()  # Will raise exception on error

    # Simplified from _getlongresp()
    line, o = self._getline()
    while line != '.':
        if line[:2] == '..':
            o = o-1
            line = line[1:]
        yield line, o
        line, o = self._getline()

POP3.iretr = iretr
然后,您可以获取消息并一次一行写入磁盘,如下所示:

pop_conn = POP3(servername)
...
msg_file = open(msg_file_name, "wb")
for line, octets in pop_conn.iretr(msg_number):
    msg_file.write(line+"\n")
msg_file.close()

你不能?Python中的所有操作基本上都是X->Memory buffer->Disk..我认为这需要考虑套接字编程的方向。但是我不知道怎么做。再说一遍,
socket
->
内存缓冲区
->
磁盘
。。同样的事情。从组装的角度来看,一切都是CPU和内存计算,而不是其他。它基本上是一点一点地改变内存分配,并告诉CPU从内存中取出东西到主板的其他部分(例如,磁盘)。你不能改变记忆。。对不起..@Tor,你看过流媒体视频吗?你认为它是如何工作的?@alexis它从插座加载到内存中。。不同之处在于,它由NIC上的板载CPU接收,发送到CPU进行处理,重定向(如果在RAM中没有存储一段时间)到图形内存缓冲区,然后为方便起见进行渲染。。仍然存储在内存中。谢谢你的提示,但我需要它来使用pop3protocol@agry,见修订后的答案。
pop_conn = POP3(servername)
...
msg_file = open(msg_file_name, "wb")
for line, octets in pop_conn.iretr(msg_number):
    msg_file.write(line+"\n")
msg_file.close()