fix: skip already-processing UIDs at FETCH level to avoid downloading email content

This commit is contained in:
2026-07-13 07:35:28 +08:00
parent d31ec18ea3
commit 155a6dfc53
4 changed files with 17 additions and 9 deletions

View File

@@ -109,8 +109,10 @@ def _login_and_prepare(account: EmailAccount, timeout: int = 30, select_inbox: b
return conn
def fetch_unseen_emails(account: EmailAccount) -> list[Email]:
def fetch_unseen_emails(account: EmailAccount, skip_uids: set[bytes] | None = None) -> list[Email]:
conn = _login_and_prepare(account, select_inbox=False)
if skip_uids is None:
skip_uids = set()
# 列出所有文件夹
_, folder_data = conn.list()
@@ -120,8 +122,6 @@ def fetch_unseen_emails(account: EmailAccount) -> list[Email]:
if item is None:
continue
line = item.decode("utf-8", errors="replace")
# IMAP LIST 格式: (flags) "delimiter" "folder_name"
# 用正则提取最后一个引号内的内容
m = re.search(r'"([^"]*)"\s*$', line)
if m:
folders.append(m.group(1))
@@ -130,6 +130,7 @@ def fetch_unseen_emails(account: EmailAccount) -> list[Email]:
logger.info("扫描文件夹: %s", ", ".join(folders))
emails = []
skipped = 0
for folder in folders:
try:
status, _ = conn.select(folder, readonly=True)
@@ -140,9 +141,15 @@ def fetch_unseen_emails(account: EmailAccount) -> list[Email]:
uids = data[0].split() if data[0] else []
if not uids:
continue
logger.info(" %s: %d 封未读", folder, len(uids))
for uid in uids:
# 先过滤掉正在处理的 UID避免下载不需要的邮件
new_uids = [uid for uid in uids if uid not in skip_uids]
skipped += len(uids) - len(new_uids)
if not new_uids:
continue
logger.info(" %s: %d 封未读 (%d 封跳过)", folder, len(new_uids), len(uids) - len(new_uids))
for uid in new_uids:
try:
_, msg_data = conn.uid("FETCH", uid, "RFC822")
if msg_data[0] is None: