Reputation: 37
I now know I can specify emails from which Outlook folders to save to my local drive using the following code:
inbox = outlook.GetDefaultFolder(6).Folder("Inbox").Folder("folder name").Folder("sub-folder name")
Additional query: Is it possible to specify to save emails from ALL Outlook folder to my local drive?
from win32com.client import Dispatch
import os
import re
os.chdir("c:/Users/username/Desktop/Emails")
def save_emails():
for message in inbox.Items:
if message.Class == 43:
name = str(message.Subject)
# to eliminate any special characters in the name
name = re.sub('[^A-Za-z0-9]+', '', name) + '.msg'
# to save in the current working directory
message.SaveAs(os.getcwd() + '//' + name)
if __name__ == '__main__':
outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
save_emails()
Upvotes: 1
Views: 815
Reputation: 12495
Try to loop on all folders and subfolders
Example
from win32com.client import Dispatch
import os
import re
def outlook_folder(parent_folder):
print(parent_folder.Name)
if parent_folder.Items.Count > 0:
items = parent_folder.Items
print(items.Count)
for i in reversed(range(items.Count)):
if items[i].Class == 43:
print(items[i])
save_name = re.sub('[^A-Za-z0-9]+', " ", items[i].Subject) + ".msg"
items[i].SaveAs(os.getcwd() + '//' + save_name)
if parent_folder.Folders.Count > 0:
for folder in parent_folder.Folders:
outlook_folder(folder)
if __name__ == '__main__':
outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
outlook_folder(inbox)
Upvotes: 1
Reputation: 49455
Yes, it is possible to save all items from all folders. You can iterate over all folder recursively in the code and repeat the same actions with each folder. Here is C# example how you could do that (the Outlook object model is common for all kind of programming languages):
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);
}
}
}
See Enumerate folders for more information.
Upvotes: 0