76

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.

Franck Dernoncourt
  • 77,520
  • 72
  • 342
  • 501
Phoenix
  • 4,386
  • 10
  • 40
  • 55
  • 4
    I have three outlook profiles setup on my machine. How do I choose which profile to choose in python? – user5155835 Nov 16 '17 at 08:11
  • 1
    Sorry, limited for time. I presume you need to replace GetDefaultFolder with a pointer to another profile. I reckon you will not be too far away exploring the following link and drop-down options. https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/namespace-object-outlook. Best of luck. – Phoenix Nov 16 '17 at 12:04
  • 1
    Thank you. Yes, I need to point to another profile. I saw the link that you provided but did not get any related information. Please let me know if you find information regarding this. – user5155835 Nov 16 '17 at 15:00
  • `message.SenderEmailAddress` – evandrix Feb 27 '20 at 21:57
  • how to filter records using subject – Jayank Mar 26 '21 at 11:12

5 Answers5

37

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
Genome
  • 1,106
  • 8
  • 10
35

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.

Community
  • 1
  • 1
pajonk
  • 499
  • 11
  • 18
  • 2
    To get this to work properly you may need to modify the import statement to read: import win32com.client. Initially this solution didn't work properly on Python 3.6. Tweaking it with the addition of .cleint resolved the issue. – Ken Carter Mar 02 '20 at 16:13
7

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.

John Cook
  • 71
  • 1
  • 3
3

For attachments https://learn.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
Mika72
  • 413
  • 2
  • 12
0

This page is definitely the most complete resource for pywin32!

Just one to add on:

 message.senton.date() # for received date only 
 message.senton.time() # for received time only
 message.senton # for date and time

Also, just found out the case of the message properties like senton, attachment and all other properties shown in 'Interop Outlook Mailitem Properties' shared by Genome above can be write as fully lowercase or fully uppercase or mix.

KahEm Chu
  • 1
  • 1