TypeError: '_Folders' object is not callable

被这个错误折腾了 3-4 天终于解决!一波 N 折,权当个故事讲解给大家听
事情起因:接到一个 需求是对 outlook 的正文图片提取操作,然后发送出去。基本操作代码如下
TypeError: '_Folders' object is not callable

day1:Win32com 操作 outlook,无法操作,重启电脑,然后突然发现可以操作,那就开发需求。
day2:新打开电脑后发现有无法操作电脑,而且一直提醒 com_error:(-2146959355,‘服务器运行失败’,None,None)。然后这时一直重启都解决不了,然后试了各种瞎操作,其中就有一步是导致产生上面这个报错提示.
Win32com 调用接口是常用 win32com.client.Dispatch(),但我其中尝试了用 win32com.client.EnsureCacheDispatch(),这个代码埋下炸弹
当天晚上解决了 com_error:(-2146959355,‘服务器运行失败’,None,None) 的问题:权限问题。1、outlook 要么不打开;2 如果打开 outlook,则要和 设计器保持一样 的权限,比如说管理员权限。
方法连接:https://blog.csdn.net/u010046615/article/details/111172749
重新运行代码时,发现了 TypeError: ‘_Folders’ object is not callable 的报错,明明代码没变,怎么产生了这个报错。度娘、谷歌都找到了一个方法,那个答主说他很幸运可以解决,但我试了他的 方法并不能解决。又陷入无解之地,问同事,相同的代码他们运行又正常,我用 outlook 组件也没问题 ,但是代码就是有问题。
day3:这时开始重装 office、outlook 各个版本 2010、2016、2019;更新 Python 支持环境 (最后把我的 pycharm 和支持环境全删了 😭)结果还是一样;
另外在我单独打印对象时,这个对象是存在的提示如下:
Outlook Object Library._Folders Object Library.MAPIFolders win32
Outlook Object Library.Folders Object Library.Folder
搜了下,好像是新旧版 outlook 的关系,导致有 Folders 和 MAPIFolders
最后在一个答主的答案里面找到一些提示,曲线救国,可以读取到收件箱,并执行对应操作,但治标不治本
原代码:inbox = outlook.Folders(“想使用的邮箱账户”).Folders(“收件箱”)
新代码:inbox = outlook.Folders.Items(“想使用的邮箱账户”).Folders.Items(“收件箱”)
答主提示链接:https://stackoverflow.com/questions/59951685/win32-error-object-has-no-attribute-folders
day4:也就是今天(不对,应该是昨天,因为现在是凌晨了),这是怀疑是 Windows 系统问题,但我只有一台电脑,而且很多资料,重装系统不现实,而且周围没借到电脑。然后下午,我做了一件很破费的事:我闲鱼同城买了一台小米 air13 的电脑(其实是顺带换电脑,以前太重,上班背来背去不方便,没换是因为 Python 很多环境要重装很麻烦。现在,也就是上文说的删的 7788 了,那就干脆换了)
跑题了,新电脑拿来、装新系统、装好 outlook、装好设计器!F5 运行!噔噔蹬蹬!还是一样的报错:TypeError: ‘_Folders’ object is not callable 我哭了,钱白花了! 😭
接着又是重装 outlook,发现问题没解决;然后发现 2013 和 2019 版本数据分别是 pst 和 ost,我就在好奇会不会是邮箱协议的问题。百度过后,发现 outlook、office365、exchange 和 POP、IMAP 协议的数据不同,感觉发现了新大陆。一顿操作,发现数据无法从 ost 指向到 pst,gg!
and then 就开始翻 VBA 接口讲解,这里 VBA 知道对大家以后操作微软软件很有帮助,特别是 office。建议大家收藏好这个网站,一般人我不告诉他 !https://docs.microsoft.com/zh-cn/office/vba/api/
紧接着试着调用 outlook 的其他方法,而不是 Folders,调用 Account,发现了报错:com_error<win32com.gen_py.none.Accounts>
我想了下是不是没获取对象成功?就拿着这个提示去搜答案,最后在试了这个答主的方法,链接:https://blog.csdn.net/ericatardicaca/article/details/90721909
最后运行,发现可以!不容易啊!最后看了下答主的代码,他也是用了 win32com.client.EnsureCacheDispatch() 去调 win32,这串代码的意思是将数据写到内存中,会产生一个内存文件夹 ,里面包含了 win32com 的方法,其中 Folders.py 里面的代码,Folders 变成了 _Folders。然后删了 C:\Users\Erica\AppData\Local\Temp\gen_py\3.7\ 下面的所以文件,将
win32com.client.EnsureCacheDispatch()改为 win32com.client.Dispatch(),缓存文件夹也没有生产内存文件了,代码也顺畅了。
现在是凌晨 2 点,码字不易,希望大伙多多点赞支持!谢谢 !