使用Python 3 win32com.client脚本,该脚本仅搜索来自特定发件人的电子邮件,并从多个附件中下载1个。
我遇到的问题是,在电子邮件包含两个附件的情况下,它会尝试下载并重命名两个附件,这会覆盖我想要的第一个文件和第二个附件。
文件附件具有特定的文件名,但还有另一个名称相似的附件。
到目前为止,我有:
import win32com.client
import os
mydesktop = os.path.expanduser('~') + '/Desktop/'
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# Select main Inbox
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
sender = 'mysender@domain'
MyDailyfolder = mydesktop + 'My Daily Data/'
try:
for message in messages:
msg_date = message.SentOn.strftime('%Y-%m-%d')
try:
s = message.sender
s = str(s)
if s == sender:
for att in message.Attachments:
if "Dashboard2_dashboard2" in att.FileName: #<---This doesn't work.
outfile_name2 = 'MycustomName' + msg_date + '.csv'
outfile_path2 = MyDailyfolder + outfile_name2
if not os.path.exists(MyDailyfolder): os.makedirs(MyDailyfolder)
# save file
att.SaveASFile(outfile_path2)
print('Saved file:', outfile_name2)
except:
x=1
except:
x=1
结果将电子邮件中的所有附件下载到我的桌面上的新文件夹中,但是会覆盖每个副本。我试图仅选择包含“ Dashboard2dashboard2”的附件。我认为我必须使用“部分msg.walk():”,但以前从未使用过该命令。有什么想法吗?
答案 0 :(得分:0)
这个问题是我在文件名搜索中出现的错字。下划线。在每个步骤中添加了额外的打印内容,以确保每个部分均有效。
sender = 'mysender@domain'
MyDailyfolder = mydesktop + 'My Daily Data/'
try:
for message in messages:
msg_date = message.SentOn.strftime('%Y-%m-%d')
try:
s = message.sender
s = str(s)
if s == sender:
print('Sender:' , message.sender)
for att in message.Attachments:
if "dashboard_2.csv" in att.FileName:
outfile_name = msg_date + att.FileName
print ('Match search confirmed')
# Backup test, print filename and watch spelling
print (att.FileName)
# Create a folder and copy/paste attachment there
outfile_path = MyDailyfolder + outfile_name
if not os.path.exists(MyDailyfolder): os.makedirs(MyDailyfolder)
# save file
att.SaveASFile(outfile_path)
except:
pass
except:
pass