16  Quarto工具

16.1 email收发管理

R生态系统中提供了多个用于邮件发送和管理的包,可以满足不同场景下的邮件处理需求。本文总结主要的邮件相关R包及其应用。

16.1.1 邮件发送包

16.1.1.1 mailR

mailR是一个功能完善的邮件发送包,支持SMTP协议,可以发送HTML格式邮件和附件。

# 安装包
install.packages("mailR")

# 发送邮件
library(mailR)

send.mail(
  from = "sender@example.com",
  to = c("recipient@example.com"),
  subject = "测试邮件",
  body = "这是一封测试邮件",
  smtp = list(
    host.name = "smtp.gmail.com",
    port = 465,
    user.name = "your_email@gmail.com",
    passwd = "your_password",
    ssl = TRUE
  ),
  authenticate = TRUE,
  send = TRUE
)

16.1.1.2 sendmailR

sendmailR是一个轻量级的邮件发送包,使用简单,适合快速发送文本邮件。

library(sendmailR)

from <- "sender@example.com"
to <- "recipient@example.com"
subject <- "测试邮件"
body <- "邮件正文内容"

sendmail(from, to, subject, body,
         control = list(smtpServer = "smtp.example.com"))

16.1.1.3 gmailr

gmailr专门用于与Gmail API交互,需要OAuth2认证,适合需要批量发送或管理Gmail邮件的场景。

library(gmailr)

# 设置OAuth2认证
gm_auth_configure(path = "credentials.json")
gm_auth(email = "your_email@gmail.com")

# 创建邮件
email <- gm_mime() %>%
  gm_to("recipient@example.com") %>%
  gm_from("your_email@gmail.com") %>%
  gm_subject("测试邮件") %>%
  gm_text_body("邮件正文")

# 发送邮件
gm_send_message(email)

16.1.1.4 emayili

emayili是一个现代化的邮件发送包,语法简洁,支持HTML邮件和附件。

library(emayili)

# 创建SMTP服务器对象
smtp <- server(
  host = "smtp.gmail.com",
  port = 587,
  username = "your_email@gmail.com",
  password = "your_app_password"
)

# 创建邮件
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("recipient@example.com") %>%
  subject("测试邮件") %>%
  html("<h1>HTML邮件</h1><p>这是邮件正文</p>")

# 发送邮件
smtp(email, verbose = TRUE)

使用R Markdown或Quarto文档作为邮件正文emayili提供了render()方法,可以直接在邮件链式调用中渲染.Rmd.qmd文档,流程更加简洁直观。

library(emayili)

# 创建SMTP服务器对象
smtp <- server(
  host = "smtp.gmail.com",
  port = 587,
  username = "your_email@gmail.com",
  password = "your_app_password"
)

# 直接使用render()方法渲染.Rmd或.qmd文档作为邮件正文
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("recipient@example.com") %>%
  subject("数据报告") %>%
  render("report.Rmd")  # 直接渲染R Markdown文档

# 或者渲染Quarto文档
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("recipient@example.com") %>%
  subject("数据报告") %>%
  render("report.qmd")  # 直接渲染Quarto文档

# 发送邮件
smtp(email)

# 控制CSS样式(某些邮件客户端可能不支持某些CSS)
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("recipient@example.com") %>%
  subject("数据报告") %>%
  render("report.Rmd", include_css = c("rmd", "highlight"))  # 只包含必要的CSS

smtp(email)

16.1.1.5 Microsoft365R

Microsoft365R是微软官方提供的R包,提供与Microsoft 365服务(包括Outlook邮件)的完整接口。该包支持个人账户和工作/学校账户,使用OAuth2认证,可以发送、接收和管理Outlook邮件。

Hotmail邮箱支持Microsoft365R完全支持Hotmail邮箱管理。由于Hotmail已被整合到Outlook.com,并且使用相同的Microsoft账户系统,因此Hotmail账户(包括@hotmail.com、@hotmail.com.cn、@live.com、@msn.com等域名)可以通过get_personal_outlook()函数进行认证和管理。这意味着Hotmail用户可以像使用Outlook.com账户一样,使用该包进行邮件的发送、接收、搜索、附件下载等所有操作。

library(Microsoft365R)

# 个人Outlook账户认证(首次运行会打开浏览器进行登录)
outlook <- get_personal_outlook()

# 工作或学校账户认证
outlook <- get_business_outlook()

# 创建并发送简单邮件
email <- outlook$create_email(
  body = "这是一封从R发送的邮件",
  subject = "R发送的测试邮件",
  to = "recipient@example.com"
)
email$send()

# 发送带附件的邮件
email <- outlook$create_email(
  body = "请查看附件",
  subject = "带附件的邮件",
  to = "recipient@example.com",
  attachments = "report.pdf"
)
email$send()

# 与blastula包集成发送HTML邮件
library(blastula)

email_body <- md("
## 你好!

这是一封使用blastula包生成的HTML邮件。

我们可以使用**Markdown**格式,通过`md()`函数来编写。

祝好!
")

# 或者直接调用一个md文件
email_body_from_file <- render_email("email_template.md")

email <- outlook$create_email(
  body = email_body_from_file,
  content_type = "html",
  subject = "HTML格式邮件",
  to = "recipient@example.com"
)
email$send()

16.1.2 邮件接收和管理包

16.1.2.1 mRpostman

mRpostman是一个功能强大的IMAP客户端包,支持邮件搜索、获取、附件提取等操作。

library(mRpostman)

# 连接到IMAP服务器
con <- configure_imap(
  url = "imap.gmail.com",
  username = "your_email@gmail.com",
  password = "your_app_password"
)

# 选择邮箱
con$select_folder("INBOX")

# 搜索邮件
msgs <- con$search(
  request = AND(
    since(date_char = "2024-01-01"),
    string(expr = "关键词", where = "SUBJECT")
  )
)

# 获取邮件内容
msg <- con$fetch_text(msg_id = msgs$msg_id[1])

# 获取附件
attachments <- con$fetch_attachments(msg_id = msgs$msg_id[1])

16.1.2.2 Microsoft365R邮件管理

Microsoft365R不仅可以发送邮件,还提供了完整的邮件管理功能,包括邮件列表、检索、文件夹管理等。

library(Microsoft365R)

# 认证Outlook账户
outlook <- get_personal_outlook()

# 列出收件箱中的邮件
emails <- outlook$list_emails()

# 获取特定邮件(通过邮件ID)
email_id <- emails[[1]]$properties$id
email <- outlook$get_email(email_id)

# 查看邮件属性
email$properties$subject
email$properties$from
email$properties$receivedDateTime

# 获取邮件正文
email$get_body()

# 获取邮件附件
attachments <- email$list_attachments()
email$download_attachment(attachments[[1]]$name, dest = "attachment.pdf")

# 搜索邮件(通过过滤器)
filtered_emails <- outlook$list_emails(filter = "subject eq '重要'")

# 管理邮件文件夹
folders <- outlook$list_folders()
inbox <- outlook$get_folder("Inbox")
sent <- outlook$get_folder("Sent Items")

16.1.3 实际应用场景

16.1.3.1 hotmail邮箱管理测试

使用Microsoft365R包进行Hotmail邮箱的邮件收发和管理测试:

library(Microsoft365R)

# 步骤1:连接Hotmail邮箱(首次运行会打开浏览器进行登录)
outlook <- get_personal_outlook()

# 步骤2:发送测试邮件
test_email <- outlook$create_email(
  body = "这是一封来自R的测试邮件,用于验证Hotmail邮箱功能。",
  subject = "R测试邮件",
  to = "your_email@hotmail.com"  # 替换为你的Hotmail邮箱
)
test_email$send()
cat("测试邮件已发送\n")

# 步骤3:查看收件箱邮件列表
emails <- outlook$list_emails(n = 10)  # 获取最近10封邮件
cat("收件箱共有", length(emails), "封邮件\n")

# 查看最近几封邮件的主题
for(i in 1:min(5, length(emails))) {
  cat(sprintf("%d. %s\n", i, emails[[i]]$properties$subject))
}

# 步骤4:获取特定邮件的详细信息
if(length(emails) > 0) {
  email_id <- emails[[1]]$properties$id
  email <- outlook$get_email(email_id)
  
  # 查看邮件属性
  cat("\n邮件详情:\n")
  cat("主题:", email$properties$subject, "\n")
  cat("发件人:", email$properties$from$emailAddress$address, "\n")
  cat("接收时间:", email$properties$receivedDateTime, "\n")
  
  # 获取邮件正文(前200个字符)
  body <- email$get_body()
  cat("正文预览:", substr(body, 1, 200), "...\n")
  
  # 检查是否有附件
  attachments <- email$list_attachments()
  if(length(attachments) > 0) {
    cat("附件数量:", length(attachments), "\n")
    for(att in attachments) {
      cat("  -", att$name, "\n")
    }
  }
}

# 步骤5:搜索特定主题的邮件
search_results <- outlook$list_emails(filter = "subject eq '测试'")
cat("\n搜索到", length(search_results), "封主题包含'测试'的邮件\n")

# 步骤6:发送带附件的邮件(可选)
# test_email_with_attachment <- outlook$create_email(
#   body = "这是一封带附件的测试邮件",
#   subject = "带附件的测试邮件",
#   to = "your_email@hotmail.com",
#   attachments = "test_file.txt"  # 替换为实际文件路径
# )
# test_email_with_attachment$send()

注意事项: - 首次运行get_personal_outlook()时会打开浏览器进行Microsoft账户登录认证 - 认证信息会保存在本地,后续运行无需重复登录 - 确保你的Hotmail账户已启用两步验证(如需要) - 测试时建议使用自己的邮箱地址,避免发送垃圾邮件

16.1.3.2 自动化报告发送

结合R Markdown或Quarto生成报告并通过邮件发送,使用emayilirender()方法可以直接将.Rmd.qmd文档作为邮件正文:

library(emayili)

# 创建SMTP服务器对象
smtp <- server(
  host = "smtp.gmail.com",
  port = 587,
  username = "your_email@gmail.com",
  password = "your_app_password"
)

# 方法1:直接将.Rmd文档渲染为邮件正文
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("manager@example.com") %>%
  subject("每日数据报告") %>%
  render("report.Rmd")  # 直接渲染R Markdown文档作为邮件正文

smtp(email)

# 方法2:将.qmd文档渲染为邮件正文
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("manager@example.com") %>%
  subject("每日数据报告") %>%
  render("report.qmd")  # 直接渲染Quarto文档作为邮件正文

smtp(email)

# 方法3:如果需要同时发送HTML附件
library(rmarkdown)  # 需要加载rmarkdown包来渲染HTML文件
rmarkdown::render("report.Rmd", output_file = "report.html")
email <- envelope() %>%
  from("your_email@gmail.com") %>%
  to("manager@example.com") %>%
  subject("每日数据报告") %>%
  render("report.Rmd") %>%  # emayili的render()方法:邮件正文
  attachment("report.html")  # 附件

smtp(email)

16.1.3.3 邮件监控和数据分析

使用mRpostman监控收件箱并分析邮件数据:

library(mRpostman)
library(dplyr)

# 连接邮箱
con <- configure_imap(
  url = "imap.gmail.com",
  username = "your_email@gmail.com",
  password = "your_app_password"
)
con$select_folder("INBOX")

# 获取最近7天的邮件
msgs <- con$search(
  request = since(date_char = as.character(Sys.Date() - 7))
)

# 获取邮件元数据
mail_data <- con$fetch_text(msg_id = msgs$msg_id)

# 分析邮件统计
mail_stats <- data.frame(
  date = as.Date(msgs$date),
  subject = msgs$subject
) %>%
  group_by(date) %>%
  summarise(count = n())

16.1.4 安全注意事项

  1. 密码管理:不要在代码中硬编码密码,使用环境变量或密钥管理服务
  2. OAuth2认证:对于Gmail等服务,优先使用OAuth2而非密码认证
  3. 应用专用密码:Gmail等邮箱服务需要使用应用专用密码而非账户密码

16.1.5 包选择建议

  • 简单文本邮件:使用sendmailR
  • HTML邮件和附件:使用mailRemayiliemayili支持直接渲染.Rmd.qmd文档作为邮件正文)
  • Gmail集成:使用gmailr
  • Outlook/Microsoft 365集成:使用Microsoft365R(支持发送、接收和完整管理)
  • 邮件接收和分析(IMAP):使用mRpostman

这些包为R用户提供了完整的邮件处理能力,可以满足从简单通知到复杂邮件分析的各种需求。emayili特别适合需要将R Markdown或Quarto文档直接作为邮件正文发送的场景,流程简洁高效。Microsoft365R特别适合企业环境中需要与Microsoft 365生态系统集成的场景,提供了统一的API接口来访问Outlook邮件、OneDrive、SharePoint等Microsoft 365服务。