Google Cloud Pub/Sub API - 推送电子邮件

Posted

技术标签:

【中文标题】Google Cloud Pub/Sub API - 推送电子邮件【英文标题】:Google Cloud Pub/Sub API - Push E-mail 【发布时间】:2015-10-14 10:43:35 【问题描述】:

我正在使用 node.js 创建一个应用程序,该应用程序每次收到电子邮件时都会从 Gmail 获取 PUSH,将其与 CRM 中的第三方数据库进行检查,并在 CRM 中创建一个新字段(如果电子邮件)包含在那里。我在使用 Google 的新 Cloud Pub/Sub 时遇到了问题,这似乎是无需持续轮询即可从 Gmail 获取推送的唯一方法。

我已经阅读了此处的说明:https://cloud.google.com/pubsub/prereqs,但我不明白这应该如何从我桌面上的应用程序中运行。似乎 pub/sub 可以连接到经过验证的域,但我无法让它直接连接到我计算机上的 .js 脚本。我已将 api 密钥保存在 json 文件中并使用以下内容:

var gcloud = require('gcloud');
var pubsub;

// From Google Compute Engine:
pubsub = gcloud.pubsub(
  projectId: 'my-project',
);

// Or from elsewhere:
pubsub = gcloud.pubsub(
  projectId: 'my-project',
  keyFilename: '/path/to/keyfile.json'
);

// Create a new topic.
pubsub.createTopic('my-new-topic', function(err, topic) );

// Reference an existing topic.
var topic = pubsub.topic('my-existing-topic');

// Publish a message to the topic.
topic.publish('New message!', function(err) );

// Subscribe to the topic.
topic.subscribe('new-subscription', function(err, subscription) 
  // Register listeners to start pulling for messages.
  function onError(err) 
  function onMessage(message) 
  subscription.on('error', onError);
  subscription.on('message', onMessage);

  // Remove listeners to stop pulling for messages.
  subscription.removeListener('message', onMessage);
  subscription.removeListener('error', onError);
);

但是,我收到错误,好像它没有连接到服务器并且在 API 列表中我只看到错误,没有实际成功。我显然做错了什么,知道可能是什么吗?

提前谢谢你!

【问题讨论】:

来自文档的端点设置“您的服务器必须可以通过 DNS 名称访问,并且必须提供签名的 SSL 证书”。因此,要接收推送,您的端点必须位于面向公众的 Web 服务器上。桌面应用只能接收拉取。 【参考方案1】:

TL;DR

您无法从客户端订阅推送通知。


设置 HTTPS 服务器来处理消息。将发送消息 到您配置的 URL 端点,代表该服务器的 地点。您的服务器必须可通过 DNS 名称访问,并且必须 出示签名的 SSL 证书。 (App Engine 应用程序是 预配置了 SSL 证书。)

只需订阅您服务器上的推送通知,当您收到通知时,您就可以知道它关注的是谁。您将从通知中获得的数据是它所关注的用户以及相关的 historyId,如下所示:

 // This is all the data the notifications will give you.
 "emailAddress": "user@example.com", "historyId": "9876543210"

然后你可以例如如果相关用户在线,则通过Socket.io 向相关用户发出事件,并让他与客户端提供的 historyId 进行同步。

【讨论】:

感谢您提供的信息!我的域上没有 https,所以我尝试将我的应用程序停放在 heroku (fast-scrubland-4839.herokuapp.com) 上。按照上面的说明,我已经验证了域并将其添加到 Google 开发者控制台的推送部分。据我了解,我现在需要创建一个接收来自 gmail 推送的主题的订阅。我该怎么做呢?我正在使用pubsub.getTopics( pageSize: 3 , function(err, topics, nextQuery, apiResponse) ); 列出现有主题,但我没有看到日志中显示任何内容... @Sekoul 按照这里列出的步骤,你应该没问题:) developers.google.com/gmail/api/guides/push 你的服务器上还需要 https。使用快递?创建一条 Google 也可以推送的路线! 好吧,如果我理解正确,逻辑流程是这样的:我使用类似 pubsub.createTopic() 的东西创建主题 -> 我使用 topic.subscribe() 订阅主题 -> 我使用设置发布权限setIamPolicy()。此时,我订阅了一个主题,该主题在我的 gmail 帐户发生任何事情时都会收到更新。然后,我使用watch() 来跟踪我感兴趣的特定事件(在我的例子中,收件箱中收到了一条新消息)。这或多或少是正确的吗? @Sekoul 就是这样 :) 如果我没记错的话,如果您不是watch()ing,则不会使用配额,所以当您的用户注销时不要忘记stop() !

以上是关于Google Cloud Pub/Sub API - 推送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Google PubSub 模拟器是不是可以与 Google Cloud Pub/Sub API 客户端库一起使用?

Google Cloud Pub/Sub,使用 HTTP PUSH 请求发布

使用 Google Cloud pub sub 实现 MQTT

Cloud Pub/Sub API Explorer 不工作

Google Cloud Pus/Sub :: google.api_core.exceptions.DeadlineExceeded: 504 Deadline Exceeded

访问 Google Cloud Storage 触发事件“Pub/Sub”?