【问题标题】:How to save an e-mail message to a file without loading into memory?如何将电子邮件消息保存到文件而不加载到内存中?
【发布时间】:2013-05-06 01:59:55
【问题描述】:

如何在不加载到内存的情况下将电子邮件信息保存到文件中? 我用

import poplib
pop_conn = poplib.POP3(servername)
pop_conn.user(username)
pop_conn.pass_(passwd)
msg = pop_conn.retr(msg_number)[1]
msg_text = '\n'.join(msg)
msg_file = open(msg_file_name, ,"wb")
msg_file.write(msg_text)
msg_file.close()

但消息已加载到内存中。

【问题讨论】:

  • 你不能? Python中的所有操作基本上都是X->Memory buffer->Disk..
  • 我认为需要看socket编程的方向。但我不知道具体该怎么做。
  • 再次,socket -> memory buffer -> disk.. 那里也是一样的。从汇编的角度来看,一切都是 CPU 和内存计算,然后才是其他任何事情。它基本上归结为一点一点地转移内存分配,并告诉 CPU 从内存中获取内容到主板的其他部分(例如磁盘)。你不能绕回记忆..对不起..
  • @Tor,你看过流媒体视频吗?你认为它是如何工作的?
  • @alexis 它从套接字加载到内存中。不同之处在于它由 NIC 上的板载 CPU 接收,发送到 CPU 进行处理,重定向(如果暂时没有存储在 RAM 中)到图形内存缓冲区,然后为了您的方便进行渲染.. 仍然存储在内存中。

标签: python email python-2.7 poplib


【解决方案1】:

python 文档caution 反对使用 POP3 协议。您的邮件服务器可能理解 IMAP,因此您可以使用IMAP4.partial() 分批获取邮件,并将每个部分立即写入磁盘。

但如果您使用 POP3,那么您很幸运:POP3 协议是面向行的。 Python 的poplib 库是纯python,通过查看the source 添加迭代器是一件小事。我没有费心从 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()

【讨论】:

  • 感谢您的提示,但我需要它才能使用 pop3 协议
  • @agry,查看修改后的答案。
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2018-03-24
  • 1970-01-01
  • 2020-02-13
  • 2011-12-18
相关资源
最近更新 更多