Primer COM di Python Outlook 2007
-
03-07-2019 - |
Domanda
Sono stato ispirato da Modifica dei contatti di Microsoft Outlook da Python - - Sto cercando di provare a scrivere alcuni dei miei fastidiosi usi di Outlook con il pacchetto win32com
. Sono un utente Linux intrappolato in un cubicolo di utenti Windows, quindi non so molto su COM.
Sto cercando informazioni se COM consente la riflessione tramite win32com
o se c'è documentazione sugli oggetti COM di Outlook 2007. Qualsiasi altro suggerimento che ritieni possa essere utile è il benvenuto!
Ho trovato Programmazione di Outlook con Python , ma sto utilizzando Outlook 2007, quindi vorrei ulteriori informazioni su quante informazioni di Outlook 2000 sono ancora applicabili.
TIA!
Soluzione
Per rispondere alla tua domanda sulla documentazione. Ecco due link che visito regolarmente durante lo sviluppo di macro di Outlook. Mentre i siti si concentrano principalmente sullo sviluppo con le tecnologie MS, la maggior parte del codice può essere facilmente tradotta in python una volta capito come usare COM.
- http://msdn.microsoft.com/en-us/library /bb176619.aspx] 1
- http://www.outlookcode.com/
- Gestisci la sicurezza di Outlook http://www.outlookcode.com/article.aspx?ID = 52
- Riscatto http://www.dimastr.com/redemption/
Altri suggerimenti
In generale, i riferimenti precedenti al modello a oggetti sono probabilmente ancora validi, data l'attenzione che Microsoft presta alla retrocompatibilità.
Per sapere se sarai in grado di usare win32com in python per Outlook, sì, dovresti essere in grado di usarlo per effettuare chiamate in ritardo al modello a oggetti di Outlook. Ecco una pagina che descrive come farlo con Excel:
http://oreilly.com/catalog/pythonwin32/chapter/ch12.html
Un problema di cui dovresti essere a conoscenza è il fatto che Outlook ha una finestra di dialogo di sicurezza che viene visualizzata quando programmi esterni tentano di accedere al modello a oggetti ed eseguire operazioni in Outlook. non sarà in grado di sopprimere questa finestra di dialogo.
Se vuoi evitare la finestra di dialogo, è meglio creare macro in VBA per Outlook che vengono caricate in una sessione e mettere i pulsanti su un nuovo CommandBar per eseguirle.
Questa è stata la mia implementazione di un paio di anni fa. L'ho usato per automatizzare la ricezione e l'invio di e-mail. Non sono sicuro che funzionerà con il 2010. Dipende anche dalla redenzione.
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