我有一个rails应用程序,我想在其中使用Gmail API发送电子邮件(using google-api-client
用于ruby)。我在谷歌开发者中创建了一个应用程序,并且我已经生成了一个服务帐户密钥。我使用谷歌规范存储该凭证JSON文件(存储在/home/user/.config/gcloud/applicaton_default_credentials.json
)。
对于初学者,我想在下面抓取user labels
是我的代码
require 'google/apis/gmail_v1'
gmail_v1 = Google::Apis::GmailV1
service = gmail_v1::GmailService.new
service.authorization = Google::Auth.get_application_default([gmail_v1::AUTH_SCOPE, gmail_v1::AUTH_GMAIL_COMPOSE, gmail_v1::AUTH_GMAIL_MODIFY, gmail_v1::AUTH_GMAIL_READONLY])
user_id = 'me'
result = service.list_user_labels(user_id)
但是这给了我Google::Apis::ClientError: failedPrecondition: Bad Request
错误。
我的最终目标是使用我已生成凭据JSON文件的电子邮件发送电子邮件,因为我不想将我的用户名和密码放在ActionMailer的smtp配置中。
答案 0 :(得分:0)
记住服务帐户不是您。服务帐户是虚拟用户,拥有Google云端硬盘帐户和Google日历帐户,可能还有一些帐户。但它没有Gmail帐户。
user_id =' me'
无法使用服务帐户。
注意:您无法使用具有普通Gmail帐户的服务帐户。
如果这是域帐户用户,则您可以获取服务帐户电子邮件地址,并将其作为用户添加到域管理员帐户中。授予其访问用户gmail帐户的权限。然后你需要做一些像
这样的事情user_id =' user @ domain'
答案 1 :(得分:0)
经过几个小时的调试,我终于找到了一个有效的解决方案。 DalmTo 关于服务帐户无法访问Gmail的概念是正确的,因为Gmail需要用户帐户,但在这种情况下我们可以利用impersonation
的强大功能。模仿的步骤是:
我们需要更改此设置的代码,如下所示
service = gmail_v1::GmailService.new
service.authorization = Google::Auth.get_application_default([gmail_v1::AUTH_SCOPE, gmail_v1::AUTH_GMAIL_COMPOSE, gmail_v1::AUTH_GMAIL_MODIFY, gmail_v1::AUTH_GMAIL_READONLY])
auth_client = service.authorization.dup
auth_client.sub = 'user@domain'
user_id = 'me'
result = auth_client.list_user_labels(user_id)
注意:为此,为了工作,我们需要访问我们的G-suit帐户,并为我们的服务帐户提供适当的许可。