移动邮件(copy)
此处可以理解为MOVE移动,而不是复制,移动后原邮件会被删除。
UID 和 NUM 的区别
UID (Unique ID):
每封邮件在邮箱文件夹中的唯一标识符,删除中间邮件,后续邮件UID不会自动变化。
使用 mail.uid 方法进行操作,例如 mail.uid('search', None, 'UNSEEN')。
NUM (Message Number):
邮件在当前文件夹中的序号,中间邮件操作删除、移动等,后续邮件NUM会重新排序。
使用 mail.search 或 mail.fetch 等方法进行操作,例如 mail.search(None, 'UNSEEN')。
Python示例代码
场景:3封邮件,分别以uid和num方式,使用copy命令,从folder1移动到folder2。
重要
风险提示:下述代码在Python 3.11.9进行的测试,用于生产环境之前请务必先做好测试。
# -*- coding: utf-8 -*-import imaplibdef before_after_move_email(source_folder, destination_folder): # 选择文件夹
mail.select(source_folder) # uid
result, data = mail.uid('search', None, 'UNSEEN') print(f'{source_folder}搜索结果UID:{result},{data}') # # num
# result, data = mail.search(None, 'UNSEEN')
# print(f'{source_folder}搜索结果NUM:{result},{data}')
# 选择文件夹
mail.select(destination_folder) # 搜索邮箱中所有邮件的UID,推荐
# uid
result, data = mail.uid('search', None, 'UNSEEN') print(f'{destination_folder}搜索结果UID:{result},{data}') # num
# result, data = mail.search(None, 'UNSEEN')
# print(f'{destination_folder}搜索结果NUM:{result},{data}')# 设置邮箱信息# 配置 IMAP 服务器imap_server = 'imap.qiye.aliyun.com' # IMAP 服务器地址username = 'test@example.com' # 用户名password = '*******' # 密码port = 993 # 端口号source_folder = 'folder1'destination_folder = 'folder2'# 连接到IMAP服务器mail = imaplib.IMAP4_SSL(imap_server, port)
mail.login(username, password)print('移动前:')
before_after_move_email(source_folder, destination_folder)# 移动指定的UIDmail.select(source_folder)# uidresult, copy_data = mail.uid('COPY', '6', destination_folder)# num# result, copy_data = mail.copy('1', destination_folder)print('移动后:')
before_after_move_email(source_folder, destination_folder)说明
上述代码注释为# uid和# num的有三处,用于切换uid和num方式。
总结:uid方式移动后会取新文件夹的下一个最大值,num则会重新计数。
运行效果
uid方式
移动邮件16,到新文件夹时,取新文件夹的下一个最大值,计数为14

num方式
移动邮件2,到新文件夹时,重新排序为1

