RDCOMClient 从非 Outlook 文件路径读取电子邮件

RDCOMClient read email from a non-Outlook file path

我有许多电子邮件保存在我的 Outlook 目录之外,例如。在某个文件路径 "C:\Users\foo\bar.msg".

我想使用 library(RDCOMClient) 将这些电子邮件读入 R;在 问题之后,我已经能够从我的 Outlook 文件夹结构中将电子邮件读入 R。但是,鉴于电子邮件的数量,无法将它们导入 Outlook 以从那里阅读。

this question suggests that within VBA you can use OpenSharedItem 的答案是从外部文件夹读取电子邮件,但是我无法将其转化为在 R 中可用的内容。我的尝试是:

library(RDCOMClient)

OutApp <- COMCreate("Outlook.Application")
outlookNameSpace <- OutApp$GetNameSpace("MAPI")

message_path <- "C:\Users\foo\bar.msg"
message <- OutApp$OpenSharedItem("message_path")

原来在我上面的例子中有一个错误的对象引用:我在调用 CreateItemFromTemplate

时引用 OutApp 而不是 outlookNamespace

保留问题,因为这可能会节省其他人的搜索并将 VBA 解决方案插入 R。

工作解决方案:

library(RDCOMClient)

OutApp <- COMCreate("Outlook.Application")
outlookNameSpace = OutApp$GetNameSpace("MAPI")

message_path <- "C:\Users\foo\bar.msg"      
message <- outlookNameSpace$OpenSharedItem(message_path)

您可能根本不需要为此使用 RDCOMClient。 hrbrmstr 在他的 github 上有一个名为 msgxtractr 的包,其中包含一个函数 read_msg,该函数将文件路径作为输入,returns 包含消息的所有详细信息的列表对象.

要从 github 安装包,请使用

# install.packages("remotes")
remotes::install_github("hrbrmstr/msgxtractr")
# Alternate GitLab Repo:
# remotes::install_gitlab("hrbrmstr/msgxtractr")

安装包后,您可以使用:

msgxtractr::read_msg("C:\Users\foo\bar.msg")

可能值得将 RDCOMClient 解决方案与 msgxtractr 进行基准测试。我怀疑 RDCOMClient 会慢一点并且可能不太稳定(因为它在应用程序之间进行通信)。

我们还可以使用以下方法提取附件:

 library(RDCOMClient)
 destination_dir <- "C:\Users"
 path_msg <- "C:\Users\foo\bar.msg"
 OutApp <- COMCreate("Outlook.Application")
 outlookNameSpace <- OutApp$GetNameSpace("MAPI")
 message <- outlookNameSpace$OpenSharedItem(path_msg)
 nb_Attached_Files <- message$Attachments()$Count()
 list_Attached_Files <- list()
 
 for(i in 1 : nb_Attached_Files)
 {
   print(i)  
   attachment_file <- paste0(destination_dir, .Platform$file.sep, message$Attachments(i)$Filename())
   list_Attached_Files[[i]] <- attachment_file
   message$Attachments(i)$SaveAsFile(attachment_file)
}

要提取主题和正文,我们可以使用以下方法:

text_Subject <- message$Subject()
text_Body <- message$Body()