在R中使用gmailr批量添加附件创建邮件草稿遇问题求助
解决gmailr批量添加附件创建邮件草稿的问题
核心错误分析
你遇到的问题出在两个关键点:
- 文件向量处理错误:把文件列表转成
data.frame传给purrr::reduce,但gm_attach_file需要在mime邮件对象上操作,直接传入数据框会导致函数尝试对原子向量调用$操作,触发Error in mime$parts : $ operator is invalid for atomic vectors报错。 - 管道逻辑错误:没有将前面构建好的
mime对象作为reduce的初始值,导致附件没有被添加到已配置好收件人、主题的邮件对象上,最终生成空草稿。
单个邮箱的修复代码
假设你的数据存储在test列表中,先提取数据框,直接使用文件字符向量,通过reduce的.init参数传递已构建的mime对象,依次添加附件:
library(gmailr) library(purrr) library(glue) # 提取数据框 df <- test[[1]] # 获取目标邮箱和对应的文件列表 target_mail <- unique(df$mail) files_to_attach <- df$file # 创建带所有附件的邮件草稿 gm_mime() %>% gm_to(target_mail) %>% gm_from("tu@tu.com") %>% gm_subject("The files you requested") %>% gm_html_body(paste(glue::glue( "<h5><b> </b></h5> <p> <p> </p> <p> .</p>" ))) %>% # 关键:将前面的mime对象作为初始值,依次添加每个文件 purrr::reduce(.x = files_to_attach, .f = gm_attach_file, .init = .) %>% gm_create_draft()
多个邮箱的批量处理方案
如果你的数据包含多个不同邮箱,每个邮箱对应不同数量的附件,可以用dplyr分组后批量生成草稿:
library(dplyr) library(gmailr) library(purrr) library(glue) # 合并列表中的所有数据框(如果test是多个data.frame的列表) df <- dplyr::bind_rows(test) # 按邮箱分组,为每个邮箱创建带对应附件的草稿 df %>% dplyr::group_by(mail) %>% dplyr::group_walk(function(group_data, current_mail) { current_files <- group_data$file gm_mime() %>% gm_to(current_mail) %>% gm_from("tu@tu.com") %>% gm_subject("The files you requested") %>% gm_html_body(paste(glue::glue( "<h5><b> </b></h5> <p> <p> </p> <p> .</p>" ))) %>% purrr::reduce(.x = current_files, .f = gm_attach_file, .init = .) %>% gm_create_draft() })
补充说明
gmailr本身对附件数量没有限制,只要单封邮件总大小不超过Gmail的默认上限(25MB)即可;如果附件过大,建议使用gm_attach_drive_file挂载Google Drive文件。
内容的提问来源于stack exchange,提问作者Alejandro Carrera
相关产品推荐
相关产品推荐

