簡體   English   中英

在 for 循環中遍歷字典中的列表

[英]Iterating through a list within dictionary in a for loop

我正在嘗試將來自 outlook 的所有郵件存儲在數據庫中。 為此,我需要遍歷 outlook 中的每個文件夾。為此,我正在使用 win32com.client。 我創建了一個字典,將郵箱的每個名稱作為鍵,將所有文件夾作為具有值的列表。

postbox_and_folders = {} 
folder_of_postbox = [] 
for postbox in postboxes:
    for idx, folder in enumerate(mapi.Folders(postbox).Folders):
        folder_of_postbox.append(str(folder))
        postbox_and_folders[postbox] = folder_of_postbox
        if str(folder) == 'Archive':
            folder_of_postbox = [] 
print(postbox_and_folders)

output 看起來像這樣:

{'@VPC': ['Calendar', 'Contacts', 'Conversation Action Settings', 'Conversation History', 'Deleted Items', 'Drafts', 'Einstellungen für QuickSteps', 'ExternalContacts', 'Files', 'Inbox', 'Journal', 'Junk Email', 'Notes', 'Outbox', 'PersonMetadata', 'Sent Items', 'Social Activity Notifications', 'Sync Issues', 'Tasks', 'Yammer Root', 'Archive'], '@FCC': ['Calendar', 'Contacts', 'Conversation Action Settings', 'Conversation History', ...] which is exactly how it should look.

現在我的目標是 go 通過每個郵箱及其各自的文件夾將郵件正文存儲在數據庫中。

我知道我必須使用 mapi.Folders 但無法使其與這本詞典一起使用。 如何使用這本字典遍歷每個文件夾?

我只需要將字典放在這個function中,我覺得我已經很接近了。

for key, value in postbox_and_folders.items():
messages = mapi.Folders(str(key)).Folders(value[i]).Items
for message in list(messages)[:10]:
    print(message.Body)

您需要遞歸地遍歷所有子文件夾。 例如,C# 中的原始草圖為 Outlook object model 對於所有類型的編程語言都是通用的:

private void EnumerateFoldersInDefaultStore()
{
    Outlook.Folder root =
        Application.Session.
        DefaultStore.GetRootFolder() as Outlook.Folder;
    EnumerateFolders(root);
}

// Uses recursion to enumerate Outlook subfolders.
private void EnumerateFolders(Outlook.Folder folder)
{
    Outlook.Folders childFolders =
        folder.Folders;
    if (childFolders.Count > 0)
    {
        foreach (Outlook.Folder childFolder in childFolders)
        {
            // Write the folder path.
            Debug.WriteLine(childFolder.FolderPath);
            // Call EnumerateFolders using childFolder.
            EnumerateFolders(childFolder);
        }
    }
}             

您可能會發現一個類似的問題,循環 outlook 文件夾和子文件夾線程中的所有電子郵件很有幫助。

如果要存儲文件夾名稱,您也可以(或改為)存儲文件夾條目 ID ( MAPIFolder.EntryID )。 如果您知道文件夾條目 ID,則可以隨時使用Application.Session.GetFolderFromID打開它。

但是請記住,您只處理一個級別的文件夾,並且您確實需要遞歸地處理它們 - 創建一個將MAPIFolder作為參數的 function。 然后 function 可以枚舉子文件夾( MAPIFolder.Folders集合)並為每個子文件夾調用自身。

您錯過了循環遍歷每個郵箱中的文件夾的循環,試試這個,

for key, value in postbox_and_folders.items():
    for i in value:    
        messages = mapi.Folders(str(key)).Folders(value[i]).Items
        for message in list(messages)[:10]:
            print(message.Body)

希望這有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM