尝试通过pythonCOM保存Outlook附件
我正在查看我的Outlook邮件,想把所有的附件提取出来并保存在我的电脑上。
这是我的代码:
import win32com.client
import os, sys
class OutlookLib:
def __init__(self, settings={}):
self.settings = settings
# Gets all messages in outlook
def get_messages(self):
outlook = win32com.client.Dispatch("Outlook.Application")
# This allows us to access the "folder" hierarchy accessible within
# Outlook. You can see this hierarchy yourself by opening Outlook
# manually and bringing up the folder menu
# (which typically says "Inbox" or "Outlook Today" or something).
ns = outlook.GetNamespace("MAPI")
all_inbox = ns.GetDefaultFolder(6).Items
return all_inbox
def get_body(self, msg):
return msg.Body
def get_subject(self, msg):
return msg.Subject
def get_sender(self, msg):
return msg.SenderName
def get_recipient(self, msg):
return msg.To
def get_attachments(self, msg):
return msg.Attachments
# Gets an attachment
# Return true if clean
# Otherwise, return false
def checkAttach(fileAtt):
pass # TODO something here
def Main():
global attach
outlook = OutlookLib()
messages = outlook.get_messages()
# Loop all messages
msg = messages.GetFirst()
while msg:
#print msg.Subject
if not len(msg.Attachments) is 0:
attach.append((msg.Attachments, msg.Subject))
msg = messages.GetNext()
for attachTuple in attach:
print "Checking attachments under " + attachTuple[1]
for fileAtt in attachTuple[0]:
fileAtt.SaveAsFile(r"C:\Users\Lidor\Desktop\Dina\scan-mail")
if checkAttach(fileAtt):
print fileAtt.FileName + " was found as malicous."
attach = []
if __name__ == "__main__":
Main()
现在我遇到了这个错误:
Traceback (most recent call last):
File "C:\Users\Lidor\Desktop\Dina\scan-mail\mailScanner.py", line 67, in <module>
Main()
File "C:\Users\Lidor\Desktop\Dina\scan-mail\mailScanner.py", line 60, in Main
fileAtt.SaveAsFile(r"C:\Users\Lidor\Desktop")
File "<COMObject <unknown>>", line 2, in SaveAsFile
com_error: (-2147352567, 'Exception occurred.', (4096, u'Microsoft Outlook', u"Cannot save the attachment. You don't have appropriate permission to perform this operation.", None, 0, -2147024891), None)
这让我感到奇怪,因为我是管理员,并且我对pst文件和输出文件夹都有权限。我还尝试在管理员命令提示符下运行它,但仍然遇到同样的错误。
顺便说一下,如果你知道怎么把附件直接放到Python文件对象里,而不是保存到我的电脑上,那就更好了。
谢谢。
1 个回答
7
你需要提供完整的附件文件名,包括文件的名字部分。现在你只提供了目录的名字,你需要把目录和文件名合在一起:
fileAtt.SaveAsFile(r"C:\Users\Lidor\Desktop\Dina\scan-mail\" + fileAtt.FileName)