在R中发送带HTML正文的邮件遭Gmail截断问题排查
问题分析与解决方案
核心原因
- 错误的内容格式转换:你用
md(glue::glue("{htmlDoc}"))将HTML内容转为markdown格式传入邮件正文,这会让blastula错误解析HTML代码,既破坏原有格式,又引入额外转义内容增大邮件体积。 - 冗余的HTML结构:默认
html_document输出会生成包含完整HTML页面的代码(含Bootstrap框架的CSS、JS、页面头部结构等),即便空白内容,这些冗余代码也会让文件体积轻易超过邮件服务商的大小阈值,触发邮件截断。 - 文件名不一致:脚本中渲染的文件是
"Daily Email .Rmd"(Email后多了一个空格),但实际文件名是"Daily Email.Rmd",可能导致渲染失败或读取错误文件。
解决步骤
1. 修改RMarkdown输出格式为精简片段
将Daily Email.Rmd的输出改为html_fragment,它仅生成正文内容,不包含完整页面的冗余结构:
--- title: "Daily Email 2" output: html_fragment date: "2023-12-07" ---
2. 修正邮件构建逻辑
直接将HTML内容传入compose_email的body参数,无需通过md()转换:
library(tidyverse) library(blastula) # 渲染精简的HTML片段,确保文件名和实际一致(去掉多余空格) rmarkdown::render("Daily Email.Rmd", output_file = "Daily Email.html") htmlDoc <- read_file("Daily Email.html") # 直接传入HTML正文,无需markdown转换 email <- compose_email(body = htmlDoc) email %>% smtp_send( to = "myemail@gmail.com", from = "myemail@gmail.com", subject = "Daily Email", credentials = creds_envvar( user = "myemail@gmail.com", pass_envvar = "SMTP_PASSWORD", provider = "gmail" ) )
3. 额外优化(可选)
若需自定义样式且进一步减小体积,可在RMarkdown中添加精简内联CSS,避免引入外部样式:
--- title: "Daily Email 2" output: html_fragment: css: "style.css" date: "2023-12-07" ---
其中style.css仅保留邮件必需的样式,比如:
body { font-family: Arial, sans-serif; } h1 { font-size: 18px; color: #333; }
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

