heycooldude
heycooldude

Reputation: 321

Python Outlook: Read Inbox of additional mailbox

I'm using Outlook 2010 - and have my main mailbox: [email protected]

I have also added another mailbox to my profile: mb data proc

Both appear as top level folders within Outlook:

[email protected]
-Inbox
-Sent Items
-Deleted Items

mb data proc
-Inbox
-Sent Items
-Deleted Items

I cannot create a different profile for the additional mailbox. It has been added in the same profile.

How do I get a reference to the Inbox in the "mb data proc" mailbox?

This is the same problem as described here Get reference to additional Inbox but this in VBS.

How to do in python?

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder=outlook.Folders("mb data proc")
msg=folder.Items
msgs=msg.GetLast()
print msgs    

I tried this but I get this error:

       folder=outlook.Folders("mb data proc")
AttributeError: _Folders instance has no __call__ method

Upvotes: 7

Views: 20354

Answers (6)

Mohanty.pyt
Mohanty.pyt

Reputation: 81

I had a similar doubt and as I understand it the solution stated here is for Python 2.7

I will try to make it understandable regarding how to operate it using Python 3.+ versions.

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders.Item("Mailbox Name")
inbox = folder.Folders.Item("Inbox")
msg = inbox.Items
msgs = msg.GetLast()
print (msgs)
print (msgs.Subject)

Since _Folder is not callable, you need to use Folders.Item() method in Python 3+ to reference your mailbox.

Hope that was helpful. Thanks!

Upvotes: 5

hyndavi chinta
hyndavi chinta

Reputation: 21

I was trying to access Additional Mail Boxes and read the Inbox from these Shared folders

import win32com.client

>>> outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders

>>> folder = outlook(1)

>>> inbox = folder.Folders("Inbox")

>>> message = inbox.Items

>>> messages = message.GetLast()

>>> body_content = messages.body

>>> print (body_content)

Upvotes: 2

Mike S
Mike S

Reputation: 21

If your looking for other mailboxes or seperate PST files you have access to in outlook, try using the Store / Stores MAPI objects.

import win32com.client

for stor in win32com.client.Dispatch("Outlook.Application").Session.Stores:
    print( stor.DisplayName) 

PS .Session return the same reference as .GetNamespace("MAPI")

for reference https://learn.microsoft.com/en-us/office/vba/api/overview/outlook

Upvotes: 2

tkd-ee
tkd-ee

Reputation: 31

Here's a simple solution. I think the only part you missed was getting to the "Inbox" folder inside of "mb data proc".

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders("mb data proc")
inbox = folder.Folders("Inbox")
msg = inbox.Items
msgs = msg.GetLast()
print msgs

Upvotes: 3

gscheidl
gscheidl

Reputation: 1

Thank you for you Posts! Here is a function I pulled together based on your Input, to read out the available Folders:

This is my first post, so I hope I copied the code in properly:

def check_shared(namespace,recip = None): 
    """Function takes two arguments:
        .) Names-Space: e.g.: 
            which is set in the following way: outlook = Dispatch("Outlook.Application").GetNamespace("MAPI") and
        .) Recipient of an eventual shared account as string: e.g.: Shared e-Mail adress is "[email protected]"
            --> This is optional --> If not added, the standard-e-Mail is read out"""


    if recip is None:
        for i in range(1,100):                           
            try:
                inbox = namespace.GetDefaultFolder(i)     
                print ("%i %s" % (i,inbox))            
            except:
                #print ("%i does not work"%i)
                continue
    else:
        print('The folders from the following shared account will be printed: '+recip)
        tmpRecipient = outlook.CreateRecipient(recip)
        for i in range(1,100):                           
            try:
                inbox = namespace.GetSharedDefaultFolder(tmpRecipient, i)     
                print ("%i %s" % (i,inbox))            
            except:
                #print ("%i does not work"%i)
                continue
    print("Done")

Upvotes: 0

Dmitry Streblechenko
Dmitry Streblechenko

Reputation: 66316

Firstly, you can use Namespace.GetSharedDefaultFolder method.

Secondly, then line

folder=outlook.Folders("mb data proc")

needs to be

folder=outlook.Folders.Item("mb data proc")

Upvotes: -1

Related Questions