解决Python统计Yahoo邮箱邮件数上限10000的问题
修复Yahoo邮箱IMAP统计邮件数上限问题
问题原因
你当前代码通过SEARCH命令获取所有邮件ID再统计数量,但Yahoo IMAP服务器对SEARCH返回结果设置了10000条的上限,超过该数量的文件夹只会返回前10000个邮件ID,导致统计结果远低于实际数量。
修复方案
改用IMAP标准的STATUS命令,该命令可以直接查询邮箱的元数据(包括总邮件数),无需遍历所有邮件ID,既规避了上限限制,又大幅提升统计效率。
修改后的完整代码
import os import getpass import imaplib import logging import sys # 补充原代码遗漏的sys导入 IMAP_SERVER = 'imap.mail.yahoo.com' MAILBOX_BLACKLIST = ['trash'] def get_credentials(): username = input('Yahoo Mail username: ').strip() psswd = getpass.getpass(prompt='Yahoo Mail app-specific password: ') return username, psswd def login(username, psswd): imap_client = imaplib.IMAP4_SSL(IMAP_SERVER) try: login_status, _ = imap_client.login(username, psswd) if login_status == "OK": logging.info("Login successful") return imap_client except imaplib.IMAP4.error as e: logging.error(f"Login failed: {e}") return None def count_emails(imap_client): # 获取所有邮箱列表 list_status, mailboxes = imap_client.list() if list_status != "OK": logging.error("无法获取邮箱列表") return 1 # 过滤并处理邮箱名称 mailbox_names = [get_mailbox_name(mailbox) for mailbox in mailboxes if get_mailbox_name(mailbox).lower() not in MAILBOX_BLACKLIST] for mailbox_name in mailbox_names: try: # 使用STATUS命令查询总邮件数,无需打开邮箱 status_result = imap_client.status(f'"{mailbox_name}"', '(MESSAGES)') if status_result[0] == "OK": # 解析STATUS返回的结果 response = status_result[1][0].decode('utf-8') total_messages = int(response.split('MESSAGES ')[1].strip(')')) print(f"邮箱 '{mailbox_name}' 共有 {total_messages} 封邮件。") else: print(f"查询邮箱 {mailbox_name} 失败") except imaplib.IMAP4.error as e: print(f"访问邮箱 {mailbox_name} 出错: {e}") def get_mailbox_name(mailbox): mailbox = mailbox.decode('utf-8') mailbox_name = mailbox.split(' "/"')[-1].replace('"', '').strip() return mailbox_name if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) username, psswd = get_credentials() imap_client = login(username, psswd) if not imap_client: logging.error("登录失败,退出程序") sys.exit(1) count_emails(imap_client) try: imap_client.logout() except imaplib.IMAP4.error as e: logging.error(f"登出时出错: {e}") sys.exit(0)
关键修改说明
- 替换统计逻辑:移除了
select和search命令,改用imap_client.status(f'"{mailbox_name}"', '(MESSAGES)')直接查询邮箱的总邮件数。 - 结果解析:从STATUS返回的响应中提取
MESSAGES对应的数值,该值是邮箱的实际总邮件数,无上限限制。 - 补充依赖:原代码遗漏了
sys模块的导入,已补充完整。
内容的提问来源于stack exchange,提问作者user321627
相关产品推荐
相关产品推荐

