使用imaplib移动邮件至自定义文件夹报错:COPY command error: BAD
解决imaplib移动邮件到自定义文件夹的"COPY command error: BAD"问题
出现这个错误通常和自定义文件夹的IMAP标识格式、命令参数规范有关,以下是具体排查和解决方法:
1. 确认自定义文件夹的正确IMAP路径
不同IMAP服务器对文件夹名称的处理规则不同,尤其是带空格的名称,直接用Test Folder可能不符合服务器要求。你可以先列出所有文件夹,查看目标文件夹的真实标识:
# 连接并登录后执行 resp, folders = conn.list() for folder in folders: print(folder)
输出结果会类似b'(\\HasNoChildren) "." "Test Folder"',这里的"Test Folder"就是服务器认可的文件夹标识,需要用这个带双引号的字符串作为目标参数。
2. 修正COPY命令的参数格式
IMAP协议要求带空格的文件夹名称必须用双引号包裹,直接传入Test Folder会被服务器解析为多个参数,导致命令错误。你可以:
- 直接用带双引号的字符串作为目标文件夹:
conn.copy(msg_id, '"Test Folder"') - 或者使用imaplib的
quote()方法自动处理名称:target_folder = conn.quote('Test Folder') conn.copy(msg_id, target_folder)
3. 排查文件夹权限问题
虽然能正常移动到Archive,但自定义文件夹可能存在权限限制。检查邮箱设置,确保当前账号对Test Folder拥有写入权限。
完整示例代码
import imaplib # 连接IMAP服务器 conn = imaplib.IMAP4_SSL('imap.yourmailserver.com') conn.login('your_email@domain.com', 'your_password') # 选择收件箱 conn.select('INBOX') # 列出所有文件夹,确认目标路径 resp, folders = conn.list() for folder in folders: print(folder) # 定义目标文件夹(根据list结果调整) target_folder = '"Test Folder"' # 搜索要移动的邮件(这里以第一封邮件为例) resp, msg_ids = conn.search(None, 'ALL') if msg_ids[0]: msg_id = msg_ids[0].split()[0] # 复制邮件到目标文件夹 conn.copy(msg_id, target_folder) # 标记原邮件为删除并彻底移除 conn.store(msg_id, '+FLAGS', '\\Deleted') conn.expunge() # 关闭连接 conn.close() conn.logout()
内容的提问来源于stack exchange,提问作者Mohit Aswani
相关产品推荐
相关产品推荐

