无意间发现一个好玩的R包(blastula),R也可以用来自动发送邮件,之前都是用python。这样用R处理一些事情后日志就可以直接通过R发送。
1. 设置账号和密钥(部分邮箱可以直接用密码,如hotmail等),运行create_smtp_creds_key()会弹出一个密钥/密码输入框,输入即可。
- 方法一(官方示例,适应于gmail, outlook, office365这三种邮箱):
library(keyring)
library(blastula)
# 创建许可证[运行一次即可]
# -------------------------------------
create_smtp_creds_key(
id = "outlook", # 这个id可以设置为任意,但是要记住,发件时需要用到,用来区分用户
user = "xx@hotmail.com", # 这里填入你的邮件地址
provider = "outlook" # gmail, outlook, office365 三选一,这三种邮箱可以设置,否认不要设置此参数
)
view_credential_keys()
- 方法二(任意支持smtp的邮箱,smtp服务地址和端口见各大邮箱设置):
library(keyring)
library(blastula)
# 创建许可证[运行一次即可]
# -------------------------------------
create_smtp_creds_key(
id = "张三", # 以某支持smtp服务的邮箱为例。
user = "xxxx@zz.com", # 这里填入你的邮件地址
host = "smtp.exmail.qq.com", # stmp服务地址
port = 465, # 端口
use_ssl = TRUE, # 端口是否加密
overwrite = T # 是否覆盖设置(如果密码错误,需要将这个设置为T覆盖错误的配置)
)
view_credential_keys()
2. 另外新建一个文件存储下面的脚本(如 sendMail.R)
- 此脚本已经设置好命令行参数(不会使用的见链接),直接保存运行Rscript sendMail.R -h查看帮助后直接终端运行即可
suppressWarnings({
library(optparse)
library(keyring)
library(blastula)
})
option_list <- list(
make_option("--from", type = "character", default = "xxx@hotmail.com",
action = "store", help = "发件箱, 默认为xxx@hotmail.com"
),
make_option("--id", type = "character", default = "outlook",
action = "store", help = "id, 与发件箱对应的存储密钥id,默认为outlook"
),
make_option("--to", type = "character", default = NULL,
action = "store", help = "收件箱"
),
make_option("--subject", type = "character", default = "无主题",
action = "store", help = "主题,默认:无主题"
),
make_option("--body", type = "character", default = NULL,
action = "store", help = "Rmd正文路径,如不设此参数,则需设置mail参数"
),
make_option("--mail", type = "character", default = NULL,
action = "store", help = "正文内容,支持md,不能同时body和mail都设置 "
),
make_option("--add", type = "character", default = "",
action = "store", help = "附件文件路径,包括后缀"
),
# 设置模式
make_option(c("-v", "--view"), type = "logical", default = FALSE,
action = "store_true", help = "查看邮件id、密码信息, 仅使用-v参数时可以查看密钥id"
)
)
# 解析参数
opt = parse_args(OptionParser(option_list = option_list,
usage = "邮件发送",
description = "格式: Rscript %prog [options]n"))
# 仅有一个view参数时:
if (isTRUE(opt$view)) {
v_id.df <- view_credential_keys()
print(v_id.df)
stop("ID信息如上所示", call. = FALSE)
}
# body和mail同时缺失或同时存在时:
if( is.null(opt$body) & is.null(opt$mail)) { stop({
cat("Error:n参数body和mail不能同时设置或同时缺失nt邮件内容要么放在Rmd文件中要么写在mail参数中")
}) }
if( !is.null(opt$body) & !is.null(opt$mail)) { stop({
cat("Error:n参数body和mail不能同时设置或同时缺失nt邮件内容要么放在Rmd文件中要么写在mail参数中")
}) }
# main:
# 定义邮件要素
from = opt$from
id = opt$id # id为创建许可证时设置的与密钥相关联的id,view_credential_keys()可查看。
to = opt$to
subject = opt$subject
body = opt$body
mail = opt$mail
attachment = opt$add #"path/to/附件" 必须包含后缀, 如果没有附件,引号内留空即可。 #参数
# 渲染
if (is.null(body)) {
email <- compose_email(
body = md(
mail
)
)
} else {
# 渲染Rmd
if (attachment == "") {
email <- render_email(body)
} else {
email <- render_email(body) %>%
add_attachment(file = attachment)
}
}
# 发送邮件
smtp_send(
from = from,
to = to,
subject = subject, # 可用enc2utf8()处理中文主题乱码问题, 检验是否为Encoding(subject)
email = email,
credentials = creds_key(id = id)
)