imaplib — IMAP4 프로토콜 클라이언트

imaplib — IMAP4 프로토콜 클라이언트

imaplib 모듈은 IMAP4(Internet Message Access Protocol, version 4) 프로토콜 클라이언트를 정의해요. 이 모듈은 RFC 2060에 기술된 IMAP4rev1 프로토콜을 구현하고, IMAP4rev2(RFC 9051), IDLE(RFC 2177), AUTH=PLAIN(RFC 4616) 및 기타 여러 선택 명령을 지원합니다.

참고: 과도하게 방대한 IMAP4 서버 목록은 클라이언트 자원을 소모할 수 있어요. 이 모듈은 제어권을 클라이언트에 두기 때문에, list()search() 같은 호출이 끝없이 걸리지 않도록 수신 데이터 크기에 상한을 두는 게 좋습니다.

출처: Python 표준 라이브러리

클래스

IMAP4

  • class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None)

IMAP4 서버와의 연결을 나타내요. 이 클래스는 IMAP4_SSLIMAP4_stream의 기반이기도 합니다. host는 서버 호스트 이름이고, port는 기본적으로 IMAP4 포트(143)예요. 연결은 선택적 timeout 초 안에 이뤄져야 합니다.

클라이언트 오류는 IMAP4.error로, 서버 응답 오류는 IMAP4.abort로, 연결이 닫힌 상태에서의 호출은 IMAP4.readonly 같은 하위 클래스를 통해 보고됩니다.

IMAP4_SSL

  • class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None, timeout=None)

SSL 연결로 IMAP4 서버와 통신해요. ssl_context가 주어지면 SSL 소켓을 만들 때 그 컨텍스트를 사용합니다. keyfilecertfile은 레거시 인자입니다.

>>> import imaplib
>>> M = imaplib.IMAP4_SSL('imap.example.com')

IMAP4_stream

  • class imaplib.IMAP4_stream(command, **kwargs)

IMAP4 서버에 직접 연결하는 대신 미리 열린 셸 명령의 표준 입출력을 통해 통신해요. 예를 들어 commandssh imap.example.com 같은 것을 주면, 그 셸이 서버와 대화합니다. SSH 터널링을 쓸 때 유용해요.

주요 메서드

  • IMAP4.login(user, password) — 서버에 로그인해요. 성공하면 OK를 반환합니다.
  • IMAP4.select(mailbox='INBOX', readonly=False) — 사서함을 선택하고 선택된 메일 개수를 반환해요.
  • IMAP4.list(directory='""', pattern='*') — 사서함 이름 목록을 반환해요.
  • IMAP4.fetch(message_set, message_parts) — 메시지의 일부(전체 텍스트, 헤더, 플래그 등)를 가져와요. message_parts는 예를 들어 '(RFC822)', '(FLAGS)' 같은 문자열입니다.
  • IMAP4.search(charset=None, criterion, *...) — 조건에 맞는 메시지 번호 목록을 검색해요.
  • IMAP4.store(message_set, command, flags) — 메시지의 플래그를 변경해요(예: '+FLAGS'로 읽음 표시).
  • IMAP4.copy(message_set, new_mailbox) — 메시지를 다른 사서함으로 복사.
  • IMAP4.expunge() — 삭제 표시된 메시지를 영구 제거.
  • IMAP4.logout() — 서버 연결을 정리하고 닫아요.

각 IMAAP 명령 메서드는 서버 응답을 (typ, data) 튜플로 반환하며, typ'OK', 'NO', 'BAD' 중 하나예요.

예제

다음은 IMAP 서버에 연결해 받은 편지함의 메시지 ID를 나열하는 간단한 예입니다:

import imaplib
import getpass

M = imaplib.IMAP4_SSL('imap.example.com')
M.login('username', getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')   # search all messages
for num in data[0].split():
    typ, msg_data = M.fetch(num, '(RFC822)')
    # process msg_data
M.logout()

메일의 제목만 추출하고 싶다면 '(BODY.PEEK[HEADER.FIELDS (SUBJECT)])' 같은 메시지 부품을 써서 헤더만 가져올 수 있어요.

모듈 상수

  • imaplib.IMAP4_PORT — 기본 IMAP4 포트 143.
  • imaplib.IMAP4_SSL_PORT — 기본 IMAP4 over SSL 포트 993.
  • imaplib.IMAP4.imaplib._MAXLINE 등 내부 상수도 존재합니다.

더 알아보기

  • Python 표준 라이브러리의 poplib 모듈 — POP3 클라이언트
  • Python 표준 라이브러리의 smtplib 모듈 — SMTP 클라이언트
  • RFC 2060 / RFC 9051 — IMAP4 프로토콜 명세
  • Python 공식 문서: imaplib