从共享文件夹下载电子邮件附件-Python
根据发送日期和电子邮件主题标准,我有以下代码下载电子邮件附件:从共享文件夹下载电子邮件附件-Python,python,outlook,win32com,Python,Outlook,Win32com,根据发送日期和电子邮件主题标准,我有以下代码下载电子邮件附件: from datetime import date, timedelta import os import win32com.client path = os.path.expanduser("C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\Vlookup File Location") today = date.today() o
from datetime import date, timedelta
import os
import win32com.client
path = os.path.expanduser("C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\Vlookup File Location")
today = date.today()
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.Folders("xxx").Folders.Item("Inbox")
messages = inbox.Items
subject = "xxx"
dateHigh = date.today() - timedelta(days=1)
dateLow = date.today() - timedelta(days=-1)
max = 2500
for count, message in enumerate(messages):
if count > max:
break
if subject in message.subject and message.senton.date() > dateLow and message.senton.date() < dateHigh:
attachments = message.Attachments
num_attach = len([x for x in attachments])
for x in range(1, num_attach+1):
attachment = attachments.Item(x)
attachment.SaveASFile(path + '\\' + str(attachment))
from datetime导入日期,timedelta
导入操作系统
导入win32com.client
path=os.path.expanduser(“C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\VLOOKUP文件位置”)
今天=日期。今天()
outlook=win32com.client.Dispatch(“outlook.Application”).GetNamespace(“MAPI”)
收件箱=outlook.Folders(“xxx”).Folders.Item(“收件箱”)
邮件=收件箱。邮件
主题=“xxx”
dateHigh=date.today()-timedelta(天=1)
dateLow=date.today()-timedelta(天=-1)
最大值=2500
对于计数,枚举中的消息(消息):
如果计数>最大值:
打破
如果message.subject和message.senton.date()中的subject>dateLow和message.senton.date()
例如,有没有办法指定仅下载.csv附件的标准
此外,此代码以前用于公用文件夹-这些文件夹现在已更新为共享文件夹。自从更新后,为了找到指定的电子邮件,我不得不将“max”从500增加到2500。有没有办法加快速度
谢谢下面是一种指定所需文件类型的方法 请在“感兴趣的附件”列表中输入文件结尾
from datetime import date, timedelta
import os
import win32com.client
path = os.path.expanduser("C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\Vlookup File Location")
today = date.today()
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.Folders("xxx").Folders.Item("Inbox")
messages = inbox.Items
subject = "xxx"
dateHigh = date.today() - timedelta(days=1)
dateLow = date.today() - timedelta(days=-1)
max_n = 2500
attachments_of_interest = ['.csv']
for count, message in enumerate(messages):
if count > max_n:
break
if subject in message.subject and message.senton.date() > dateLow and message.senton.date() < dateHigh:
attachments = message.Attachments
num_attach = len([x for x in attachments])
for x in range(1, num_attach+1):
attachment = attachments.Item(x)
attachment_fname = str(attachment)
file_ending = attachment_fname.split('.')[-1]
if not attachments_of_interest or file_ending in attachments_of_interest:
attachment.SaveASFile(path + '\\' + attachment_fname)
from datetime导入日期,timedelta
导入操作系统
导入win32com.client
path=os.path.expanduser(“C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\VLOOKUP文件位置”)
今天=日期。今天()
outlook=win32com.client.Dispatch(“outlook.Application”).GetNamespace(“MAPI”)
收件箱=outlook.Folders(“xxx”).Folders.Item(“收件箱”)
邮件=收件箱。邮件
主题=“xxx”
dateHigh=date.today()-timedelta(天=1)
dateLow=date.today()-timedelta(天=-1)
最大值=2500
感兴趣的附件=['.csv']
对于计数,枚举中的消息(消息):
如果计数>最大值:
打破
如果message.subject和message.senton.date()中的subject>dateLow和message.senton.date()
至于加速,你可以使用游泳池:
from multiprocessing.pool import ThreadPool as Pool
from datetime import date, timedelta
import os
import win32com.client
path = os.path.expanduser("C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\Vlookup File Location")
today = date.today()
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.Folders("xxx").Folders.Item("Inbox")
messages = inbox.Items
subject = "xxx"
max_n = 2500
attachments_of_interest = ['.csv']
pool_size = 5
# define worker function before a Pool is instantiated
def worker(message):
dateHigh = date.today() - timedelta(days=1)
dateLow = date.today() - timedelta(days=-1)
if subject in message.subject and message.senton.date() > dateLow and message.senton.date() < dateHigh:
attachments = message.Attachments
num_attach = len([x for x in attachments])
for x in range(1, num_attach+1):
attachment = attachments.Item(x)
attachment_fname = str(attachment)
file_ending = attachment_fname.split('.')[-1]
if not attachments_of_interest or file_ending in attachments_of_interest:
attachment.SaveASFile(path + '\\' + attachment_fname)
pool = Pool(pool_size)
for count, message in enumerate(messages):
if count > max_n:
break
pool.apply_async(worker, (message,))
pool.close()
pool.join()
从multiprocessing.pool导入ThreadPool作为池
从日期时间导入日期,时间增量
导入操作系统
导入win32com.client
path=os.path.expanduser(“C:\\Users\\xxxx\\Documents\\Projects\\VBA Projects\\VLOOKUP Automation\\VLOOKUP文件位置”)
今天=日期。今天()
outlook=win32com.client.Dispatch(“outlook.Application”).GetNamespace(“MAPI”)
收件箱=outlook.Folders(“xxx”).Folders.Item(“收件箱”)
邮件=收件箱。邮件
主题=“xxx”
最大值=2500
感兴趣的附件=['.csv']
池大小=5
#在实例化池之前定义辅助函数
def工作者(消息):
dateHigh=date.today()-timedelta(天=1)
dateLow=date.today()-timedelta(天=-1)
如果message.subject和message.senton.date()中的subject>dateLow和message.senton.date()最大值:
打破
pool.apply\u async(worker,(message,))
pool.close()
pool.join()
我认为这是仅下载csv的部分要求。
此outlook组件有一些方法可供使用。
而不是messages=inbox.Items
尝试
messages=inbox.Items.GetFirst()
获取第一条信息,然后使用
messages=inbox.Items.oItems.GetNext()
因此,通过这种方式,您的内存中始终只有一条消息,您可以在更长的时间内保持循环
确保您拥有outlook Microsoft outlook 16.0对象库或高于10的版本,以便此方法存在。GetFirst()
我使用的c代码
Outlook.MailItem oMsg = (Outlook.MailItem)oItems.GetFirst();
//Output some common properties.
Console.WriteLine(oMsg.Subject);
Console.WriteLine(oMsg.SenderName);
Console.WriteLine(oMsg.ReceivedTime);
Console.WriteLine(oMsg.Body);
//Check for attachments.
int AttachCnt = oMsg.Attachments.Count;
Console.WriteLine("Attachments: " + AttachCnt.ToString());
Outlook.MailItem oMsg1 = (Outlook.MailItem)oItems.GetNext();
嘿感谢您的回答,但是,在实现代码时,似乎根本没有保存任何附件。请重试,我已更新了代码。确保列表中指定了要捕获的文件扩展名。我更新了代码,这样如果列表为空,它仍然可以工作(对于所有文件类型),嘿,复制了准确的代码,并包含了我所需的扩展名。仍然没有下载任何东西。使用我的旧代码在下载的相同电子邮件和附件上进行测试,尽管pdf和xlsx都需要,但我显然只需要xlsx。但为了确认没有其他问题,请打印出附件名称,并给我举几个例子好吗?这将帮助我调试,没有你的设置(在ubuntu上,我没有outlook)有点难。嘿,通过附件\u fname,你想让我提供电子邮件上显示的完整文件名和扩展名吗?我不完全确定你指的是什么