RDCOM Client报错:使用R发送带Excel附件邮件触发80020009异常
问题描述
你目前尝试通过R语言的RDCOMClient库发送5封各附带独立电子表格的邮件,待发送的表格路径存放于如下向量:
[1] "C:/Users/sxc3gfl/Documents/data-science-team-master/INTERLINE BRANDS.xlsx" [2] "C:/Users/sxc3gfl/Documents/data-science-team-master/POLY-AMERICA, LP.xlsx" [3] "C:/Users/sxc3gfl/Documents/data-science-team-master/SO TTI POWER EQUIPMENT.xlsx" [4] "C:/Users/sxc3gfl/Documents/data-science-team-master/GENERAC SO.xlsx" [5] "C:/Users/sxc3gfl/Documents/data-science-team-master/SO TOTER LLC.xlsx"
经确认路径均正确,使用的发件脚本如下:
path_names <- "C:/Users/sxc3gfl/Documents/data-science-team-master/" attachments <- c(paste0(path_names, sheet_names28)) for (sheet in sheet_names28) { attachments = c(paste0(path_names, sheet)) OutApp <- COMCreate("Outlook.Application") outMail = OutApp$CreateItem(0) outMail[["To"]] = paste("user@outlook.com" , sep=";", collapse=NULL) outMail[["subject"]] = "Subject" outMail[["body"]] = "Hi - Attached is the spreadsheet " purrr::map(attachments, ~ outMail[["attachments"]]$Add(.)) outMail$Send() }
前两个表格对应的邮件均可正常发送,运行到第三个路径C:/Users/sxc3gfl/Documents/data-science-team-master/SO TTI POWER EQUIPMENT.xlsx时触发如下报错:
<checkErrorInfo> 80020009 No support for InterfaceSupportsErrorInfo checkErrorInfo -2147352567 Error: Exception occurred.
问题定位
该报错是RDCOMClient调用Outlook COM接口时的通用运行异常,对应可排查的原因如下:
- 附件读取失败:90%以上的该类报错出在附件读取环节,首先检查第三个Excel文件是否被其他程序占用,比如提前打开了该文件编辑未关闭,Excel会给文件加独占锁,Outlook添加附件时无法读取文件就会抛出该异常,前两个文件未被占用所以发送正常。
- 附件大小超限:检查第三个文件的大小,是否超出了你Outlook账号配置的单封邮件附件大小上限。
- COM资源冲突:原代码在循环内重复创建
Outlook.Application实例,前两次创建的实例未正常释放,第三次调用时COM接口资源冲突也会触发该报错。
解决方案
- 先关闭所有打开的Excel进程,确认报错对应的文件未被占用,且文件大小符合发件限制。
- 优化发件代码,全局只创建一次Outlook实例,循环内复用实例,发件后及时释放邮件对象,同时添加文件存在性校验,避免无效接口调用,优化后代码如下:
library(RDCOMClient) library(purrr) path_names <- "C:/Users/sxc3gfl/Documents/data-science-team-master/" # 全局创建一次Outlook实例,避免重复创建资源冲突 OutApp <- COMCreate("Outlook.Application") for (sheet in sheet_names28) { attach_path <- paste0(path_names, sheet) # 提前校验文件是否存在可读 if (!file.exists(attach_path)) { warning(paste("文件不存在,跳过:", attach_path)) next } # 创建邮件项 outMail <- OutApp$CreateItem(0) outMail[["To"]] = "user@outlook.com" outMail[["subject"]] = "Subject" outMail[["body"]] = "Hi - Attached is the spreadsheet " # 添加附件 outMail[["attachments"]]$Add(attach_path) # 发件 outMail$Send() # 释放当前邮件对象 rm(outMail) gc() # 可选:加1秒延时,避免频繁调用接口触发限制 Sys.sleep(1) } # 全部发完后释放Outlook实例 rm(OutApp) gc()
内容的提问来源于stack exchange,提问作者Jaskeil
相关产品推荐
相关产品推荐

