Apprêt COM Python Outlook 2007
-
03-07-2019 - |
Question
J'ai été inspiré par la Modification des contacts Microsoft Outlook à partir de Python - - Je cherche à essayer de scripter certaines de mes utilisations les plus gênantes d'Outlook avec le paquet win32com
. Je suis un utilisateur Linux pris au piège dans la cabine d'un utilisateur Windows, donc je ne connais pas grand chose à propos de COM.
Je souhaite savoir si COM permet une réflexion via win32com
ou s'il existe une documentation sur les objets COM Outlook 2007. Toute autre information que vous jugerez utile sera la bienvenue!
J'ai trouvé la programmation Outlook avec Python , mais j'utilise Outlook 2007, j'aimerais donc avoir plus d'informations sur la quantité d'informations Outlook 2000 encore applicable.
TIA!
La solution
Pour répondre à votre question sur la documentation. Voici deux liens que je visite régulièrement lors du développement de macros Outlook. Alors que les sites sont principalement axés sur le développement avec les technologies MS, la plupart du code peut être facilement traduit en python une fois que vous avez compris comment utiliser COM.
Autres conseils
En général, les références plus anciennes au modèle d'objet sont probablement toujours valables, compte tenu de l'attention que Microsoft accorde à la compatibilité avec les versions antérieures.
En ce qui concerne l'utilisation ou non de win32com dans python pour Outlook, vous devriez pouvoir l'utiliser pour effectuer des appels tardifs au modèle d'objet Outlook. Voici une page qui explique comment procéder avec Excel:
http://oreilly.com/catalog/pythonwin32/chapter/ch12.html
Vous devez être conscient du fait que Outlook a un dialogue de sécurité qui s’ouvre lorsque des programmes externes tentent d’accéder au modèle objet et d’effectuer des opérations dans Outlook. Vous ne ne pourrez pas supprimer ce dialogue.
Si vous souhaitez éviter la boîte de dialogue, il est préférable de créer des macros dans VBA pour Outlook chargées dans une session et de placer des boutons sur une nouvelle barre de commande pour les exécuter.
C’était ma mise en œuvre d’il ya deux ans. Je l'ai utilisé pour automatiser la réception et l'envoi de courrier électronique. Je ne sais pas si cela fonctionnera avec 2010. Cela dépend également de la rédemption.
import win32com.client,os,re
from utils.autoencode import autoencode
generated='2D5E2D34-BED5-4B9F-9793-A31E26E6806Ex0x4x7.py'
mapi_utils=win32com.client.Dispatch('Redemption.MAPIUtils')
olFolderDeletedItems=3
olFolderOutbox=4
olFolderSentItems=5
olFolderInbox=6
olFolderCalendar=9
olFolderContacts=10
olFolderJournal=11
olFolderNotes=12
olFolderTasks=13
class Attachment:
def __init__(self,CreationTime,attachement):
self.CreationTime=CreationTime
self.attachement=attachement
self.FileName=attachement.FileName
self.FileSize=attachement.FileSize
self.text=self.attachement.AsText
def Save(self,folder,filename=None,group=True):
if group:
folderGroup=re.sub('\\W','',str(self.CreationTime))
subfolder=os.path.join(folder,folderGroup)
if not os.path.isdir(subfolder):
os.mkdir(subfolder)
else:
folderGroup=''
if filename:
path=os.path.join(folder,folderGroup,filename)
else:
path=os.path.join(folder,folderGroup,self.FileName)
if os.path.isdir(folder):
self.attachement.SaveAsFile(path.replace('/','\\'))
return path
class Attachments:
def __init__(self,CreationTime,Attachments):
self.CreationTime=CreationTime
self.Attachments=Attachments
def __iter__(self):
return self.next()
def next(self):
for idx in range(self.Attachments.Count):
idx+=1
yield Attachment(self.CreationTime,self.Attachments.Item(idx))
class Message:
def __init__(self,store,folder,msg):
self.store=store
self.folder=folder
self.msg=msg
self.Attachments=Attachments(self.msg.CreationTime,msg.Attachments)
self.body=msg.Body
self.body_format=msg.BodyFormat
self.html=msg.HTMLBody
self.subject=msg.Subject
self.unread=msg.UnRead
self.id=msg.EntryID
def __str__(self):
return str('%s-%s-%s'%(self.store.Name,self.folder, self.msg))
def read(self,bool=True):
status=bool==False
self.msg.UnRead=status
class Inbox:
def __init__(self,session,store,folder,wantedFolder=None):
self.session=session
self.store=store
self.folder=folder
self.wantedFolder=wantedFolder
self.Name=folder.Name
def __getitem__(self,name):
self.wantedFolder=name
return self.next()
def __str__(self):
return '%s-%s'%(self.store.Name,self.Name)
def __iter__(self):
return self.next()
def subFolder(self,name):
self.wantedFolder=name
return self.next()
def next(self):
if self.wantedFolder:
subFolders=self.folder.Folders
for idx in range(subFolders.Count):
idx+=1
subfolder=subFolders.Item(idx)
if subfolder.Name==self.wantedFolder:
for msg in subfolder.Items:
yield Message(self.store,self.folder,msg)
else:
for msg in self.folder.Items:
yield Message(self.store,self.folder,msg)
class Store:
def __init__(self,session,store):
self.session=session
self.store=store
self.Name=store.Name
self.Inbox=Inbox(self.session,self.store,self.session.GetDefaultFolder(olFolderInbox))
def __str__(self):
return self.Name
def __iter__(self):
return self.next()
def next(self,folder=None):
pass
class rdo:
def __init__(self):
'''Outlook Redemption RDO wrapper'''
self.session = win32com.client.gencache.EnsureDispatch("Redemption.RDOSession")
self.session.Logon()
self.stores={}
for store in self.session.Stores:
self.stores[store.Name]=Store(self.session,store)
self.default_store=self.session.Stores.DefaultStore.Name
def __getitem__(self,name):
if self.stores.has_key(name):
return self.stores[name]
def __iter__(self):
return self.next()
def next(self):
stores=self.stores.keys()
yield self.stores[stores.pop(stores.index(self.default_store))]
for store in stores:
yield self.stores[store]
def getStore(self,name):
if self.stores.has_key(name):
return self.stores[name]
else:
return False
def getSharedMailbox(self,name):
try:
return Store(self.session,self.session.GetSharedMailbox(name))
except Exception,e:
if 'Could not resolve in GAL' in e.args[2][2]:
raise Exception('Mailbox could not be found')
else:
raise Exception ('Unknown error: %s'%e.args[2][2])
if __name__=='__main__':
r=rdo()
inbox = r.getStore('Mailbox - Foo').Inbox
for msg in inbox.subFolder('test'):
print msg.subject,msg.id