Question or problem about Python programming:
I’m trying to understand outlook interaction through win32com better. I’ve been unable to find clear documentation that allows me to utilise win32com to read emails effectively, from my current investigation it seems like a fairly regular sentiment by users. Thus comes the following information and request:
Could someone;
1. Give a link to the location of clear documentation (if it exists)
2. Expand on the below
Below is the current functionality I’ve found based on reading other peoples code.
Take the below code:
import win32com outlook=win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox=outlook.GetDefaultFolder(6) messages=inbox.Items for message in messages: attachments = message.attachments for attachment in attachments: pass
The objects used above have the following functionality that I’m aware of:
inbox –
.Folders .Items
messages –
.GetFirst() .GetLast() .GetNext() .GetPrevious() .Attachments
message –
.Subject .Body .To .Recipients .Sender .Sender.Address
attachments –
.item() .Count
attachment –
.filename
If you know of any more functionality then please add to this in your answers.
How to solve the problem:
Solution 1:
The visual basic for applications reference is your friend here. Try starting with this link…
Interop Outlook Mailitem Properties
For instance I can see that message will probably have additional properties than what you listed above. For example.
- message.CC
- message.Importance
- message.LastModificationTime
Solution 2:
For everyone wondering how to reach any default folder not just “Inbox” here’s the list:
3 Deleted Items 4 Outbox 5 Sent Items 6 Inbox 9 Calendar 10 Contacts 11 Journal 12 Notes 13 Tasks 14 Drafts
There are more (Reminders, Sync errors etc.); you can get whole list with this code (inspired by John Cook’s solution to Folders):
import win32com outlook=win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") for i in range(50): try: box = outlook.GetDefaultFolder(i) name = box.Name print(i, name) except: pass
I’m not pasting the whole list here, because mine is in Polish and wouldn’t be really helpful.
Solution 3:
I thought I’d add something on navigating through folders too – this is all derived from the Microsoft documentation above, but might be helpful to have here, particularly if you’re trying to go anywhere in the Outlook folder structure except the inbox.
You can navigate through the folders collection using folders
– note in this case, there’s no GetDefaultFolder
after the GetNamespace
(otherwise you’ll likely end up with the inbox).
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace('MAPI') folder = outlook.Folders[1]
The number is the index of the folder you want to access. To find out how many sub-folders are in there:
folder.Count
If there more sub-folders you can use another Folders
to go deeper:
folder.Folders[2]
Folders
returns a list of sub-folders, so to get the names of all the folders in the current directory, you can use a quick loop.
for i in range(folder.Count): print (folder[i].Name)
Each of the sub-folders has a .Items
method to get a list of the emails.
Solution 4:
You can see all live Outlook objects and their data in OutlookSpy.
MailItem
object properties, methods and events are fully documented at https://msdn.microsoft.com/en-us/library/office/ff861332.aspx
Solution 5:
For attachments
https://docs.microsoft.com/en-us/office/vba/api/outlook.attachment
(see Properities)
attachment.FileName attachment.Type attachment.Position attachment.BlockLevel attachment.Class attachment.DisplayName attachment.Parent attachment.Session attachment.Size attachment.Index attachment.Application