如何在Python中使用win32com.client保存Outlook附件?
我正在尝试使用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()
设置工作目录后,就可以在这个位置写入任何文件。