没有UI的gmail api php

没有UI的gmail api php,php,cron,gmail-api,Php,Cron,Gmail Api,我已经为此工作了3天,尝试了各种方法,搜索gmail api文档和stackoverflow,但我仍然不确定这是否可能 我正试图以cron风格的方式用gmailapi发送电子邮件。(不是字面上的cron,而是类似的)。因此没有用户交互 我在页面上设置了凭据,但当我尝试使用它时,会出现错误。我还从运行了quickstart.php,但它创建的凭据似乎在3600秒后过期。我甚至不知道如何使用它们,因为它没有与其他凭证文件类似的密钥 然后我在凭证页面上看到,如果您尝试为gmail api创建一组新的凭

我已经为此工作了3天,尝试了各种方法,搜索gmail api文档和stackoverflow,但我仍然不确定这是否可能

我正试图以cron风格的方式用gmailapi发送电子邮件。(不是字面上的cron,而是类似的)。因此没有用户交互

我在页面上设置了凭据,但当我尝试使用它时,会出现错误。我还从运行了quickstart.php,但它创建的凭据似乎在3600秒后过期。我甚至不知道如何使用它们,因为它没有与其他凭证文件类似的密钥

然后我在凭证页面上看到,如果您尝试为gmail api创建一组新的凭证,对于cron作业,它不会允许您。它只是说“用户数据不能在没有UI的平台上访问,因为它需要用户交互才能登录。”

我的问题是,是否有可能运行cron作业来发送带有gmail api的电子邮件,而不构建自己的类来实现curl来读取和刮取网页

编辑:我感谢大家的帮助,但我只是想看看是否有人真的这么做了。到目前为止,还没有人承认。我已经查看了服务级别凭据。我已经查看了用户级凭据。我试过快速启动。快速启动可以工作,但即使立即使用结果发送电子邮件,也会因登录失败而失败

我已经阅读了有关刷新密钥的文档


在我看来,谷歌为api提供了太多的可用性,以至于他们可能忘记了在没有用户交互的情况下做任何事情。嘿,我明白了。为每件事写作是复杂的。我不是在抱怨。我只是认真地问,是否有人真的可以使用gmail来实现这一点。

我不知道gmail API的具体用途,但如果您使用oAuth来获取凭据,通常会有一个刷新令牌,您可以使用该令牌以编程方式续订凭据(基本上是获取一组新凭据)。你可以阅读更多关于它的内容

编辑:
第一次获取令牌信息时,您需要UI。这可以通过设置中的按钮或将返回的信息存储在永久位置(如数据库)来完成。然后,对于“cron”类型的调用,您引用访问令牌,或者如果已过期,则使用刷新令牌获取新的访问令牌。

您可以在用户首次登录时请求脱机访问,并在访问令牌过期时刷新。但是,您必须要求用户第一次登录

首先,在生成登录url之前,需要将访问类型设置为“脱机”。为此,在调用
$this->client->createAuthUrl()
之前添加以下代码行

这将在用户第一次进行身份验证时提示用户进行脱机访问。然后,在回调函数中,应根据收到的代码对用户进行身份验证,并获取刷新令牌:

$this->client->authenticate($code);
$tokens = $this->client->getAccessToken();
$refresh_token = $tokens->refresh_token;
将refresh_令牌保存在数据库中,您将能够在每次它过期时创建新的访问令牌。您可以使用以下代码执行此操作:

$this->client->refreshToken($refreshToken);

注意:这个答案基于Google的PHP SDK,客户端是他们的客户端对象。我为他们的API创建了一个包装器,您可能会发现它很有用,并且易于实现。你可以检查一下,它包含了大部分功能。

你可以使用Gmail的SMTP。你是说Gmail api,我问的是这个?还是别的?谢谢。它暗示它可以做到,但似乎没有明确表示。它还与“创建凭据”页面上的信息相冲突,该页面上说“用户数据无法从没有UI的平台访问,因为它需要用户交互才能登录。”我真的希望使用gmail api完成此操作的人会加入进来。我一直在尝试,但仍然会出现未登录错误。我得说,如果能从一开始就找到一个这样做的样本,或者如果一个真正成功的人能够确认这是可能的,那么这会简单得多。我非常怀疑它是从android授权系统复制过来的,不是为cron jobs设计的。@jim你签出了吗?先生。伊戈尔:是的。这没用。无论我做什么,我都会得到授权错误。这就是为什么我要问是否有人真的做过这件事。我在看你们的例子,但更多的是UI和表单。它似乎并没有真正按照我的要求去做。我只想知道是否有可能使用gmail api(OAuth2.0)从cron作业发送邮件。如果是的话,那么如果有人有一个简单直接的例子来说明如何做到这一点,那就太好了。现在,我正在使用我创建的服务级别凭据,我创建了一个新的Google_Client(),创建了应用程序名称,设置了客户端密码、作用域,从客户端获取服务,并尝试发送电子邮件。但总是登录失败。
$this->client->refreshToken($refreshToken);