我在使用 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',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,'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))