التمهيدي لـ Python Outlook 2007 COM
-
03-07-2019 - |
سؤال
لقد ألهمتني تعديل جهات اتصال 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