Python Outlook 2007 COM учебник для начинающих - PullRequest
8 голосов
/ 03 января 2009

Меня вдохновило Изменение контактов Microsoft Outlook из Python - Я пытаюсь написать сценарий для некоторых из моих более раздражающих приложений Outlook с пакетом win32com. Я пользователь Linux, запертый в кабинете пользователей Windows, поэтому я не очень разбираюсь в COM.

Я ищу информацию о том, допускает ли COM отражение через win32com или есть ли документация по COM-объектам Outlook 2007. Любые другие указатели, которые вы считаете полезными, приветствуются!

Я нашел Программирование Outlook с Python , но я использую Outlook 2007, поэтому мне хотелось бы получить дополнительную информацию о том, какая часть информации Outlook 2000 по-прежнему применима.

ТИА!

Ответы [ 3 ]

6 голосов
/ 03 января 2009

В целом, более старые ссылки на объектную модель, вероятно, все еще действительны, учитывая внимание, которое Microsoft уделяет обратной совместимости.

Что касается того, сможете ли вы использовать win32com в python для Outlook, то да, вы должны использовать его для вызовов с поздней привязкой к объектной модели Outlook. Вот страница, которая описывает, как это сделать с помощью Excel:

http://oreilly.com/catalog/pythonwin32/chapter/ch12.html

Проблема, о которой вам следует знать, - это тот факт, что Outlook имеет диалоговое окно безопасности, которое открывается, когда внешние программы пытаются получить доступ к объектной модели и выполнять операции в Outlook. Вы не сможете отключить этот диалог.

Если вы хотите избежать диалога, вам лучше создавать макросы в VBA для Outlook, которые загружаются в сеансе, и помещать кнопки на новый CommandBar для их выполнения.

6 голосов
/ 03 января 2009

Чтобы ответить на ваш вопрос о документации. Вот две ссылки, которые я регулярно посещаю при разработке макросов Outlook. Хотя сайты в основном ориентированы на разработку с использованием технологий MS, большая часть кода может быть довольно легко переведена на python, если вы поймете, как использовать COM.

1 голос
/ 22 марта 2012

Это была моя реализация пару лет назад. Я использовал его для автоматизации получения и отправки электронной почты. Не уверен, что это будет работать с 2010 года. Это также зависит от выкупа.

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
...