【问题标题】:Reading Outlook emails from another address with win32com [using python]使用 win32com [使用 python] 从另一个地址读取 Outlook 电子邮件
【发布时间】:2023-01-26 03:47:04
【问题描述】:

我正在尝试使用 win32com 从 outlook 地址读取电子邮件,但我只能从本地 outlook 地址访问这些项目。您知道如何为另一个地址输入所需的凭据吗? 在我的 Dispatch() 方法中接受用户名参数但没有密码。

这是我的方法:

import win32com.client
        outlook = win32com.client.Dispatch("Outlook.Application", userName='marius.anton@cgi.com').GetNamespace("MAPI")
        for account in outlook.Session.Accounts:
        print (account.DisplayName) # robert.farcas@cgi.com
        print (account.SmtpAddress)
                print (account.UserName)
                print(account.DeliveryStore.DisplayName)
                dir(win32com.client.Dispatch)
                help(win32com.client.Dispatch)
                print(outlook.Session.Accounts.GetIDsOfNames)

我从控制台输出:

先感谢您!

【问题讨论】:

    标签: python outlook win32com office-automation


    【解决方案1】:

    能够使用将用户登录到 MAPI 的 NameSpace.Logon 方法,获取 MAPI 会话。当 Outlook 尚未运行时,仅使用 Logon 方法登录到特定的配置文件。这是因为一次只能运行一个 Outlook 进程,并且该 Outlook 进程仅使用一个配置文件并且仅支持一个 MAPI 会话。当用户第二次启动 Outlook 时,该 Outlook 实例在同一 Outlook 进程中运行,不会创建新进程,并使用相同的配置文件。

    您还可能会发现 NameSpace.GetGlobalAddressList 方法很有帮助,它返回一个代表 Exchange 全局地址列表的 AddressList 对象。 GetGlobalAddressList 仅支持 Exchange 服务器。如果全局地址列表不可用或找不到,它会返回错误。

    您可以使用 NameSpace.Stores 属性,它返回一个 Stores 集合对象,代表当前配置文件中的所有 Store 对象。配置文件定义一个或多个电子邮件帐户,每个电子邮件帐户都与特定类型的服务器相关联。对于 Exchange 服务器,存储可以位于服务器上、Exchange 公用文件夹中或本地个人文件夹文件 (.pst) 或脱机文件夹文件 (.ost) 中。对于 POP3、IMAP 或 HTTP 电子邮件服务器,存储是一个 .pst 文件。使用 StoresStore 对象枚举当前会话中所有商店的所有文件夹和搜索文件夹。

    如果您需要获取未在 Outlook 中配置但共享的帐户。 NameSpace.GetSharedDefaultFolder 方法返回一个 Folder 对象,代表指定用户的指定默认文件夹。此方法用于委托方案,其中一个用户已将访问权限委托给另一个用户一个或多个默认文件夹(例如,他们共享的Calendar 文件夹)。

    【讨论】:

    • 尝试使用Logon。但是没有得到预期的结果。我缺少什么。在这里附上代码。 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") out = outlook.Logon("autoenquirytest@robo.com",'', True, True) wich_accnt = out.Folders #try the restrict method! for i in wich_accnt: print(i.Name)
    • 看来您已经用另一个问题更改了原始帖子。我建议在新线程中发布新问题,以便用户可以轻松识别问题和答案。
    【解决方案2】:

    如果您有权打开其他用户的邮箱/文件夹,您可以使用Namespace.GetSharedDefaultFolder(Recipient, olFolderInbox)(其中可以使用Namespace.CreateRecipient创建Recipient对象)。

    如果您需要整个邮箱,而不仅仅是默认文件夹之一,则应自动将邮箱添加到当前配置文件中的存储列表(Outlook 会根据自动发现 XML 中的信息自动添加当前用户可用的可访问委托存储) 或在 Exchange 帐户设置对话框中手动(高级 | 打开这些附加邮箱)。在这种情况下,Namespace.Stores 集合将包含当前会话中可见的所有邮箱,您将能够访问以 Store.GetRootFolder() 开头的所有文件夹。如果商店不在列表中,您可以尝试使用Redemption(我是它的作者)——它公开了RDOSession.GetSharedMailbox方法。

    【讨论】: