使用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
相关产品推荐
相关产品推荐

