IMAP4.uid命令报错:BAD [b'Command Argument Error. 11']求助
问题:IMAP UID命令报错(BAD [b'Command Argument Error. 11'])
我编写了一个Python程序,旨在收到新邮件时执行指定功能。目前IMAP服务器、连接及收件箱均正常工作,也不存在'"Inbox"'与'Inbox'的格式问题,但尝试多种方案后仍未解决问题。
我的代码:
def connect(): global connected #sets up connection with imap server connection = imaplib.IMAP4_SSL("outlook.office365.com") try: (retcode, capabilities) = connection.login(login, secure_password) except: print(sys.exc_info()[1]) sys.exit(1) print("connection successful") connected = True return connection def disconnect(connection): connection.logout() connected = False connection = connect() while connected == True: print("Searching for new Emails...") connection.select(mailbox = "Inbox", readonly=False) # test section start result, data_for_update = connection.uid('search', None, "ALL") ids = data_for_update[0] id_list = ids.split() if data_for_update[0].split()[-1] == latest_email_uid: print('No new emails found. search again in 5 minutes') time.sleep(300) else: result, data_for_update = connection.uid('fetch', latest_email_uid, '(RFC822)') raw_email = data_for_update[0],[1] latest_email_uid == data_for_update[0].split()[-1] print('New email found') time.sleep(300)
运行该代码时返回如下错误:
\lib\imaplib.py", line 1055, in _command_complete raise self.error('%s command error: %s %s' % (name, typ, data)) imaplib.IMAP4.error: UID command error: BAD [b'Command Argument Error. 11']
错误原因及修复方案
1. latest_email_uid未初始化
第一次运行时latest_email_uid没有赋值,直接作为fetch的参数或对比值,IMAP服务器收到无效UID,触发参数错误。
修复:在程序开头初始化该变量(注意IMAP的UID是字节类型):
latest_email_uid = b'0' # 初始化为字节类型的0
2. 赋值操作误用比较运算符
代码中latest_email_uid == data_for_update[0].split()[-1]用了==(比较)而非=(赋值),导致latest_email_uid永远不会更新,后续循环持续触发错误。
修复:改为赋值语句:
latest_email_uid = data_for_update[0].split()[-1]
3. raw_email语法错误
raw_email = data_for_update[0],[1]会创建一个无效元组,而非获取邮件内容。IMAP fetch返回的每个元素是(UID+FLAGS, 邮件内容)的元组,需正确索引。
修复:
raw_email = data_for_update[0][1]
4. 重复执行connection.select
每次循环都调用connection.select属于冗余操作,可能导致IMAP状态异常。
修复:将该语句移到循环外,连接后仅执行一次:
connection = connect() connection.select(mailbox="Inbox", readonly=False) # 只执行一次 while connected == True: print("Searching for new Emails...") # 后续代码...
5. 未处理空收件箱场景
若收件箱为空,data_for_update[0].split()返回空列表,访问[-1]会抛出索引错误,进而引发IMAP命令异常。
修复:添加空列表判断:
result, data_for_update = connection.uid('search', None, "ALL") ids = data_for_update[0] id_list = ids.split() if not id_list: # 无邮件时直接跳过后续逻辑 print('No emails in inbox. Checking again in 5 minutes') time.sleep(300) continue # 后续对比及处理逻辑...
修复后的完整代码示例
import imaplib import sys import time login = "your_email@outlook.com" secure_password = "your_password" connected = False latest_email_uid = b'0' # 初始化UID def connect(): global connected connection = imaplib.IMAP4_SSL("outlook.office365.com") try: (retcode, capabilities) = connection.login(login, secure_password) except: print(sys.exc_info()[1]) sys.exit(1) print("connection successful") connected = True return connection def disconnect(connection): connection.logout() connected = False connection = connect() connection.select(mailbox="Inbox", readonly=False) while connected == True: print("Searching for new Emails...") result, data_for_update = connection.uid('search', None, "ALL") ids = data_for_update[0] id_list = ids.split() if not id_list: print('No emails in inbox. Checking again in 5 minutes') time.sleep(300) continue current_latest_uid = id_list[-1] if current_latest_uid == latest_email_uid: print('No new emails found. search again in 5 minutes') time.sleep(300) else: # 拉取最新邮件而非旧的latest_email_uid result, data_for_update = connection.uid('fetch', current_latest_uid, '(RFC822)') raw_email = data_for_update[0][1] latest_email_uid = current_latest_uid print('New email found') # 这里可以添加处理新邮件的逻辑 time.sleep(300)
内容的提问来源于stack exchange,提问作者MuteKn0wM0RE
相关产品推荐
相关产品推荐

