无需用户干预Google云功能即可认证gmailapi

2024-09-18 15:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我是个新手,所以请忍受我。在

我正在尝试建立一个Google云功能,可以访问同一个域上的单个GMail帐户,下载一些电子邮件并将其推送到云存储。老实说,我只想在脚本中使用电子邮件和密码(使用googlekms/w环境变量?)但我知道这是不可能的,而且OAuth2是必需的。在

我在GCP中设置了一个OAuth客户机,并运行了GMail API Python Quickstart指南。在本地运行它时,系统会提示我允许访问,并且令牌会被保存,这样以后的运行就可以在没有提示的情况下工作。在

我将Cloud函数与pickle文件一起部署,以测试刷新令牌是否仍然有效,并计划以后如何使用KMS使其更安全。但是装载泡菜时有一个问题:

UnpicklingError: invalid load key, '\xef'

这样看起来pickle在上传时被压缩/损坏。在

这甚至是一种明智的做法吗?我怎么能这么做?电子邮件地址是我的,所以我希望我可以只验证一次就可以完成。在

顺便说一下,我不可能使用域委派服务帐户,也不可能使用IMAP。在


Tags: 功能脚本密码电子邮件google环境变量帐户oauth
1条回答
网友
1楼 · 发布于 2024-09-18 15:21:58

由于您无法执行域委派服务帐户,因此您可以尝试按照本指南设置server side authorization。这听起来像你想要的,因为它要求用户授权应用程序一次,然后重用该令牌。这里有一个codelab,它将带您了解身份验证部分。在

或者,您可以使用推送通知。听起来你当前的设计是定期轮询gmailapi来查找新邮件,这也包括在云函数中授权访问该帐户。但是,如果利用推送通知,既可以实时获取数据,又可以避免授权云函数读取gmailapi。See guide here.

然而,最简单的解决方案可能是使用app scripts。如果您将云函数设置为通过HTTP目标触发,则可以编写一个应用程序脚本来ping该URL,其中包含要发送给GCS的消息。Docs here。在

function getEmails() {
  let inbox = GmailApp.getInboxThreads(0, 50);
  // Inbox Threads
  for (i=0; i < inbox.length; i++){ 
    let threadMessages = inbox[i].getMessages();
    // Thread Messages
    for (j=0; j < threadMessages.length; j++){
      let message = threadMessages[j].getBody();
      let subject = threadMessages[j].getSubject();

      var options = {
        'method' : 'post',
        'contentType': 'application/json',
        'payload' : JSON.stringify({"message": message, "subject": subject})
    };
     UrlFetchApp.fetch('YOUR_FUNCTION_TRIGGER_URL', options);
    }
  }
}

相关问题 更多 >