我已经为此工作了3天,尝试了各种方法,搜索了gmail api文档和stackoverflow,但我仍然不确定这是否可能。
我正在尝试使用gmail api在cron风格的过程中发送电子邮件。(不是字面上的cron,而是类似的)。因此,没有用户交互。
我在https://console.developers.google.com/apis/credentials页面上设置了凭据,但是当我尝试使用它时,我得到了错误。我也从https://developers.google.com/gmail/api/quickstart/php#step_2_install_the_google_client_library运行了quickstart.php,但它创建的凭证似乎在3600秒后过期。我甚至不确定如何使用它们,因为它没有与其他凭证文件类似的密钥。
然后我在凭据页面上看到,如果您尝试为gmail api创建一组新的凭据,对于cron-job,它不会允许您这样做。它简单地说:“没有UI的平台不能访问用户数据,因为它需要用户交互才能登录。”
我的问题是,在不构建自己的类来实现curl来读取和抓取网页的情况下,是否有可能运行一个cron作业来使用gmail api发送电子邮件?
编辑:我很感谢大家的帮助,但我只是想看看是否有人真正做到了这一点。到目前为止,没有人承认这一点。我已经查看了服务级别凭据。我已经查看了用户级别的凭据。我已经试过快速启动了。快速启动是有效的,但即使是立即使用结果发送电子邮件也会失败,并导致登录失败。
我也阅读了有关刷新密钥的文档。
在我看来,谷歌为api提供了如此多的可用资源,以至于他们可能忘记了在没有用户交互的情况下做任何事情。嘿,我明白了。尝试为所有内容编写代码是很复杂的。我不是在抱怨。我真的只是在问是否有人可以使用gmail来做这件事。
发布于 2016-06-24 20:09:02
您可以在用户首次登录时请求离线访问,并在访问令牌过期时进行刷新。不过,您必须在第一次登录时要求用户登录。
首先,在生成登录url之前,您需要将访问类型设置为“离线”。为此,在调用$this->client->createAuthUrl()之前添加以下代码行。
$this->client->setAccessType($accessType);这将在用户第一次进行身份验证时提示用户进行离线访问。然后,在您的回调函数中,您应该根据收到的代码对用户进行身份验证,并获取刷新令牌:
$this->client->authenticate($code);
$tokens = $this->client->getAccessToken();
$refresh_token = $tokens->refresh_token;将refresh_token保存在数据库中,您将能够在每次到期时创建新的访问令牌。您可以使用以下代码来完成此操作:
$this->client->refreshToken($refreshToken);备注:这个答案基于Google的PHP SDK,客户端是他们的客户端对象。我为他们的API创建了一个包装器,你可能会发现它很有用,也更容易实现。你可以在here上查看它,它包含了大部分功能。
发布于 2016-06-24 01:18:44
我不是特别了解Gmail API,但是如果你使用oAuth来获取凭证,通常会有一个刷新令牌,你可以使用它来程序化地更新你的凭证(基本上是获取一个新的集合)。你可以阅读更多关于它的here。
编辑:第一次获取令牌信息时需要UI。这可以通过设置中的一个按钮或将返回的信息存储在永久位置(如数据库)中的某个东西来完成。然后,对于'cron‘类型的调用,引用访问令牌,如果已过期,则使用刷新令牌来获取新的访问令牌。
https://stackoverflow.com/questions/37997860
复制相似问题