当前位置: 代码迷 >> python >> 如何在 Python 中使用 win32com.client 保存 Outlook 中的附件?
  详细解决方案

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

热度:69   发布时间:2023-07-14 09:53:13.0

我正在尝试使用 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')没有错误,但是工作目录中没有这样的文件。 似乎这条线被忽略了......

有人可以帮忙吗? 提前致谢!

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

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

它不像我在这里看到的大多数线程说你只需要在其中放置路径。 实际上,路径和文件名都需要。

此外,奇怪的是,您必须将os.getcwd()放在这里,因为 Python 无法识别当前正在运行的dir - 在 R 中,在我们使用getwd()设置工作dir后,我们可以写入该位置的任何文件。

认为当前的工作目录在哪里? 我会说你看错了文件夹, SaveAsFile通常工作得很好。

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

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

  相关解决方案