[py] retr에서 발생한 line too long 예외 처리하기

@codemaru · June 03, 2016 · 2 min read

파이썬에서 poplib을 사용해서 POP3로 메일을 받아올 때 retr 함수를 사용한다. 보통은 잘 되는데 어쩔 때 이 함수에서 웃기게도 "line too long"이란 예외가 발생한다. 찾아가보면 아래와 같은 지점에서 예외를 던지는 것을 발견할 수 있다. 이 경우에 옵션은 두 가지다. 하나는 그냥 그 메시지를 무시하거나 다른 하나는 라인을 더 늘리거나.

def _getline(self):
	line = self.file.readline(_MAXLINE + 1)
	if len(line) > _MAXLINE:
		raise error_proto('line too long')

서버가 던져주는 메시지를 무시하기는 힘들다. 그래서 라인을 늘리려고 찾아가보면 아래와 같이 자뻑형 주석과 함께 있는 상수 선언 부분을 찾을 수 있다. RFC 1939는 512글자로 제한하고 있지만 우리는 더 안전하게 하기 위해서 2048을 택했지라는 ㅋㅋㅋ 하지만 행님들 현실 세계에서는 2048로는 부족하긔~ 나는 대인배니까 값을 그냥 20480으로 변경했다 ㅋㅋㅋ~ 당연한 얘기겠지만 고치고 나자 서버로부터 모든 메시지를 안전하게 수신할 수 있었다. 지금으로썬 딱히 이 상수를 변경하는 것 외에는 방법이 없는 것 같다.

# maximal line length when calling readline(). This is to prevent
# reading arbitrary length lines. RFC 1939 limits POP3 line length to
# 512 characters, including CRLF. We have selected 2048 just to be on
# the safe side.
_MAXLINE = 2048
@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중