سؤال

لقد ألهمتني تعديل جهات اتصال Microsoft Outlook من Python - إنني أتطلع إلى تجربة البرمجة النصية لبعض استخدامات Outlook الأكثر إزعاجًا باستخدام ملف win32com طَرد.أنا من مستخدمي Linux المحصورين في حجرة مستخدمي Windows، لذا لا أعرف الكثير عن COM.

أنا أبحث عن معلومات حول ما إذا كان COM يسمح بالتفكير عبر win32com أو ما إذا كانت هناك وثائق حول كائنات Outlook 2007 COM.نرحب بأي مؤشرات أخرى تعتقد أنها ستكون مفيدة!

لقد وجدت برمجة الآوتلوك باستخدام بايثون, ، ولكني أستخدم 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 التي يتم تحميلها في الجلسة، ووضع الأزرار على CommandBar الجديد لتنفيذها.

وكان هذا التطبيق الخاص بي من قبل بضع سنوات. أنا استخدامها لأتمتة إرسال واستلام البريد الإلكتروني. لست متأكدا إذا كان هذا سوف تعمل مع عام 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