使用imap_tools读取邮件时排序结果不符合预期的问题
imap_tools读取邮件时排序结果不符合预期的问题
看起来你遇到的问题是因为reverse=True只是反转了IMAP服务器默认返回的邮件顺序(这个顺序通常是按邮件的UID来排列的),但UID的分配逻辑不一定和邮件的实际时间顺序一致——比如邮箱经历过迁移、邮件恢复,或者服务器本身的UID规则特殊时,就会出现这种排序混乱的情况。
要解决这个问题,你需要让IMAP服务器直接按邮件的日期来排序,而不是依赖UID顺序。具体来说,修改mailbox.fetch()的参数,明确指定排序规则:
修改后的完整代码如下:
from imap_tools import MailBox import os import sys from dotenv import load_dotenv path = os.path.abspath(os.path.dirname(sys.argv[0])) fn = os.path.join(path, ".env") load_dotenv(fn) LOGIN_EMAIL = os.environ.get("LOGIN_EMAIL") LOGIN_PW = os.environ.get("LOGIN_PW") SERVER = os.environ.get("SERVER") with MailBox(SERVER).login(LOGIN_EMAIL, LOGIN_PW) as mailbox: # 指定按邮件日期降序排序,确保最新的邮件最先返回 for msg in mailbox.fetch(sort=("DATE", "DESC")): print(msg.date, msg.subject) input("Press!")
补充说明:
sort=("DATE", "DESC")让IMAP服务器按照邮件头里的Date字段(也就是邮件的发送日期)从新到旧排序返回结果。- 如果你的邮箱界面里显示的“最新”是指服务器接收邮件的时间而非发送日期,可以把
DATE换成ARRIVAL,也就是sort=("ARRIVAL", "DESC"),这样就会按接收时间排序。
这样修改后,你获取到的邮件顺序就会和邮箱界面里显示的“最新到最旧”完全一致了。
备注:内容来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

