7

私はPython から Microsoft Outlook の連絡先を変更する に触発されました-- 私は、このwin32comパッケージを使って Outlook のもっと厄介な使い方をいくつかスクリプト化してみようと思っています。私は Windows ユーザーのキュービクルに閉じ込められた Linux ユーザーなので、COM についてはあまり知りません。

win32comCOM でリフレクションが許可されているかどうか、または Outlook 2007 COM オブジェクトに関するドキュメントがあるかどうかについての情報を探しています。あなたが役立つと思う他の指針は大歓迎です!

Programming Outlook With Pythonを見つけましたが、私は Outlook 2007 を使用しているため、Outlook 2000 の情報がどれだけ適用可能かについて、さらに詳しい情報が必要です。

ティア!

4

3 に答える 3

6

To answer your question about documentation. Here are two links that I regularly visit when developing Outlook macros. While the sites are primarily focused on development with MS technologies most of the code can be pretty easily translated to python once you understand how to use COM.

于 2009-01-02T21:26:31.173 に答える
6

一般に、オブジェクト モデルへの古い参照は、Microsoft が下位互換性に注意を払っていることを考えると、おそらくまだ有効です。

Outlook の Python で win32com を使用できるかどうかについては、はい、それを使用して、Outlook オブジェクト モデルへのレイト バインド呼び出しを行うことができるはずです。Excel での操作方法を説明しているページは次のとおりです。

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

注意すべき問題は、Outlook には、外部プログラムがオブジェクト モデルにアクセスして Outlook で操作を実行しようとするとスローされるセキュリティ ダイアログがあるという事実です。このダイアログを抑制することはできません。

ダイアログを回避したい場合は、VBA for Outlook でマクロを作成してセッションにロードし、新しい CommandBar にボタンを配置して実行することをお勧めします。

于 2009-01-02T21:50:56.210 に答える
1

これは、数年前からの私の実装です。これを使用して、電子メールの送受信を自動化しました。これが 2010 で機能するかどうかは不明です。Redemption にも依存します。

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
于 2012-03-22T04:52:47.243 に答える