2013-05-11 3 views
2

전자 메일 메시지를 메모리에로드하지 않고 파일에 저장하는 방법은 무엇입니까? 나는 사용한다전자 메일 메시지를 메모리에로드하지 않고 파일에 저장하는 방법?

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() 

그러나 메시지는 메모리에로드된다.

+2

할 수 없습니까? 파이썬의 모든 작업은 기본적으로 X-> 메모리 버퍼 -> 디스크입니다. – Torxed

+0

소켓 프로그래밍의 방향을 살펴볼 필요가 있다고 생각합니다. 하지만 정확히 어떻게하는지 모르겠습니다. – agrynchuk

+0

다시'socket' ->'memory buffer' ->'disk' .. 같은 것을 거기에. 어셈블리 관점에서 보면, 모든 것은 CPU와 메모리 계산입니다. 기본적으로 메모리 할당을 비트 단위로 이동하고 메모리에있는 물건을 마더 보드의 다른 부분 (예 : 디스크)으로 가져 오도록 CPU에 지시합니다. 기억을 돌아 다닐 수는 없어 .. 미안 .. – Torxed

답변

0

python docs caution은 POP3 프로토콜을 사용하지 않습니다. 메일 서버는 아마도 IMAP을 이해하므로 IMAP4.partial()을 사용하여 메시지를 부분적으로 가져와 각 부분을 즉시 디스크에 기록 할 수 있습니다.

그러나 이 있으면 POP3를 사용할 수 있습니다. POP3 프로토콜은 행 지향적입니다. 파이썬의 poplib 라이브러리는 순수한 파이썬이며 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() 
+0

팁 주셔서 감사하지만 pop3 프로토콜 – agrynchuk

+0

@agry를 사용하려면 수정 된 답변을 참조하십시오. – alexis