从共享文件夹下载电子邮件附件-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,你想让我提供电子邮件上显示的完整文件名和扩展名吗?我不完全确定你指的是什么