2016-07-13 7 views
-2

파이썬 3.5와 함께 전자 메일 (제목, 본문)을 인쇄하려고합니다. 내가 FORS 및 분할의 내 엉킴이 범인이라고 생각하지만,IndexError :리스트 인덱스가 범위를 벗어남 (파이썬 3.5)

Traceback (most recent call last): 
File "/home/user/PycharmProjects/email/imaplib_fetch_rfc822.py", line 21, in <module> 
subject_, from_, to_, body_, = ' ' + email[0], email[1], email[2], 'Body: ' + email[4] 
IndexError: list index out of range 

나는이 원인을 확실하지 않다 : 나는 이상한 인덱스 오류가 발생합니다. 나는 noobie 코더입니다, 그래서 내가이 일을하고있어 우아한에서 멀리 상상 :

import imaplib 
import imaplib_connect 

with imaplib_connect.open_connection() as c: 
    c.select('INBOX') 
    typ, [msg_ids] = c.search(None, 'TEXT', 'Sunday') 
    for num in msg_ids.split(): 
     typ, msg_data = c.fetch(num, '(RFC822)') 
     for raw_email in msg_data: 
      # raw_email is a tuple of len==2, we need the 2nd item: 
      b = raw_email[1] 
      email = str(b).split('\r\n') 
      subject_, from_, to_, body_, = ' ' + email[0], email[1], email[2], 'Body: ' + email[4] 
      print(subject_, '\n', 
        from_, '\n', 
        body_, '\n') 

내가 문제가 무엇을 이해하지 않습니다. 한 가지주의 할 점은 전자 메일 부분의 전자 메일 [0], 전자 메일 [1], 전자 메일 [2] 및 전자 메일 [4]에 전자 메일 [3]을 건너 뛰는 것입니다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니? 오류를 해결하기 위해 무엇을 할 수 있습니까?

+3

가 실제로 오류를 일으키는 코드를 표시 할 수 있습니다 귀하의 이메일은 항상 길이 ==와 email 프로그램 객체에서 가정 일을해야합니까? 트레이스 백 (traceback)은 정확히 어떤 라인과 파일이 있는지를 보여줍니다. 또한 그것이 나를 미치게 만들었 기 때문에 당신은 '범위 (0, 1)에 있음'이 ** 길이 1 **의 루프인지 알 수 있습니까? –

+2

그게 무슨 가치가 있는지, 당신은 당신의'for i in range (0, 1)'루프에서'i'를 참조하지 않습니다. 'range (0, 1)'은 본질적으로 그냥 0을 참조하는 것이 아니라, 그 범위에서 1이 제외 되었기 때문입니다. –

+0

@ Two-Bit Alchemist 코드가 오류를 일으키는 부분을 포함하도록 게시물을 변경했습니다. 'c = [1]'행에 있습니다. 그 점을 지적 해 주셔서 감사합니다! 그렇습니다, 내 루프가 ... 이상합니다 ... 나는 그걸 어떻게 써야할지 모르겠다. 단지 [0]에 들어있는 것처럼? – Joansy

답변

1

색인 생성/분할에 몇 가지 문제가 있습니다. 당신이 튜플에서 문자열로 raw_email을 변환 할 필요가 없다고 생각합니다. 그냥 튜플을 처리하십시오.

for raw_email in msg_data: 
     # raw_email is a tuple of len==2, we need the 2nd item: 
     if len(raw_email) >= 2: 
      b = raw_email[1] 
      email = b.decode('utf-8').split('\r\n') 
      subject_, from_, to_, body_, = ' '+email[0], email[1], email[2], 'Body: ' + email[4] 
      print(subject_, '\n', 
        from_, '\n', 
        body_, '\n') 
     else: 
      print("This raw_email was not processed: "+ raw_email) 
      # Use this for debugging if the raw_email is diff't length 

이 파이썬 2.7에서 테스트되었습니다,하지만 작동하는 것 같군 :

그런 다음 split('\\r\\n')가 잘못, 그것은

split('\r\n') 내가이 그것을 해결할 생각해야한다

enter image description here

참고 : python 3.x에서는 py32에서 필요하지 않은 b.decode('utf-8')을 사용해야합니다. 톤 2.

이 5

+0

이것은 메시지의 형식을 많이 가정합니다. 잘만되면 사용자는 파이썬에서 MIME Parser를 사용하기를 바랄 수 있습니다. – Max

+0

@Max 가정은 Chat을 통해 얻은 샘플 데이터를 기반으로합니다. –

+0

@Max MIME Parser를 살펴 보았습니다. 나는 파이썬 3.5에서 더 이상 사용되지 않을 것이라고 생각한다. 대신 그들은 email.parser를 사용하기를 원합니다. – Joansy

관련 문제