poplib — POP3 프로토콜 클라이언트

poplib — POP3 프로토콜 클라이언트

poplib 모듈은 POP3 서버에 대한 연결을 캡슐화하고 RFC 1939에 정의된 프로토콜을 구현하는 POP3 클래스를 정의해요. POP3 클래스는 RFC 1939 의 최소 및 선택 명령 집합을 모두 지원해요. 또한 이미 수립된 연결에서 암호화 통신을 활성화하는 RFC 2595 에서 도입된 STLS 명령도 지원해요.

출처: Python documentation

본문

이 모듈은 또한 SSL 을 하부 프로토콜 계층으로 사용하는 POP3 서버에 연결을 지원하는 POP3_SSL 클래스를 제공해요.

POP3 는 널리 지원되지만 구식(obsolescent)이에요. POP3 서버의 구현 품질은 들쭉날쭉하고 너무 많은 서버가 상당히 열악해요. 메일 서버가 IMAP 을 지원한다면 imaplib.IMAP4 클래스를 사용하는 게 더 나은데, IMAP 서버가 더 잘 구현되는 경향이 있기 때문이에요.

가용성: WASI 아님. 이 모듈은 WebAssembly 에서 동작하지 않거나 사용할 수 없어요.

클래스 (Classes)

  • class poplib.POP3(host, port=POP3_PORT[, timeout]) — 실제 POP3 프로토콜을 구현해요. 인스턴스가 초기화될 때 연결이 만들져요. port 를 생략하면 표준 POP3 포트(110)를 사용해요. 선택적 timeout 은 연결 시도의 제한 시간(초)을 지정해요. poplib.connect 감사 이벤트를 인자 self, host, port 로 발생시켜요. 모든 명령은 poplib.putline 감사 이벤트를 인자 self, line 으로 발생시켜요. 버전 3.9에서 timeout 이 0이면 비블로킹 소켓 생성을 막기 위해 ValueError 를 발생시켜요.
  • class poplib.POP3_SSL(host, port=POP3_SSL_PORT, __, timeout=None, context=None)* — SSL 암호화 소켓으로 서버에 연결하는 POP3 의 하위 클래스예요. port 를 지정하지 않으면 표준 POP3-over-SSL 포트인 995 를 사용해요. context 는 SSL 구성 옵션·인증서·개인 키를 하나의 구조로 묶는 선택적 ssl.SSLContext 객체예요. 버전 3.2에서 context 추가, 3.4에서 호스트명 검사와 SNI 지원, 3.12에서 비권장 keyfile·certfile 매개변수 제거.

예외 (Exceptions)

  • exception poplib.error_proto — 이 모듈의 모든 오류에서 발생하는 예외예요(socket 모듈의 오류는 잡지 않음). 예외의 이유가 생성자에 문자열로 전달돼요.

POP3 객체 (POP3 Objects)

모든 POP3 명령은 같은 이름(소문자)의 메서드로 표현되고, 대부분 서버가 보낸 응답 텍스트를 반환해요.

  • POP3.set_debuglevel(level) — 인스턴스의 디버깅 수준을 설정해요. 기본 0 은 출력이 없고, 1 은 요청당 한 줄 정도, 2 이상은 제어 연결에서 보내고 받은 각 줄을 기록하는 최대 출력이에요.
  • POP3.getwelcome() — POP3 서버가 보낸 인사 문자열을 반환해요.
  • POP3.capa() — RFC 2449 에 지정된 서버의 기능을 조회해요. {'name': ['param'...]} 형태의 딕셔너리를 반환해요. 버전 3.4 추가.
  • POP3.user(username) — user 명령을 보내요. 응답은 비밀번호가 필요함을 나타내야 해요.
  • POP3.pass_(password) — 비밀번호를 보내요. 응답은 메시지 수와 우편함 크기를 포함해요. 서버의 우편함은 quit() 을 호출할 때까지 잠겨요.
  • POP3.apop(user, secret) — 더 안전한 APOP 인증으로 POP3 서버에 로그인해요.

POP3 예제 (POP3 Example)

우편함을 열고 모든 메시지를 가져와 출력하는 최소 예제(오류 검사 없음):

import getpass, poplib

M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print(j)

더 알아보기 (Learn more)