2010-01-11 5 views
3

En python avec Outlook 2007, en utilisant win32com et/ou répertoire_actif, comment puis-je obtenir une référence à un sous-dossier afin de pouvoir déplacer un MailItem dans ce sous-dossier?En utilisant win32com et/ou répertoire_actif, comment puis-je accéder à un dossier de courrier électronique par son nom?

J'ai une structure de boîte de réception comme:

 
    Inbox 
     | 
     +-- test 
     | 
     `-- todo 

Je peux accéder au dossier de boîte de réception comme:

import win32com.client 
import active_directory 
session = win32com.client.gencache.EnsureDispatch("MAPI.session") 
win32com.client.gencache.EnsureDispatch("Outlook.Application") 
outlook = win32com.client.Dispatch("Outlook.Application") 
mapi = outlook.GetNamespace('MAPI') 
inbox = mapi.GetDefaultFolder(win32com.client.constants.olFolderInbox) 
print '\n'.join(dir(inbox)) 

Mais lorsque je tente d'obtenir sous-répertoire test par Microsoft's example l'objet inbox n'a pas la Folders interface ou n'importe quel moyen d'obtenir un sous-répertoire.

Comment puis-je obtenir un objet Folder qui pointe vers test sous-répertoire?

Répondre

1

Cela fonctionne pour moi de déplacer un élément de courrier dans un sous-répertoire « test » (simplifié en se débarrassant des gencache choses):

import win32com.client 

olFolderInbox = 6 
olMailItem = 0 

outlook = win32com.client.Dispatch("Outlook.Application") 
mapi = outlook.GetNamespace('MAPI') 
inbox = mapi.GetDefaultFolder(olFolderInbox) 

item = outlook.CreateItem(olMailItem) 
item.Subject = "test" 

test_folder = inbox.Folders("test") 
item.Move(test_folder) 
+0

Cet appel ne fonctionne pas pour moi 'inbox.Folders ('test')'. Cependant, j'ai trouvé que je pouvais itérer sur 'inbox.Folders' et tester contre' a_folder.Name' –

+0

En outre, vous pouvez trouver toutes ces constantes de perspectives dans le win32com - 'win32com.client.constants.olFolderInbox' –

1

Quelque chose qui a travaillé pour moi était itérer sur les noms de dossier. (Quand j'ai posté cette question, je ne pouvais pas comprendre les noms de dossiers).

import win32com.client 
import active_directory 
session = win32com.client.gencache.EnsureDispatch("MAPI.session") 
win32com.client.gencache.EnsureDispatch("Outlook.Application") 
outlook = win32com.client.Dispatch("Outlook.Application") 
mapi = outlook.GetNamespace('MAPI') 
inbox = mapi.GetDefaultFolder(win32com.client.constants.olFolderInbox) 

fldr_iterator = inbox.Folders 
desired_folder = None 
while 1: 
    f = fldr_iterator.GetNext() 
    if not f: break 
    if f.Name == 'test': 
     print 'found "test" dir' 
     desired_folder = f 
     break 

print desired_folder.Name 
3

Je sais que c'est une vieille question, mais je me sers du paquet win32com récemment et a trouvé la documentation gênant pour le moins ... Mon espoir est que quelqu'un, un jour peut être sauvé la tourmente que j'ai vécu essayer de comprendre les explications de MSDN

Voici un exemple de script python à parcourir dans des dossiers Outlook, en accédant à des e-mails là où je le souhaite.

Responsabilité je suis passé autour du code et a pris certaines informations sensibles si vous essayez de copier-coller et le faire tourner, bonne chance.

import win32com 
import win32com.client 
import string 
import os 
# the findFolder function takes the folder you're looking for as folderName, 
# and tries to find it with the MAPIFolder object searchIn 

def findFolder(folderName,searchIn): 
try: 
    lowerAccount = searchIn.Folders 
    for x in lowerAccount: 
     if x.Name == folderName: 
      print 'found it %s'%x.Name 
      objective = x 
      return objective 
    return None 
except Exception as error: 
    print "Looks like we had an issue accessing the searchIn object" 
    print (error) 
    return None 

def main(): 

outlook=win32com.client.Dispatch("Outlook.Application") 

ons = outlook.GetNamespace("MAPI") 

#this is the initial object you're accessing, IE if you want to access 
#the account the Inbox belongs too 
one = '<your account name here>@<your domain>.com' 

#Retrieves a MAPIFolder object for your account 
#Object functions and properties defined by MSDN at 
#https://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.mapifolder_members(v=office.14).aspx 
Folder1 = findFolder(one,ons) 

#Now pass you're MAPIFolder object to the same function along with the folder you're searching for 
Folder2 = findFolder('Inbox',Folder1) 

#Rinse and repeat until you have an object for the folder you're interested in 
Folder3 = findFolder(<your inbox subfolder>,Folder2) 

#This call returns a list of mailItem objects refering to all of the mailitems(messages) in the specified MAPIFolder 
messages = Folder3.Items 

#Iterate through the messages contained within our subfolder 
for xx in messages: 
    try: 
     #Treat xx as a singular object, you can print the body, sender, cc's and pretty much every aspect of an e-mail 
     #In my case I was writing the body to .txt files to parse... 
     print xx.Subject,xx.Sender,xx.Body 
     #Using move you can move e-mails around programatically, make sure to pass it a 
     #MAPIFolder object as the destination, use findFolder() to get the object 
     xx.Move(Folder3) 


    except Exception as err: 
     print "Error accessing mailItem" 
     print err  


if __name__ == "__main__": 
main() 

PS J'espère que cela ne fait pas plus de mal que de bien.

+0

Merci Tony. Ouais. J'ai trouvé que travailler avec ça était douloureux aussi. –

Questions connexes