R语言msgxtractr提取Outlook已发送文件夹.msg邮件头为NULL的问题咨询
R提取Outlook已发送文件夹导出MSG文件邮件头的可行方案
问题原因
msgxtractr包的read_msg()函数默认字段映射规则仅适配收件箱导出MSG文件的传输头存储路径,已发送邮件导出的MSG文件中,头信息存储属性位与接收类邮件不一致,因此不会被自动映射到返回对象的$headers字段,出现返回NULL的情况,并非MSG文件本身缺失头信息。
方案1:不更换依赖,直接从msgxtractr解析结果的原始属性中提取
read_msg()实际已经将MSG文件的所有元数据读入返回对象,仅未给已发送邮件的头做$headers快捷映射,直接遍历原始属性列表即可提取所需头字段,参考代码:
# 读取目标已发送MSG文件 path = "C:/Users/.../sent_email.msg" library(msgxtractr) email = read_msg(path) # 查看返回对象所有顶级属性,确认元数据存储位置 names(email) # 已发送邮件的头相关元数据通常存放在$properties嵌套列表中 # 可直接按字段名索引提取标准头字段 email_meta <- email$properties sender_addr <- email_meta$sender_email # 发件人邮箱 recv_addr <- email_meta$display_to # 收件人信息 send_time <- email_meta$client_submit_time # 发送时间 msg_id <- email_meta$internet_message_id # 邮件Message-ID
如果需要提取非标准自定义头,遍历email$properties和email$fields两个嵌套列表,按目标字段关键词匹配取值即可。
方案2:调用Outlook COM接口解析(兼容性最高,可获取完整MIME头)
如果需要获取完整的互联网邮件头,且本地安装有Outlook客户端,可以使用RDCOMClient包调用Outlook原生解析能力,不受MSG来源文件夹影响,参考代码:
library(RDCOMClient) path = "C:/Users/.../sent_email.msg" # 初始化Outlook COM对象 outlook <- COMCreate("Outlook.Application") # 直接读取本地MSG文件,无需导入Outlook邮箱 email_obj <- outlook$CreateItemFromTemplate(path) # 提取完整MIME邮件头 full_internet_header <- email_obj$PropertyAccessor()$GetProperty( "http://schemas.microsoft.com/mapi/proptag/0x007D001F" ) # 也可直接提取常用头字段 sender <- email_obj$SenderEmailAddress recv_list <- email_obj$To cc_list <- email_obj$CC send_timestamp <- email_obj$SentOn
注意:该方法依赖本地安装的Outlook桌面客户端,解析时不需要将MSG文件导入Outlook邮箱目录,可直接读取本地磁盘存储的MSG文件,对收件箱、已发送、草稿箱等任意文件夹导出的MSG文件均能完整提取头信息。
内容的提问来源于stack exchange,提问作者user180610
相关产品推荐
相关产品推荐

