如何在R中生成带附件的Outlook草稿.msg文件?
生成带附件的.msg邮件草稿(适配IT限制的R参数化方案)
方案一:R参数化配置 + VBS脚本调用Outlook生成草稿
这个方案无需额外安装R包(仅用base R),通过VBS调用Outlook的COM接口创建草稿,R负责批量/参数化配置邮件内容和附件。
代码实现
# 1. 定义单封邮件的参数(可批量扩展为列表循环) mail_params <- list( to = "recipient@example.com", subject = "季度绩效报告通知", body = "您好,\n这是您的季度绩效报告相关文件,请查收附件。\n\n如有疑问请随时联系。\n祝好,\n您的同事", attachments = c("./reports/performance.pdf", "./data/metrics.xlsx", "./docs/summary.docx") ) # 2. 格式化正文换行符(适配VBS语法) formatted_body <- gsub("\n", "\\\\n", mail_params$body) # 3. 生成附件添加语句 attach_lines <- paste0(".Attachments.Add \"", mail_params$attachments, "\"", collapse = "\n ") # 4. 拼接VBS脚本内容 vbs_content <- paste( 'Set objOutlook = CreateObject("Outlook.Application")', 'Set objMail = objOutlook.CreateItem(0)', '', 'With objMail', paste(' .To = "', mail_params$to, '"', sep = ""), paste(' .Subject = "', mail_params$subject, '"', sep = ""), paste(' .Body = "', formatted_body, '"', sep = ""), attach_lines, ' .Save ' # 直接保存为Outlook草稿 'End With', '', 'Set objMail = Nothing', 'Set objOutlook = Nothing', sep = "\n" ) # 5. 保存并运行VBS脚本 writeLines(vbs_content, "generate_draft.vbs") shell("generate_draft.vbs") # Windows系统下直接执行
说明
- 运行后会自动在Outlook的「草稿」文件夹生成对应邮件,直接打开即可手动发送
- 批量生成时,只需将
mail_params改为包含多组参数的列表,循环执行上述代码即可
方案二:生成EML文件后转存为.msg草稿
如果无法调用Outlook COM接口,可以生成标准EML格式文件,双击打开后在Outlook中保存为草稿。
代码实现(需base64enc包,若受限可替换为openssl包)
install.packages("base64enc") # 若已安装可跳过 library(base64enc) # 1. 参数配置 mail_params <- list( from = "Your Name <your@company.com>", to = "recipient@example.com", subject = "季度绩效报告通知", body = "您好,\n这是您的季度绩效报告相关文件,请查收附件。\n\n祝好,\n您的同事", attachments = c("./reports/performance.pdf", "./data/metrics.xlsx", "./docs/summary.docx") ) # 2. 构建EML头部 eml_header <- paste( paste("From:", mail_params$from), paste("To:", mail_params$to), paste("Subject:", mail_params$subject), "MIME-Version: 1.0", 'Content-Type: multipart/mixed; boundary="email_boundary_001"', "", "--email_boundary_001", 'Content-Type: text/plain; charset="UTF-8"', "", mail_params$body, "", sep = "\n" ) # 3. 处理附件(转Base64编码) attach_sections <- lapply(mail_params$attachments, function(file_path) { file_raw <- readBin(file_path, "raw", file.info(file_path)$size) file_b64 <- base64encode(file_raw) # 分割为每行76字符符合MIME规范 b64_lines <- paste(strsplit(file_b64, "(?<=.{76})", perl = TRUE)[[1]], collapse = "\n") filename <- basename(file_path) paste( "--email_boundary_001", paste('Content-Disposition: attachment; filename="', filename, '"', sep = ""), "Content-Transfer-Encoding: base64", "", b64_lines, "", sep = "\n" ) }) # 4. 合并所有部分并保存EML eml_full <- paste(eml_header, paste(unlist(attach_sections), collapse = "\n"), "--email_boundary_001--", sep = "\n") writeLines(eml_full, "mail_draft.eml")
说明
- 生成的EML文件双击即可在Outlook中打开,点击「保存」自动存入草稿文件夹
- 若无法安装base64enc包,可手动使用Base64编码工具处理附件后替换代码中的对应部分
内容的提问来源于stack exchange,提问作者blayne_
相关产品推荐
相关产品推荐

