在 R 脚本中,当我尝试使用以下代码发送电子邮件时。它要求 gmailr 包请求访问您的 Google 帐户。选择一个预先授权的帐户或输入“0”以获取新令牌。按 Esc/Ctrl + C 中止。
1:email1@gmail.com
如果没有在控制台中手动输入 1,我的 R 脚本如何自动选择我的预授权帐户并相应地发送电子邮件?
library(gmailr)
gm_auth_configure(path="C:/Users/Google Drive/email.json")
my_email_message <- gm_mime() %>%
gm_to("email1@gmail.com") %>%
gm_from("email1@gmail.com") %>%
gm_subject("My test message")
gm_send_message(my_email_message)
Run Code Online (Sandbox Code Playgroud)
这就是无人值守/非交互式身份验证问题。 我将尝试给出对我有用的过程的概要。
2023 年更新:随着时间的推移,情况发生了变化,我更新了答案,因为我需要重新审视这个问题。希望它能帮助其他像我一样觉得这个过程相当混乱的人。
正如gmailr/readme中所述- 您下载 json 凭据,以交互方式进行一次身份验证,然后将凭据复制到您喜欢的任何位置。您可以通过python Quickstart获得凭据,甚至更好 - 只需在https://console.developers.google.com上创建一个项目,向其中添加 gmail API,然后为桌面应用程序创建 OAuth 凭据(创建 OAuth 客户端 ID)。后一种方法的好处是您将确切地知道所有组件的位置,并且能够根据需要重复多次。我为此目的创建了一个单独的谷歌电子邮件地址。然后,您将 OAuth“客户端秘密”文件下载到您的项目目录中并调用它(或您喜欢的任何其他文件)。然后,当您位于项目目录中时,您将在 Rstudio 中以交互方式运行以下命令进行身份验证:.jsoncredentials.jsonname.json
# tell google which e-mail is being used
# and where to store credentials
# I have used subdirectory `.secret` for it
options(
gargle_oauth_email = "my-new-email@gmail.com",
gargle_oauth_cache = ".secret"
)
gm_auth_configure(path = ".secret/credentials.json")
# to make things simple for me I have saved the .json file in the same
# .secret subdirectory where I am asking gargle to keep the auth tokens in
# gm_auth() is the function that will start "OAuth dance" - ie open your
# default browser asking to approve...
Run Code Online (Sandbox Code Playgroud)
需要注意的一些事情对于初学者(我)来说并不那么明显 -
gargle是实际处理身份验证的库。gmailr当您使用 时,会在后台调用它gm_auth()。
gm_auth(email = "email_address_used_for_creds@gmail.com")
# then compose your e-mail and send it
Run Code Online (Sandbox Code Playgroud)
gm_auth()设置电子邮件地址的命令可以避免询问要使用哪个帐户的额外对话。有时在第一次使用时会弹出此信息(例如,如果您的缓存中有多个电子邮件令牌)。
对于 OAuth dance,将弹出一个网页,其中包含可怕的消息,但您将同意所有内容,从那时起您的应用程序将使用缓存。这是.secret您刚刚在项目中创建的子目录(您可以为缓存目录指定任何名称),它是可移植的 - 您可以将其与credentials.json应用程序(或闪亮服务器)一起复制到新位置。所有内容都包含在您的项目目录中,这很方便。
如果您不确定并且需要更好地理解事情,您可以运行gargle::gargle_oauth_sitrep()它,它会显示您的缓存在哪里(gargle认为它在哪里)以及其中包含哪些令牌。它应该显示您通过调用设置的目录options()。
之后,您将需要在代码中添加几行 - 它们应该位于命令之前,gm_send_message(your_email_prepared_with_gm_mime)并且无论您将项目复制到哪台计算机,只要服务器上安装了项目gmailr和gargle库,就不再需要交互式身份验证:R
如果我理解正确的话 - 您的.json文件包含 OAuth刷新令牌。这允许您在需要时获取访问令牌。访问令牌存储在 Oauth 缓存中,它允许您发送(或阅读、删除等)电子邮件,并且它的生命周期很短 - 大约一个小时。Gargle 在需要时使用刷新令牌获取新的访问令牌。如果未使用,刷新令牌将在 6 个月后过期。如果刷新令牌已过期,您将不得不进行 OAuth 舞蹈 - 即那里有一个交互式浏览器。您不能安排一个 cron 作业每月向自己发送一次空白电子邮件吗?
gmailr 文章“设置 OAuth 客户端”解释得很好;如果你遇到困难,我的简短解释是鼓励你再读一遍。您还可以在https://gmailr.r-lib.org/index.html阅读 gmailr 参考- 它非常好。但我的猜测是 - 如果您遵循了此处的流程,您甚至不需要它。
关于缓存的注意事项:默认gargle缓存目录位于主目录的隐藏子目录中 - 因此它是该计算机上特定于您的。(例如,在 Linux 上,默认位置位于~/.local/share/gmailr/。)但是,如果您将其设置为 R 项目的子目录,则整个 OAuth 过程将变得可移植。只需复制您想要的项目目录,OAuth 凭证对 - 缓存中的 json 文件和 OAuth 令牌将随之复制。访问令牌是 gmail 以加密方式创建并存放在缓存中的 gzip 二进制文件。一个地址与一个 G 项目配对会产生一个代币。人们可能可以在一个 R 项目中使用多个地址和 google 项目,但到目前为止我还没有看到这样做的必要性。
小智 2
只需添加“发件人电子邮件地址”即可gm_auth(email = "email1@gmail.com")
library(gmailr)
gm_auth_configure(path="C:/Users/Google Drive/email.json")
gm_auth(email = "email1@gmail.com")
my_email_message <- gm_mime() %>%
gm_to("email1@gmail.com") %>%
gm_from("email1@gmail.com") %>%
gm_subject("My test message")
gm_send_message(my_email_message)```
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |