我在使用 Imaplib 访问和计算已发送邮件时遇到问题

I have a problem To Access And Count Sent Mails Using Imaplib

这是代码(已经导入库):

mail.select('"[Gmail]/Sent Mail"')
typ,messageIds = mail.search(None,"SEEN")
messageIdsString = str(messageIds[0],encoding='utf-8')
listofmessages = messageIdsString.split(" ")
nbr = len(listofmessages)
if len(listofmessages)== 0:
    print("You Have No Mails On Inbox")
elif len(listofmessages)== 0:
    print("You Have No Mails On Spam")
else :
    print("You Have ",nbr,"New Emails Inbox")

不知如何是好,请大家帮忙

我不知道你的问题是什么——你没有描述细节——但是当我测试这段代码时

result = mail.select('"[Gmail]/Sent Mail"')

print(result)

然后它显示看到

('NO', [b'[NONEXISTENT] Unknown Mailbox: [Gmail]/Sent Mail (Failure)'])

使用此代码显示所有文件夹

result = mail.list()

for folder in result[1]:
    print( folder.decode('utf-8') )

我发现我没有 [Gmail]/Sent Mail,而是母语(波兰语)"[Gmail]/Wys&AUI-ane"(我在 GMail 中看到的是 [GMail]/Wysłane)。我对文件夹 DraftSpam/JunkTrash 也有同样的问题 - 所以也许你有不同名称的类似问题。

使用 mail.list() 和标记 \Sent\Drafts\Junk\Trash 我可以为这些文件夹获取我的本机名称。

def detect_names():
    """Detect native names for standard folders (using flags)."""

    keys = {
        #'\Inbox': 'INBOX',
        '\Sent': 'SENT',
        '\Drafts': 'DRAFTS',
        '\Junk': 'JUNK',
        '\Trash': 'TRASH',
        '\Important': 'IMPORTANT',
        '\All': 'ALL',
    }
    
    result = {
        'INBOX': 'INBOX',
        'SENT': None,
        'DRAFTS': None,
        'JUNK': None,
        'TRASH': None,
        'IMPORTANT': None,
        'ALL': None,
    }
     
    data = mail.list()

    for folder in data[1]:
        all_flags, name = folder.decode('utf-8').split(' "/" ')
        for flag, key in keys.items():
            if flag in all_flags:
                result[key] = name
                
    return result

这里是我用于测试的完整代码

import imaplib
import getpass

def display_folders():
    """Display all folders (with native names) and flags."""
    
    result = mail.list()
    #print('[DEBUG] (mail.list) result:', result)

    for folder in result[1]:
        print(folder.decode('utf-8'))
        #flags, name = folder.decode('utf-8').split(' "/" ')
        #print(flags, name)
    
def detect_names():
    """Detect native names for standard folders (using flags)."""

    keys = {
        #'\Inbox': 'INBOX',
        '\Sent': 'SENT',
        '\Drafts': 'DRAFTS',
        '\Junk': 'JUNK',
        '\Trash': 'TRASH',
        '\Important': 'IMPORTANT',
        '\All': 'ALL',
    }
    
    result = {
        'INBOX': 'INBOX',
        'SENT': None,
        'DRAFTS': None,
        'JUNK': None,
        'TRASH': None,
        'IMPORTANT': None,
        'ALL': None,
    }
     
    data = mail.list()

    for folder in data[1]:
        all_flags, name = folder.decode('utf-8').split(' "/" ')
        for flag, key in keys.items():
            if flag in all_flags:
                result[key] = name
                
    return result

def test(names):
    """Check number of mails in `Sent`."""

    #result = mail.select('"[Gmail]/Sent Mail"')
    #result = mail.select('"[Gmail]/Wys&AUI-ane"')

    result = mail.select(names['SENT'])
    #print('[DEBUG] (mail.select) result:', result)

    # - SEEN -
    
    typ, msg_ids = mail.search(None, 'SEEN')
    #print('[DEBUG] (mail.search) result:', result)

    number_SEEN = len(msg_ids[0])
    print('number SEEN:', number_SEEN)

    # - ALL -
        
    typ, msg_ids = mail.search(None, 'ALL')
    #print('[DEBUG] (mail.search) result:', result)

    number_ALL = len(msg_ids[0])
    print('number ALL :', number_ALL)

    # - diff - 
    
    diff = number_ALL - number_SEEN
    print('       diff:', diff)

    #for num in msg_ids[0].split():
    #    typ, data = mail.fetch(num, '(RFC822)')
    #    print('Message ', num)
    #    #print(data[0][1])

    mail.close()
    
# --- main ---

login = input('Login: ')
password = getpass.getpass()

# --- 

mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
mail.login(login, password)

# - folders -

print('\n--- folders ---\n')
display_folders()

# - native names -

names = detect_names()

print('\n--- native names ---\n')
for key, name in names.items():
    print(f'{key:9} ---> {name}')

# - test - 

print('\n--- test ---\n')

test(names)

# - end -
    
mail.logout()
   

顺便说一句:

模块 IMAPClient 具有此功能

client.find_special_folder(imapclient.imapclient.SENT))