我想通过以下代码检索已发送邮件文件夹中的内容:
ls
当conn = imaplib.IMAP4_SSL('imap.exmail.qq.com',993)
conn.login(user,pwd)
conn.select("Sent Messages")
mails = conn.search(None, 'ALL')
for num in mails[1][0].split():
t, d = conn.fetch(num, 'RFC822')
if t == 'OK':
print 'Message %s\n' % (num)
msg = email.message_from_string(d[0][1])
subject = email.Header.decode_header(msg['subject'])[0][0]
if re.search(month, subject):
print subject
else:
print 'fetch error'
为8时,num
介于1到36之间。出现错误:
追踪(最近的呼叫最后):
文件“monthlySummary.py”,第30行,在 t,d = conn.fetch(num,'RFC822')
文件“/usr/lib/python2.7/imaplib.py”,第455行,在获取中 typ,dat = self._simple_command(name,message_set,message_parts)
文件“/usr/lib/python2.7/imaplib.py”,第1087行,在_simple_command中 return self._command_complete(name,self._command(name,* args))
文件“/usr/lib/python2.7/imaplib.py”,第911行,在_command_complete中
raise self.abort('command:%s =>%s'%(name,val))
imaplib.abort:command:FETCH =>套接字错误:未终止的行
我尝试重新登录,但仍然出现同样的错误。这个套接字错误是什么意思?我该如何解决这个问题?
感谢。
答案 0 :(得分:0)
从imaplib源代码(here),相关函数是:
def _get_line(self):
line = self.readline()
if not line:
raise self.abort('socket error: EOF')
# Protocol mandates all lines terminated by CRLF
if not line.endswith(b'\r\n'):
raise self.abort('socket error: unterminated line')
line = line[:-2]
if __debug__:
if self.debug >= 4:
self._mesg('< %r' % line)
else:
self._log('< %r' % line)
return line
函数中的注释表示所有行都必须由CRLF终止,因此它显然会触及不行的行,因此会中止。
您需要确保每一行都以'\r\n'
结尾,因此为了做到这一点,您可以在处理之前简单地将此字符串添加到每行(如果尚未存在)。这将确保不会引发程序中止的错误。