如何使用Python中的win32com.client保存outlook的附件?

时间:2014-03-14 08:36:40

标签: python email outlook win32com

我试图阅读电子邮件并使用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')

最后4行都不起作用......

>>> 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 :(得分:10)

为了更新,我通过在SaveAsFile中声明dir和文件名本身解决了这个问题:

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

这与我在这里看到的大多数线索不同,你只需要在其中添加路径。实际上,路径和文件名都是必需的。

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

干杯,

答案 1 :(得分:2)

你认为目前的工作目录在哪里?我说你正在查看错误的文件夹,SaveAsFile一般都可以正常工作。

只需将完整路径传递给SaveAsFile即可解决您的问题。

答案 2 :(得分:0)

如果只想保存附件,请注释掉最后3行,并将整个目录写在最后4行以保存在特定位置。