通过MAPI使用Python从Outlook中阅读电子邮件

我试图编写一个简短的程序,将读取我的Exchange / Outlookconfiguration文件中的文件夹内的电子邮件内容,以便我可以操纵数据。 不过,我有一个问题,find有关Python和Exchange / Outlook集成的很多信息。 很多东西要么很旧/没有文档/没有解释。 我已经尝试了几个片段,但似乎得到相同的错误。 我试过Tim Golden的代码:

import win32com.client session = win32com.client.gencache.EnsureDispatch ("MAPI.Session") # # Leave blank to be prompted for a session, or use # your own profile name if not "Outlook". It is also # possible to pull the default profile from the registry. # session.Logon ("Outlook") messages = session.Inbox.Messages # # Although the inbox_messages collection can be accessed # via getitem-style calls (inbox_messages[1] etc.) this # is the recommended approach from Microsoft since the # Inbox can mutate while you're iterating. # message = messages.GetFirst () while message: print message.Subject message = messages.GetNext () 

但是我得到一个错误:

 pywintypes.com_error: (-2147221005, 'Invalid class string', None, None) 

不知道我的个人资料名称是什么,所以我试着用:

 session.Logon() 

被提示,但没有工作(同样的错误)。 也尝试用Outlook打开和closures,都没有改变任何东西。

我有同样的问题,你没有发现很多工作。 下面的代码就像一个魅力。

 import win32com.client outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) # "6" refers to the index of a folder - in this case, # the inbox. You can change that number to reference # any other folder messages = inbox.Items message = messages.GetLast() body_content = message.body print body_content 

我已经创build了自己的迭代器来通过python遍历Outlook对象。 问题是python尝试从Index [0]开始进行迭代,但是Outlook期望第一个项目Index [1] …为了使Ruby更简单,在下面的辅助类Oli中使用以下方法:

.items() – 产生一个元组(索引,Item)…

.prop() – 帮助反思Outlook对象公开可用的属性(方法和属性)

 from win32com.client import constants from win32com.client.gencache import EnsureDispatch as Dispatch outlook = Dispatch("Outlook.Application") mapi = outlook.GetNamespace("MAPI") class Oli(): def __init__(self, outlook_object): self._obj = outlook_object def items(self): array_size = self._obj.Count for item_index in xrange(1,array_size+1): yield (item_index, self._obj[item_index]) def prop(self): return sorted( self._obj._prop_map_get_.keys() ) for inx, folder in Oli(mapi.Folders).items(): # iterate all Outlook folders (top level) print "-"*70 print folder.Name for inx,subfolder in Oli(folder.Folders).items(): print "(%i)" % inx, subfolder.Name,"=> ", subfolder 

我遇到过同样的问题。 结合从互联网(和以上)的各种方法提出了以下方法(checkEmails.py)

 class CheckMailer: def __init__(self, filename="LOG1.txt", mailbox="Mailbox - Another User Mailbox", folderindex=3): self.f = FileWriter(filename) self.outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders(mailbox) self.inbox = self.outlook.Folders(folderindex) def check(self): #=============================================================================== # for i in xrange(1,100): #Uncomment this section if index 3 does not work for you # try: # self.inbox = self.outlook.Folders(i) # "6" refers to the index of inbox for Default User Mailbox # print "%i %s" % (i,self.inbox) # "3" refers to the index of inbox for Another user's mailbox # except: # print "%i does not work"%i #=============================================================================== self.f.pl(time.strftime("%H:%M:%S")) tot = 0 messages = self.inbox.Items message = messages.GetFirst() while message: self.f.pl (message.Subject) message = messages.GetNext() tot += 1 self.f.pl("Total Messages found: %i" % tot) self.f.pl("-" * 80) self.f.flush() if __name__ == "__main__": mail = CheckMailer() for i in xrange(320): # this is 10.6 hours approximately mail.check() time.sleep(120.00) 

为了一致性,我还包含了FileWriter类的代码(可在FileWrapper.py中find)。 我需要这个,因为试图pipe道UTF8在Windows中的文件无法正常工作。

 class FileWriter(object): ''' convenient file wrapper for writing to files ''' def __init__(self, filename): ''' Constructor ''' self.file = open(filename, "w") def pl(self, a_string): str_uni = a_string.encode('utf-8') self.file.write(str_uni) self.file.write("\n") def flush(self): self.file.flush() 

请享用。

检查Outlook电子邮件更容易,如下所示,

 `outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") folder = outlook.Folders[5] Subfldr = folder.Folders[5] messages_REACH = Subfldr.Items message = messages_REACH.GetFirst()` 

在这里,我们可以将最多的第一封邮件放到邮箱中。

 `outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") folder = outlook.Folders[5] Subfldr = folder.Folders[5] messages_REACH = Subfldr.Items message = messages_REACH.GetLast()` 

有了这个,我们可以将最近的电子邮件收到邮箱中。

旁边我们知道,我们需要调用,其他的细节,如主题,发件人,时间,邮箱邮件计数等。

Interesting Posts