如何在安卓Gmail应用中使用Google Cloud Pub/Sub实现邮件接收功能
安卓端集成Google Cloud Pub/Sub实现Gmail新邮件接收方案
前置配置(Google Cloud端)
- 登录Google Cloud Console创建项目,依次启用
Gmail API和Cloud Pub/Sub API - 进入Pub/Sub主题页,创建自定义主题,给该主题添加发布权限,授权账号固定为
gmail-api-push@system.gserviceaccount.com,角色选Pub/Sub发布者 - 创建对应主题的订阅,安卓端优先选择拉取订阅模式,不需要额外配置推送端点
- 调用Gmail API的
users.watch接口,将你的Gmail账号和Pub/Sub主题绑定,配置需要监听的邮件事件触发规则,后续有新邮件到达时Gmail会自动推送消息到绑定的Pub/Sub主题
安卓端集成步骤
- 模块级build.gradle添加Pub/Sub依赖,同时排除重复依赖避免编译冲突:
dependencies { implementation ('com.google.cloud:google-cloud-pubsub:1.123.0') { exclude group: 'com.google.guava', module: 'listenablefuture' } }
- 身份认证:通过Google Sign-In获取用户的OAuth 2.0令牌,授权范围需同时包含
https://www.googleapis.com/auth/gmail.readonly和https://www.googleapis.com/auth/pubsub,禁止直接在安卓端打包服务账号密钥,存在严重泄露风险 - 后台拉取消息核心逻辑,必须在子线程/协程/WorkManager中执行,禁止在主线程运行:
// 初始化Pub/Sub客户端 val pubSubService = PubSubOptions.newBuilder() .setCredentials(GoogleCredentials.create(userOAuthToken)) .build() .service // 拉取订阅消息,单次最多拉取10条 val pullRequest = PullRequest.newBuilder() .setSubscription("projects/你的Google Cloud项目ID/subscriptions/你的订阅名称") .setMaxMessages(10) .build() val pullResponse = pubSubService.pull(pullRequest) // 遍历处理收到的消息 pullResponse.receivedMessagesList.forEach { receivedMessage -> // 解析消息内容,获取新邮件的元数据 val mailNotification = receivedMessage.message.data.toStringUtf8() // 这里可调用Gmail API的get方法,根据邮件ID拉取完整邮件内容展示 // 处理完成后发送确认,避免消息重复投递 pubSubService.acknowledge( AcknowledgeRequest.newBuilder() .setSubscription("projects/你的Google Cloud项目ID/subscriptions/你的订阅名称") .addAckIds(receivedMessage.ackId) .build() ) }
优化建议
- 不需要实时刷新的场景下,用WorkManager设置周期拉取任务,最小间隔建议15分钟,降低电量和流量消耗
- 需要实时通知的场景,可自行搭建后端服务接收Pub/Sub的推送,再通过FCM给安卓端发静默通知触发拉取,不要在安卓端保持长连接监听,耗电过高
- 可给订阅设置消息保留时长,最长可保留7天,避免用户长时间不打开应用错过邮件通知
内容的提问来源于stack exchange,提问作者Sagar Dholariya
相关产品推荐
相关产品推荐

