【问题标题】:Win32 not recognising the outlook email in Jupyter notebookWin32 无法识别 Jupyter 笔记本中的 outlook 电子邮件
【发布时间】:2023-01-23 21:09:08
【问题描述】:

试图在 jupyter notebook 中阅读 outlook 电子邮件以创建 ML 算法,但 win32 无法识别我的 outlook 帐户。它昨天工作正常,但不知何故相同的代码今天不工作。

有什么建议吗?

下面附上我的代码。

import win32com #.client
import pyttsx3
#other libraries to be used in this script
import os
from datetime import datetime, timedelta

outlook = win32com.client.Dispatch('outlook.application').GetNamespace("MAPI")
# mapi = outlook.GetNamespace("MAPI")
# mapi
# for account in outlook.Accounts:
#     print(account.DeliveryStore.DisplayName)
# account
# inbox = outlook.GetDefaultFolder(6) 
outlook.Accounts

我得到的结果是

【问题讨论】:

  • 您何时何地运行代码?

标签: python jupyter-notebook outlook pywin32 win32com


【解决方案1】:

以下代码行包含多个方法调用:

outlook = win32com.client.Dispatch('outlook.application').GetNamespace("MAPI")

因此,我建议通过在单独的代码行上声明每个方法调用来拆分它们:

outlook = win32com.client.Dispatch('outlook.application')
nameSpaceObj = outlook.GetNamespace("MAPI")

按照这种方式,您可以找到准确给出错误的方法(如果有的话)。

有时您需要先获取标准文件夹(例如收件箱)以初始化 MAPI 子系统:

inbox = nameSpaceObj.GetDefaultFolder(6)

【讨论】:

  • @eugene_Astafiev,两种方法都试过了,但都没有用。无法获取帐户本身。但它昨天工作正常。现在代码累了:outlook = win32com.client.Dispatch('outlook.application') nameSpaceObj = outlook.GetNamespace("MAPI") inbox = nameSpaceObj.GetDefaultFolder(6) messages = inbox.Items messages
  • 我在本地机器上运行 anaconda jupyter notebook
  • 您是否在后台运行 Outlook?尝试检查机器上正在运行的进程列表。
【解决方案2】:

我遇到了类似的事情in this question

问题似乎是突然间 Collection 对象在应该的时候不可迭代。例如:

import win32com.client
ns = win32com.client.Dispatch('outlook.application').GetNamespace("MAPI")
accs = ns.Accounts

然后:

accs.Count

返回1(我有一个帐户)

但是随后的代码:

for ac in accs:
    print(ac.DisplayName)

给出此错误:

TypeError                                 Traceback (most recent call last)
Cell In [20], line 1
----> 1 for ac in accs:
      2     print(ac.DisplayName)

TypeError: 'Accounts' object is not iterable

如果您不使用生成器,而是按(基于 1 的)索引进行迭代:

accs = ns.Accounts
for n in range(1,accs.Count+1):
    ac = accs.Item(n)
    print(ac.DisplayName)

您会按预期获得帐户列表。

我确实为 win32com 提出了错误报告,但我不确定发生了什么。有趣的是,我没有在 Folders 集合中遇到这个问题,例如

fldrs = ns.Folders
for f in fldrs:
    print(f.Name)

按预期工作。

所以解决方法是使用集合的 Item() 方法使用显式索引。

【讨论】:

    最近更新 更多