引言
我喜欢使用Gmail通过POP3收我单位邮箱的邮件做一个备份,因为单位邮箱的搜索能力实在太差了。不过最近Gmail收POP3邮件总是出错:服务器返回错误“Error in RETR command: Received an empty line”。网上查了一下,包括Gmail给出的意见都是有一封邮件里面有空行,导致这个错误,删除这封邮件就可以了。不过,由于我用Gmail收邮件时并不让它删除邮件,而是定期手工删除,这样的我的邮箱里面有5000封邮件,怎么确定哪封邮件是应该删除的就成为了一个难题。
解决方法
手工删除了一些可疑邮件之后并没有解决问题。我决定用DeekSeek生成一个Python程序,让它去模拟POP3收信过程,并逐封邮件测试以定位问题邮件。以下是一个可检测异常邮件的示例脚本:
import poplib
from email import parser
import getpass
def debug_pop3_retrieve():
# 配置信息
pop3_server = 'mail.b.com'
port = 995
username = 'a@b.com'
password = getpass.getpass("Enter your password: ") # 安全输入密码
try:
# 连接服务器
mail_server = poplib.POP3_SSL(pop3_server, port)
mail_server.user(username)
mail_server.pass_(password)
print(f"Connected. Messages: {mail_server.stat()[0]}")
# 获取邮件列表
total_messages = mail_server.stat()[0]
msg_parser = parser.BytesParser()
# 逐封邮件测试
for i in range(1, total_messages + 1):
try:
print(f"Testing message {i}...")
# 仅用RETR命令触发可能的错误
response, lines, octets = mail_server.retr(i)
# 检查是否返回空行(关键错误点)
if not lines:
raise poplib.error_proto(f"Empty response for message {i}")
# 解析邮件内容
raw_email = b'\n'.join(lines)
parsed_email = msg_parser.parsebytes(raw_email)
# 提取并显示邮件标题
subject = parsed_email['Subject']
print(f"邮件标题: {subject}")
except poplib.error_proto as e:
print(f"❌ Error at message {i}: {str(e)}")
print("="*50)
print("建议操作:")
print(f"1. 登录Gmail网页版删除第 {i} 封邮件")
print(f"2. 或在脚本中删除:mail_server.dele({i})")
break
except Exception as e:
print(f"Other error at {i}: {str(e)}")
break
except Exception as e:
print(f"Connection failed: {str(e)}")
# 检查常见错误:
if "Authentication failed" in str(e):
print("提示:需开启Gmail的POP3访问或使用应用专用密码")
finally:
if 'mail_server' in locals():
mail_server.quit()
if __name__ == '__main__':
debug_pop3_retrieve()
这个程序会打印每条邮件的标题,如果遇到可疑邮件就会报告错误。报告错误的前一条邮件通常就是有问题邮件,把它删除了问题就解决了。Gmai提示我它自3月30日以来检索邮件出错,实际上我删除了3月21日的一封邮件,一切才恢复正常。
结语
虽然这个脚本不一定能够解决所有类似问题,但是如果你也遇到类似问题,不妨试试。这个脚本不会自动删除任何邮件,可以放心使用。