Вопрос

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

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

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

ТИА!

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Это была моя реализация пару лет назад.Я использовал его для автоматизации получения и отправки электронной почты.Не уверен, будет ли это работать с 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top