pop3 retr responses too large lines - Fails with current python's poplib

Guillermo M. Narvaja guillermo.narvaja at fierro.com.ar
Fri Apr 10 14:51:04 UTC 2015


El vie, 10-04-2015 a las 10:21 +0900, Timo Sirainen escribió:
> On 09 Apr 2015, at 06:52, Guillermo M. Narvaja <guillermo.narvaja at fierro.com.ar> wrote:
> > 
> > Since December 2014, clients using the Python poplib library (getmail in
> > my case) started to limit the line length of RETR and other command
> > responses sent from the server to 2048 bytes:
> > 
> > See https://bugs.python.org/issue16041 (Included at least in
> > Python-2.7.9)
> > 
> > Dovecot doesn't have line split in the POP3 module, so Python fails to
> > retrieve messages with long lines.
> > 
> > RFC 1939 says:
> > "
> >   Responses in the POP3 consist of a status indicator and a keyword
> >   possibly followed by additional information.  All responses are
> >   terminated by a CRLF pair.  Responses may be up to 512 characters
> >   long, including the terminating CRLF.
> > "
> > 
> > I think dovecot-pop3 should split it's output in lines of at least 512
> > characters. Or at least it should have a "pop3_max_line_length" setting
> > (like "imap_max_line_length").
> 
> Um. This is talking about POP3 responses themselves - not about the
> actual email message body. Dovecot's POP3 reponses are short always I
> think. The message body is sent exactly as it was originally saved.
> Changing this could break things like PGP/SMIME signing and so on.

So there is no way to break the lines without breaking the message?

Please note that if you are right, I should post a bug on the Python
project.

You can see in this "traceforward" that Python's poplib will throw an
error_proto exception if RETR returns lines longer than 2048 bytes:

https://hg.python.org/cpython/file/0db36098b908/Lib/poplib.py#l227
https://hg.python.org/cpython/file/0db36098b908/Lib/poplib.py#l165
https://hg.python.org/cpython/file/0db36098b908/Lib/poplib.py#l142
https://hg.python.org/cpython/file/0db36098b908/Lib/poplib.py#l370

        def _getline(self):
            line = ""
            renewline = re.compile(r'.*?\n')
            match = renewline.match(self.buffer)
            while not match:
                self._fillBuffer()
>>>              if len(self.buffer) > _MAXLINE:  # _MAXLINE=2048
>>>                  raise error_proto('line too long')
                match = renewline.match(self.buffer)
            line = match.group(0)
	    ...



-- 
Guillermo M. Narvaja
Lambda Sistemas S.R.L.
www.fierro-soft.com.ar - radiocut.fm
Tel: (5411) 3220-1520 (rotativas) y 4857-6662
Cel: (5411) 15-6783-4435
Email: guillermo.narvaja at fierro-soft.com.ar
MSN: guillermo_narvaja at hotmail.com
Skype: guillermonarvaja
Lavalleja 519 1er Piso - Ciudad de Buenos Aires - Argentina



More information about the dovecot mailing list