R语言-邮件发送

2023-05-21 00:23:56 浏览数 (2)

无意间发现一个好玩的R包(blastula),R也可以用来自动发送邮件,之前都是用python。这样用R处理一些事情后日志就可以直接通过R发送。

1. 设置账号密钥(部分邮箱可以直接用密码,如hotmail等),运行create_smtp_creds_key()会弹出一个密钥/密码输入框,输入即可。

  • 方法一(官方示例,适应于gmail, outlook, office365这三种邮箱):
代码语言:javascript复制
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服务地址和端口见各大邮箱设置):
代码语言:javascript复制
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查看帮助后直接终端运行即可
代码语言:javascript复制
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) 
)

0 人点赞