如何在Python中使用win32com.client保存Outlook附件?

12 投票
3 回答
28526 浏览
提问于 2025-04-17 22:16

我正在尝试使用Python中的win32com模块读取电子邮件,并将附件下载到我自己的文件夹里,但我在获取附件对象时遇到了问题:

from win32com.client import Dispatch
import datetime as date

outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder("6")
all_inbox = inbox.Items
val_date = date.date.today()

sub_today = 'Hi'
att_today = 'Attachment.xlsx'
for msg in all_inbox:
    if msg.Subject == sub_today:
        break

for att in msg.Attachments:
    if att.FileName == att_today:
        break

att.SaveAsFile('new.xlsx')
att.ExtractFile('new.xlsx')
open(att)    
att.WriteToFile('x')

最后四行代码都没有效果...

>>> att.ExtractFile('new.xlsx')
raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: <unknown>.ExtractFile

>>> open(att) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: coercing to Unicode: need string or buffer, instance found

>>> att.WriteToFile('x')
 raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: <unknown>.WriteToFile

att.SaveAsFile('new.xlsx') 这行代码没有报错,但在工作目录中没有找到这个文件。看起来这行代码好像被忽略了...

有人能帮忙吗?提前谢谢!

3 个回答

0

如果你只想保存附件,可以把最后三行代码注释掉,然后在倒数第四行写上你想保存的具体文件夹路径,这样就能把文件保存到你指定的位置。

4

你觉得现在的工作目录在哪里呢?我觉得你可能看错文件夹了,SaveAsFile 一般来说是可以正常工作的。

只需要给 SaveAsFile 传一个完整的路径,这样就能解决你的问题了。

13

我来更新一下,我通过在SaveAsFile中同时指定dir和文件名解决了这个问题:

att.SaveAsFile(os.getcwd() + '\\new.xlsx')

这跟我在这里看到的大多数讨论不一样,大家都说只需要把路径放进去。其实,路径和文件名都是必须的。

还有,奇怪的是,你必须在这里放os.getcwd(),因为Python不会识别当前运行的dir。在R语言中,当我们用getwd()设置工作目录后,就可以在这个位置写入任何文件。

撰写回答