You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R的gmailr包获取Gmail每日收件统计(含小时维度)求助

用R通过Gmail API获取每日/小时收件统计

我来帮你搞定这个问题!其实gmailr包不止能发邮件,完全支持读取Gmail的邮件数据,只是你之前可能没用到这部分功能而已。下面一步步给你讲怎么实现每日(甚至按小时拆分)的收件数量统计:

1. 先搞定权限范围

首先得确保授权Gmail API时包含读取邮件的权限,之前如果只设置了发送权限,现在需要更新一下:

library(gmailr)

# 设置包含读取+发送的权限范围
gm_auth(scopes = c(
  "https://www.googleapis.com/auth/gmail.readonly",
  "https://www.googleapis.com/auth/gmail.send" # 保留发送权限,如果你还需要用的话
))

授权完成后,就有资格读取收件箱的数据了。

2. 批量获取收件箱邮件的时间戳

我们需要获取收件箱里所有邮件的接收时间(Gmail的internalDate字段是服务器接收邮件的时间,用来统计收件量最准确)。如果你的收件箱邮件很多,要注意API的分页限制,得循环获取所有页面的邮件:

# 先获取所有收件箱邮件的ID(处理分页)
all_inbox_ids <- list()
page_token <- NULL

repeat {
  batch <- gm_messages(label_ids = "INBOX", page_token = page_token)
  if (length(batch$id) == 0) break
  all_inbox_ids <- c(all_inbox_ids, batch$id)
  page_token <- batch$nextPageToken
  if (is.null(page_token)) break
  Sys.sleep(1) # 加个小延迟避免触发API限流
}

# 批量获取每封邮件的接收时间
email_timestamps <- lapply(all_inbox_ids, function(msg_id) {
  msg_meta <- gm_message(msg_id, metadata = TRUE)
  # 把Gmail的毫秒时间戳转成POSIXct格式
  received_time <- as.POSIXct(msg_meta$internalDate / 1000, origin = "1970-01-01", tz = "UTC")
  data.frame(message_id = msg_id, received_time = received_time)
})

# 合并成数据框
email_data <- do.call(rbind, email_timestamps)

3. 按日期/小时统计收件量

现在有了所有收件邮件的时间戳,接下来就可以用dplyr和lubridate来分组统计了:

library(dplyr)
library(lubridate)

# 先把时间转成你所在的时区(比如换成"Asia/Shanghai")
email_data$received_time <- with_tz(email_data$received_time, tzone = "Asia/Shanghai")

# 统计每日收件数量
daily_stats <- email_data %>%
  mutate(recv_date = as.Date(received_time)) %>%
  group_by(recv_date) %>%
  summarise(daily_count = n()) %>%
  arrange(recv_date)

# 统计按小时拆分的收件数量(日期+小时维度)
hourly_stats <- email_data %>%
  mutate(recv_hour = floor_date(received_time, "hour")) %>%
  group_by(recv_hour) %>%
  summarise(hourly_count = n()) %>%
  arrange(recv_hour)

# 查看结果
print(daily_stats)
print(hourly_stats)

4. 额外技巧:只统计特定时间范围的邮件

如果不需要统计所有历史邮件,只想看最近N天的,可以在获取邮件时加过滤条件:

# 比如只获取最近30天的邮件
start_date <- Sys.Date() - 30
# 转换成Gmail API要求的RFC 3339格式
start_time_str <- format(as.POSIXct(start_date), "%Y-%m-%dT%H:%M:%SZ")

# 过滤获取指定时间后的邮件
recent_inbox_ids <- gm_messages(
  label_ids = "INBOX",
  q = sprintf("after:%s", start_time_str)
)

这样就能精准获取你需要的时间范围内的收件统计了。

内容的提问来源于stack exchange,提问作者Sven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:17:35