Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python将附件从今天收到的电子邮件复制到文件夹_Python_Outlook_Outlook Filter - Fatal编程技术网

使用python将附件从今天收到的电子邮件复制到文件夹

使用python将附件从今天收到的电子邮件复制到文件夹,python,outlook,outlook-filter,Python,Outlook,Outlook Filter,我有一个脚本,可以将outlook中的附件复制到笔记本电脑上的文件夹中。到目前为止一切都很好,如果我只有一封有明确主题和附件的电子邮件,一切都很好。今天我意识到,当我的收件箱中有一封主题和附件名称相同的新邮件和一封旧邮件时,会出现一个问题——它看起来像是随机接收旧邮件或新邮件 问题:有没有一种方法可以告诉脚本,要么总是接收最年轻的邮件,要么接收今天收到的邮件? 我尝试了GetLast()和GetFirst(),这是我在stackoverlow中找到的,但不确定确切地添加到哪里(我的尝试导致了错误

我有一个脚本,可以将outlook中的附件复制到笔记本电脑上的文件夹中。到目前为止一切都很好,如果我只有一封有明确主题和附件的电子邮件,一切都很好。今天我意识到,当我的收件箱中有一封主题和附件名称相同的新邮件和一封旧邮件时,会出现一个问题——它看起来像是随机接收旧邮件或新邮件

问题:有没有一种方法可以告诉脚本,要么总是接收最年轻的邮件,要么接收今天收到的邮件? 我尝试了GetLast()和GetFirst(),这是我在stackoverlow中找到的,但不确定确切地添加到哪里(我的尝试导致了错误)。有人有主意吗

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 = 'Email Subject'
att_today = 'Attachment.zip'

for msg in all_inbox:
    if msg.Subject == sub_today:
        break

for att in msg.Attachments:
    if att.FileName == att_today:
        break


att.SaveAsFile(r'C:\path\to\my\folder\Attachment.zip')

编辑(解决方案):


GetLast
GetFirst
是链接到收件箱的方法。项目

all_inbox = inbox.Items
all_inbox.Sort('[ReceivedTime]', True)
first = all_inbox.GetFirst()
last = all_inbox.GetLast()

编辑:如@Dmitry Streblechenko所述,您需要先按接收时间对收件箱进行排序。项目

GetLast
GetFirst
是链接到
收件箱的方法。项目

all_inbox = inbox.Items
all_inbox.Sort('[ReceivedTime]', True)
first = all_inbox.GetFirst()
last = all_inbox.GetLast()

编辑:如@Dmitry Streblechenko所述,您需要先按收到的时间对收件箱进行排序。项目首先,不要在文件夹中的所有项目中循环-这就是
ItemsFind/FindNext
Items.Restrict
的目的。在您的特定情况下,请调用
all_inbox.Find('[Subject]='somevalue')
以查找具有给定主题的邮件


其次,您需要首先对邮件集合进行排序-例如,调用
all\u inbox.sort(“[ReceivedTime]”,true)
按接收日期对邮件进行排序。之后,您可以调用
Items.Find
来查找最新邮件。

首先,不要循环浏览文件夹中的所有项目-这就是
ItemsFind/FindNext
Items.Restrict
的作用。在您的特定情况下,请调用
all_inbox.Find('[Subject]='somevalue')
以查找具有给定主题的邮件

其次,您需要首先对邮件集合进行排序-例如,调用
all\u inbox.sort(“[ReceivedTime]”,true)
按接收日期对邮件进行排序。之后,您可以调用
Items.Find
查找最新消息。

以下内容如何



以下内容如何




谢谢你的回答-那么我该如何在代码中使用它呢?是否将“所有收件箱”替换为“最后一个”?在“for msg in all_收件箱:”中,如果您想要最后一条消息,则不再需要循环。您只需要
last=all\u inbox.GetLast()
GetFirst/GetLast不返回最新或最旧的电子邮件,这取决于排序顺序。它不是。存储提供商决定以何种顺序返回消息。最有可能的是,它们将处于创建顺序。如果您想要一个排序列表,您必须调用Items.Sort.Thank,刚刚意识到,我需要将“Items.Sort(“[ReceivedTime]”,True)”设置为False:),然后它就可以工作了!谢谢你的回答-那么我该如何在代码中使用它呢?是否将“所有收件箱”替换为“最后一个”?在“for msg in all_收件箱:”中,如果您想要最后一条消息,则不再需要循环。您只需要
last=all\u inbox.GetLast()
GetFirst/GetLast不返回最新或最旧的电子邮件,这取决于排序顺序。它不是。存储提供商决定以何种顺序返回消息。最有可能的是,它们将处于创建顺序。如果您想要一个排序列表,您必须调用Items.Sort.Thank,刚刚意识到,我需要将“Items.Sort(“[ReceivedTime]”,True)”设置为False:),然后它就可以工作了!非常感谢你-我尝试了这个版本,但是我总是得到最后一个,所以今天我收到了这些09/15的邮件。09/14、9/13,我想取昨天的那个,但它复制了09/14的那个:/在Filter和GetLast之间添加了这个小片段,现在它工作了-谢谢!)Items.Sort(“[ReceivedTime]”,False)Item=Items.GetLast()非常感谢-我尝试了这个版本,但是我总是收到最后一个,所以今天我收到了这些09/15的邮件。09/14、9/13,我想取昨天的那个,但它复制了09/14的那个:/在Filter和GetLast之间添加了这个小片段,现在它工作了-谢谢!)Items.Sort(“[ReceivedTime]”,False)Item=Items.GetLast()
import win32com.client

Outlook = win32com.client.Dispatch("Outlook.Application")
olNs = Outlook.GetNamespace("MAPI")
Inbox = olNs.GetDefaultFolder(6)

Filter = ("@SQL=" + chr(34) + "urn:schemas:httpmail:subject" +
          chr(34) + " Like 'Email Subject' AND " +
          chr(34) + "urn:schemas:httpmail:hasattachment" +
          chr(34) + "=1")

Items = Inbox.Items.Restrict(Filter)
Items.Sort('[ReceivedTime]', False)
Item = Items.GetLast()

for attachment in Item.Attachments:
    print(attachment.FileName)
    if attachment.FileName == "Attachment.zip":
        attachment.SaveAsFile(r"C:\path\to\my\folder\Attachment.zip")