# 安装包
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 Quarto工具
16.1 email收发管理
R生态系统中提供了多个用于邮件发送和管理的包,可以满足不同场景下的邮件处理需求。本文总结主要的邮件相关R包及其应用。
16.1.1 邮件发送包
16.1.1.1 mailR包
mailR是一个功能完善的邮件发送包,支持SMTP协议,可以发送HTML格式邮件和附件。
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生成报告并通过邮件发送,使用emayili的render()方法可以直接将.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 安全注意事项
- 密码管理:不要在代码中硬编码密码,使用环境变量或密钥管理服务
- OAuth2认证:对于Gmail等服务,优先使用OAuth2而非密码认证
- 应用专用密码:Gmail等邮箱服务需要使用应用专用密码而非账户密码
16.1.5 包选择建议
- 简单文本邮件:使用
sendmailR - HTML邮件和附件:使用
mailR或emayili(emayili支持直接渲染.Rmd或.qmd文档作为邮件正文) - Gmail集成:使用
gmailr - Outlook/Microsoft 365集成:使用
Microsoft365R(支持发送、接收和完整管理) - 邮件接收和分析(IMAP):使用
mRpostman
这些包为R用户提供了完整的邮件处理能力,可以满足从简单通知到复杂邮件分析的各种需求。emayili特别适合需要将R Markdown或Quarto文档直接作为邮件正文发送的场景,流程简洁高效。Microsoft365R特别适合企业环境中需要与Microsoft 365生态系统集成的场景,提供了统一的API接口来访问Outlook邮件、OneDrive、SharePoint等Microsoft 365服务。