【问题标题】:Copy attachment from todays received email to folder with python使用python将今天收到的电子邮件中的附件复制到文件夹
【发布时间】:2019-09-13 13:32:02
【问题描述】:

我有一个脚本,可以将附件从 Outlook 复制到笔记本电脑上的文件夹中。到目前为止一切顺利,如果我只有一封带有已定义主题和附件的电子邮件,一切正常。今天我意识到,当我的收件箱中有一封新旧电子邮件具有相同的主题和附件名称时,会出现问题 - 看起来它随机接收旧邮件或新邮件。

问题:有没有办法告诉脚本要么总是接收最年轻的邮件,要么接收今天收到的邮件? 我尝试了在 stackoverlow 中找到的 GetLast() 和 GetFirst(),但不确定在哪里准确添加它(我的尝试导致错误)。有人有想法吗?

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')

编辑(解决方案):

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 'ATTACHMENTNAMEHERE' 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")

【问题讨论】:

    标签: python outlook outlook-filter


    【解决方案1】:

    下面的怎么样...


    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")
    

    Items.GetLast method (Outlook)

    Items.Restrict method (Outlook)

    【讨论】:

    • 非常感谢 - 我试过这个版本,但我总是收到最后一个,所以今天我收到了 09/15 的这些邮件。 09/14, 9/13,喜欢拿昨天的那个,但它正在复制 09/14 的那个:/
    • 在 Filter 和 GetLast 之间添加了这个小片段,现在它正在工作 - 谢谢! :) Items.Sort('[ReceivedTime]', False) Item = Items.GetLast()
    【解决方案2】:

    GetLastGetFirst 是链接到 inbox.Items 的方法

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

    编辑:正如@Dmitry Streblechenko 所说,您需要先按 ReceivedTime 对 inbox.Items 进行排序

    【讨论】:

    • 感谢您的回答 - 那么我该如何在我的代码中使用它呢?用“最后一个”替换“所有收件箱”?在 "for msg in all_inbox:" 中?
    • 如果您想要最后一条消息,则不再需要循环。你只需要last = all_inbox.GetLast()
    • GetFirst / GetLast 不返回最新或最旧的电子邮件,这完全取决于排序顺序。
    • 不是。商店提供者决定以任何顺序返回消息。他们很可能会在创建顺序中。如果你想要一个排序列表,你必须调用 Items.Sort。
    • 谢谢,刚刚意识到,我需要将 "Items.Sort('[ReceivedTime]', True)" 设置为 False :) 然后就可以了!谢谢
    【解决方案3】:

    首先,永远不要遍历文件夹中的所有项目 - 这就是 ItemsFind/FindNextItems.Restrict 的用途。在您的特定情况下,请致电 all_inbox.Find('[Subject] = ''somevalue'' ') 以查找具有给定主题的消息。

    其次,您需要先对 Items 集合进行排序 - 例如致电all_inbox.Sort('[ReceivedTime]', true) 按接收日期对消息进行排序。之后,您可以拨打Items.Find 查找最新消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多