阿里邮箱IMAP场景示例:移动邮件(copy)、uid和num区别

移动邮件(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 imaplib


def 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)

# 移动指定的UID
mail.select(source_folder)
# uid
result, 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

image

num方式

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

image

image