You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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)

关键修改说明

  1. 替换统计逻辑:移除了select和search命令,改用imap_client.status(f'"{mailbox_name}"', '(MESSAGES)')直接查询邮箱的总邮件数。
  2. 结果解析:从STATUS返回的响应中提取MESSAGES对应的数值,该值是邮箱的实际总邮件数,无上限限制。
  3. 补充依赖:原代码遗漏了sys模块的导入,已补充完整。

内容的提问来源于stack exchange,提问作者user321627

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:35:06