개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.07.23 21:29

imap_body 함수 사용에 대한 질문

목록
  • UI컴포넌트장인 6시간 전 2025.07.23 21:29 새글
  • 5
    1
제가 imap_body 함수를 사용하여 이메일 본문을 가져오려고 하는데, 아래와 같은 오류가 발생합니다.

python

import imaplib

import email



# 이메일 서버 접속

mail = imaplib.IMAP4('imap.gmail.com')

mail.login('내 이메일 주소', '비밀번호')

mail.select('inbox')



# 메시지 가져오기

status, messages = mail.search(None, 'ALL')

for num in messages[0].split():

    status, data = mail.fetch(num, '(RFC822)')

    raw_message = data[0][1]

    message = email.message_from_bytes(raw_message)



    # 이메일 본문 가져오기

    body = ''

    if message.is_multipart():

        for part in message.walk():

            if part.get_content_type() == 'text/plain':

                body += part.get_payload()

    else:

        body = message.get_payload()



    print(body)



이 코드는 잘 작동하지만, 일부 이메일에서 오류가 발생합니다. 오류 메시지는 다음과 같습니다.



TypeError: 'str' object is not subscriptable



이 오류는 어느 부분에서 발생하는지 알려주세요. 또한, 이메일 본문을 가져오기 위해 어떻게 해야 하는지 알려주세요.

    댓글목록

    profile_image
    나우호스팅  6시간 전



    이 오류는 `messages[0].split()`에서 발생합니다. `messages[0]`은 문자열이기 때문에 `split()` 메서드를 사용할 수 없습니다.

    대신, `messages[0]`을 리스트로 변환한 후 `split()` 메서드를 사용하세요.

    #hostingforum.kr
    python
    
    status, messages = mail.search(None, 'ALL')
    
    messages = messages[0].split()
    
    


    또한, `message.walk()` 메서드는 이메일 본문을 가져올 때 일부 이메일에서 오류가 발생할 수 있습니다. 이 경우, `try-except` 블록을 사용하세요.

    #hostingforum.kr
    python
    
    try:
    
        for part in message.walk():
    
            if part.get_content_type() == 'text/plain':
    
                body += part.get_payload()
    
    except Exception as e:
    
        print(f"오류 발생: {e}")
    
    


    이메일 본문을 가져오기 위해 다음과 같이 코드를 수정하세요.

    #hostingforum.kr
    python
    
    import imaplib
    
    import email
    
    
    
    # 이메일 서버 접속
    
    mail = imaplib.IMAP4('imap.gmail.com')
    
    mail.login('내 이메일 주소', '비밀번호')
    
    mail.select('inbox')
    
    
    
    # 메시지 가져오기
    
    status, messages = mail.search(None, 'ALL')
    
    messages = messages[0].split()
    
    
    
    for num in messages:
    
        status, data = mail.fetch(num, '(RFC822)')
    
        raw_message = data[0][1]
    
        message = email.message_from_bytes(raw_message)
    
    
    
        # 이메일 본문 가져오기
    
        body = ''
    
        try:
    
            if message.is_multipart():
    
                for part in message.walk():
    
                    if part.get_content_type() == 'text/plain':
    
                        body += part.get_payload()
    
            else:
    
                body = message.get_payload()
    
        except Exception as e:
    
            print(f"오류 발생: {e}")
    
            continue
    
    
    
        print(body)
    
    


    이 코드는 일부 이메일에서 오류가 발생할 수 있지만, 대부분의 이메일에서 올바르게 작동할 것입니다.

    2025-07-23 21:30

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 38,409건 / 1 페이지

검색

게시물 검색