有时需要通过邮件交互外部数据,下载邮件中附件作为数据源是日常操作。我日常使用 R 较多,希望能通过 R 包解决该问题,通过查找发现mRpostman
包通过 IMAP 客户端可以搜索消息、附件提取、邮件管理等功能。
mRpostman 官网:https://allanvc.github.io/mRpostman/
安装
mRpostman 包在CRAN上,可直接安装
install.packages("mRpostman")
案例
邮件附件下载需求,如不关心细节可以通过以下代码简单配置邮箱下载邮件附件。
下面代码演示从outlook邮箱收件箱中下载 2022-05-28 号全部邮件附件。其中password改成相应邮箱密码即可。
library(mRpostman)
con <- configure_imap(url="imaps://outlook.office365.com",
username="zyf19940501@outlook.com",
password= readLines('password'))
con$select_folder(name = "INBOX")
con$search_on(date_char = "28-May-2022") |>
con$fetch_attachments()
如果是其他的邮箱,需要找到相应的邮箱服务器地址;大众邮箱可以通过搜索引擎获取,公司邮箱的imap地址找公司的IT人员询问。
登录登录邮箱
详尽的使用信息请查阅官网[1],使用 outlook 365 邮箱和189 天翼邮箱作为演示邮箱。
• outlook office 365
library(mRpostman)
# 配置IMAP 连接
con <- configure_imap(url="imaps://outlook.office365.com",
username="zyf19940501@outlook.com",
password= readLines('password'))
# 服务器可用功能
con$list_server_capabilities()
outlook 邮箱 imap:outlook.office365.com
163邮箱:imap.163.com
qq邮箱:imap.qq.com
• 天翼邮箱
con <- configure_imap(url="imaps://imap.189.cn",
username="19908418420@189.cn",
password= readLines('password'))
天翼邮箱imap 地址:imap.189.cn
天翼邮箱帮助中心:http://help.189.cn/client/client.html
查找邮件
查找邮件前,我们要进入相应文件夹,以收件箱为例:
# 选择收件箱
con$select_folder(name = "INBOX")
• 邮箱文件夹
通过以下代码列出邮箱可用的文件夹
con$list_mail_folders()
当我们收到的邮箱在垃圾箱时,需要切换到垃圾邮件文件夹
con$select_folder(name = "junk")
• 筛选邮件
进入正确的文件夹后,我们需要通过相应的条件筛选邮件,如下所示:
# 通过日期筛选
con$search_on(date_char = "28-May-2022")
# 通过发件人
# TO SUBJECT
con$search_string(expr = "19908418420@189.cn" ,where = "FROM")
# 通过正文内容
con$search_string(expr = 'test',where = 'BODY')
# 通过标识
con$search_flag(name = c("ANSWERED", "Seen"), use_uid = TRUE)
# 多条件
con$search(request = AND(string(expr = "Kansas State University", where = "SUBJECT"),
before(date_char = "02-Jan-2020")))
注意日期格式
搜索表达式暂时不支持中文
获取邮件附件
下载邮件附件有两种方式,如下所示:
• 方法一
con$search_on(date_char = "28-May-2022") |>
con$fetch_text() |>
con$get_attachments()
• 方法二
con$search_on(date_char = "28-May-2022") |>
con$fetch_attachments()
解析邮件正文
邮件正文解析有一些复杂,如无必要,可不解析。
con$search_on(date_char = "28-May-2022") |>
con$fetch_text(write_to_disk = T)
通过上述代码获取到邮件正文,如下所示:
将中间一段base64解码后即可得到正文内容
str <- "PGh0bWw+PGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRl
eHQvaHRtbDsgY2hhcnNldD11dGYtOCI+PC9oZWFkPjxib2R5PjxwPjxicj7mtYvor5XkuLvpopg8
L3A+PC9ib2R5PjwvaHRtbD4="
base64enc::base64decode(what = str) |>
rawToChar()
结果如下所示,和收件箱中邮件正文一致。
在线解析网址:https://base64.us/,可以将上述字符放到网址中解码。
引用链接
[1]
官网: https://allanvc.github.io/mRpostman/
[2] 解析 :https://base64.us/