【问题标题】:gmail-api php without UI没有用户界面的 gmail-api php
【发布时间】:2016-10-26 03:44:54
【问题描述】:

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

我正在尝试以 cron 风格的流程使用 gmail api 发送电子邮件。 (不是字面意义上的 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 作业,它不会让您这样做。它只是说“无法从没有 UI 的平台访问用户数据,因为它需要用户交互才能登录。”

我的问题是,是否有可能运行 cron 作业以使用 gmail api 发送电子邮件,而无需构建我自己的类来实现 curl 来读取和抓取网页?

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

我也阅读了有关刷新密钥的文档。

在我看来,谷歌已经为 api 提供了如此多的功能,以至于他们可能忘记了在没有用户交互的情况下做任何事情。嘿,我明白了。尝试为所有事情写作是复杂的。我没有抱怨。我只是认真地询问是否有人甚至可以为此使用 gmail。

【问题讨论】:

  • 您可以使用 Gmail 的 SMTP。
  • 您的意思是我要问的 gmail-api?还是别的什么?

标签: php cron gmail-api


【解决方案1】:

您可以在用户第一次登录时请求离线访问,并在访问令牌过期时刷新它。不过,您必须要求用户第一次登录。

首先,在生成登录 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);

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

【讨论】:

  • 我正在浏览您的示例,但更多的是 UI 和表单。它似乎并没有真正按照我的要求做。我只想知道是否可以使用 gmail api (oAuth 2.0) 从 cron 作业发送邮件。如果是这样,那么如果有人有一个简单直接的例子来说明如何做到这一点,那就太好了。现在我正在使用我创建的服务级别凭据,创建一个新的 Google_Client(),创建应用程序名称,设置客户端密码,范围,从客户端获取服务,并尝试发送电子邮件。不过总是登录失败。
【解决方案2】:

我不具体了解 Gmail API,但如果您使用 oAuth 获取凭据,通常会有一个刷新令牌,您可以使用它以编程方式更新您的凭据(基本上是获取一组新凭据)。你可以阅读更多关于它的信息here

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

【讨论】:

  • 谢谢。它表明它可以做到,但似乎没有明确表示。它还与创建凭据页面上的信息相冲突,该信息显示“无法从没有 UI 的平台访问用户数据,因为它需要用户交互才能登录。”我真的希望使用 gmail api 做到这一点的人能加入进来。
  • 我一直在尝试这样做,但仍然出现未登录错误。我得说,如果能从一开始就找到一个样本,或者如果有人真正成功地证实它是可能的,这会简单得多。我非常怀疑它只是从 android 授权系统中复制过来的,而不是被设计为能够被 cron 作业使用。
  • 先生。伊戈尔:是的。这没有帮助。无论我做什么,我都会收到授权错误。这就是为什么我要问是否有人真的这样做了。
猜你喜欢
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2014-08-08
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多