Pergunta

Eu fui inspirado por Modificando Microsoft Outlook do Python - - Eu estou olhando para tentar script algumas das minhas mais irritantes usos do Outlook com o pacote win32com. Eu sou um usuário Linux preso em cubículo de usuários do Windows, então eu não sei muito sobre COM.

Eu estou procurando informações sobre se COM permite a reflexão via win32com ou se há documentação sobre os objetos COM Outlook 2007. Quaisquer outras dicas que você acha que vai ser útil são bem-vindos!

Eu encontrei Programação Outlook Com Python , mas eu estou usando o Outlook 2007 para que eu gostaria de ter mais algumas informações sobre como muita da informação Outlook 2000 é ainda aplicável.

TIA!

Foi útil?

Solução

Para responder à sua pergunta sobre a documentação. Aqui estão dois links que visitam regularmente ao desenvolver macros do Outlook. Enquanto os sites estão focados principalmente no desenvolvimento com tecnologias MS maior parte do código pode ser muito facilmente traduzido para python uma vez que você entender como usar COM.

Outras dicas

Em geral, as referências mais antigas para o modelo de objeto são, provavelmente, ainda é válido dada a atenção Microsoft paga para trás-compatibilidade.

Quanto a saber se você vai ou não ser capaz de usar win32com em python para o Outlook, sim, você deve ser capaz de usar isso para fazer chamadas tardia para o modelo de objeto Outlook. Aqui está uma página que descreve como fazê-lo com o Excel:

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

Um problema que você deve estar cientes é o fato de que o Outlook tem um diálogo de segurança que é acionada quando programas externos tentar acessar o modelo de objeto e realizar operações no Outlook. Você é não vai ser capaz de suprimir este diálogo.

Se você quiser evitar o diálogo, você é melhor fora de criação de macros em VBA para Outlook que são carregados em uma sessão, e os botões de colocar em um novo CommandBar para executá-los.

Esta foi a minha implementação de um par de anos atrás. Usei-o para automatizar o recebimento e envio de e-mail. Não tenho certeza se isso vai funcionar com 2010. Depende Redemption também.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top