【问题标题】:Download attachment from an outlook email using R使用 R 从 Outlook 电子邮件中下载附件
【发布时间】:2018-01-16 13:51:08
【问题描述】:

我每周日都会收到一封带有附件(压缩文件夹)的电子邮件。电子邮件的主题永远不会改变。我想查找具有指定主题行的最新电子邮件并下载附件。我是新的 R 用户,到目前为止,我只找到了一种基于主题打印电子邮件正文的方法(来自 stackoverflow How to retrieve Outlook inbox emails using R RDCOMClient? 上提出的其他问题之一)。 理想情况下,我想找到在指定日期收到的具有指定主题的电子邮件,然后下载附件。有人可以指出我正确的方向。任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: r rdcomclient


    【解决方案1】:

    您可以使用 AdvancedSearch 方法搜索您的收件箱或任何其他文件夹:

    library(RDCOMClient)
    outlook_app <- COMCreate("Outlook.Application")
    search <- outlook_app$AdvancedSearch(
        "Inbox",
        "urn:schemas:httpmail:subject = 'Super Important Email'"
    )
    

    这是一个 异步 方法,因此 R 在继续下一步之前不会等待搜索完成。虽然确实存在处理此问题的AdvancedSearchComplete 事件,但我无法弄清楚如何使用 RDCOMClient 执行此操作。作为一种解决方法,Sys.sleep(5) 应该给搜索足够的时间来完成。

    您可以查看这些结果并使用ReceivedTime 方法查询它们的接收时间。要将这些时间转换为日期,请使用 1899 年 12 月 30 日的 Microsoft Office 基准日期:

    results <- search$Results()
    results$Item(1)$ReceivedTime() # Received time of first search result
    as.Date("1899-12-30") + floor(results$Item(1)$ReceivedTime()) # Received date
    

    我们现在可以查看在特定日期(例如 2017 年 8 月 14 日)收到的电子邮件的结果。

    for (i in 1:results$Count()) {
        if (as.Date("1899-12-30") + floor(results$Item(i)$ReceivedTime()) 
                == as.Date("2017-08-14")) {
            email <- results$Item(i)
        }
    }
    

    我们可以像查看搜索结果一样查看电子邮件的附件。第一个附件是email$Attachments(1)(注意电子邮件签名中的图片;这些也会出现!)。如果您对特定附件感兴趣,可以使用FileName 方法找到它。找到所需的附件后,您可以将其保存到一个文件中,然后像使用其他文件一样开始使用它。

    attachment_file <- tempfile()
    email$Attachments(1)$SaveAsFile(attachment_file)
    data <- read.csv(attachment_file)
    

    我在这里使用了临时文件路径,但您当然可以将附件保存到永久位置。

    【讨论】:

    • 这完全符合我的需要。太感谢了!太酷了
    • @mdneuzerling - 谢谢。我试过了,但我得到的只是搜索是 COMIDispatch 类的对象。我没有看到电子邮件。您能否提供一下我可能做错了什么的见解。谢谢!
    • @asmi 您可以使用Results() 方法从搜索中提取结果,并使用Item() 从结果中提取电子邮件。例如,search$Results()$Item(1) 将是搜索结果中的第一封(通常是最早的)电子邮件。它将是一个 COMIDispatch 对象,因此您必须使用方法来询问它,例如。 search$Results()$Item(1)$Subject()。有关详细信息,请参阅here。不要忘记括号,还有:Subject() 可以,但Subject 不行。
    • 您是否处理过这样的情况,即电子邮件正文中的图像也作为附件读取? stackoverflow.com/questions/48695427/…
    • 要查找特定的 Outlook 子文件夹,您可以首先使用 'outlookNameSpace = outlook_app$GetNameSpace("MAPI"); 找到正确的帐户文件夹
    【解决方案2】:

    在阅读了 mdneuzerling 出色的原始解决方案中的 cmets 后,我想添加一个附加答案,其中包含如何从子文件夹中提取数据的示例。这是我最近才发现的,并且从原始解决方案中借鉴了很多

    假设您的主要电子邮件是 user@outlook.com,并且在该地址中有一个名为“收件箱”的文件夹。此外,假设您的收件箱中有一个名为“重要”的子文件夹。如果您想从标题为“带附件的电子邮件”的电子邮件中从该子文件夹下载附件,您可以按如下方式定义文件路径:

    path <- outlookNameSpace$Folders("user@outlook.com")$Folders("Inbox")$Folders("Important")$FolderPath()
    

    然后,您将通过以下代码使用 mdneuzerling 的 答案中指定的 AdvancedSearch 方法:

       search <- outlook_app$AdvancedSearch(
                 paste0("'", path, "'"),
                 "urn:schemas:httpmail:subject = 'Email with Attachment'"
    )
    

    按照 mdneuzerling 的 解决方案中列出的其余方法,您应该能够从子文件夹中提取附件。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2014-05-25
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多