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

joh*_*s85 40 python mapi outlook exchange-server cdo.message

我正在尝试编写一个简短的程序,它将读取我的Exchange/Outlook配置文件中的文件夹中的电子邮件内容,以便我可以操作数据.但是我在查找有关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 ()
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
Run Code Online (Sandbox Code Playgroud)

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

session.Logon()
Run Code Online (Sandbox Code Playgroud)

提示,但也没有工作(相同的错误).同时尝试使用Outlook打开和关闭,也没有改变任何东西.

Bob*_*bby 63

我遇到了同样的问题 - 找不到多少工作.但是,以下代码就像魅力一样.

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
Run Code Online (Sandbox Code Playgroud)

  • @sequoia - 使用Microsoft的MailItems的COM属性列表(例如:Outlook消息)是我找到消息的所有属性的方法(例如,message.SenderEmailAddress):http://msdn.microsoft.com/en-us/library /microsoft.office.interop.outlook.mailitem_properties.aspx (8认同)
  • 找到解决方案:`message.CreationTime`由于某种原因,当我使用dir()时,属性不会出现 (6认同)
  • 有没有办法看到其他消息属性?我想用你的例子来获取收到消息的日期和时间. (3认同)
  • “6”指的是收件箱文件夹。其他文件夹呢?如果你新建一个文件夹,你怎么知道它得到的是哪个序列号? (3认同)
  • 可以在https://msdn.microsoft.com/de-de/library/office/ff861868.aspx找到GetDefaultFolder-Params. (2认同)

Mar*_*cik 13

我创建了自己的迭代器,通过python迭代Outlook对象.问题是python尝试从Index [0]开始迭代,但outlook期望第一项Index [1] ...为了使Ruby更简单,下面有一个帮助类Oli,有以下方法:

.items() - 产生一个元组(index,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
Run Code Online (Sandbox Code Playgroud)


Ozz*_*ius 5

对不起,我的英语不好。使用带有MAPI的 Python检查邮件更加容易,

outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders[5]
Subfldr = folder.Folders[5]
messages_REACH = Subfldr.Items
message = messages_REACH.GetFirst()
Run Code Online (Sandbox Code Playgroud)

在这里,我们可以将最早的邮件放入“邮件”框或任何子文件夹中。实际上,我们需要检查邮箱的编号和方向。借助此分析,我们可以检查每个邮箱及其子邮箱文件夹。

同样,请找到以下代码,我们可以在其中找到最新/较早的邮件。我们需要如何检查。

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

这样,我们可以将最新的电子邮件发送到邮箱。根据上面提到的代码,我们可以检查所有邮箱及其子文件夹。