【问题标题】:Mark as read mail method标记为已读邮件方法
【发布时间】:2014-12-18 02:21:09
【问题描述】:

如何使用 Gmail API 将邮件标记为已读?

我收到了邮件

Thread thread = service.users().threads().get(userId, message.getThreadId()).execute();

但它没有 gmail API 网站所说的 ma​​rkRead 方法。

【问题讨论】:

标签: gmail-api


【解决方案1】:

使用threads.modify() 或messages.modify()(取决于你想要做的事情的范围)和“UNREAD”的removeLabelId。

https://developers.google.com/gmail/api/v1/reference/users/threads/modify

【讨论】:

    【解决方案2】:

    在 nodejs 示例中:

    var google = require('googleapis');
    var gmail = google.gmail('v1');
    var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
    oauth2Client.credentials = JSON.parse(token);
    google.options({ auth: oauth2Client }); // set auth as a global default
    
    gmail.users.messages.modify({
            'userId':'me',
            'id':emailId,
            'resource': {
                'addLabelIds':[],
                'removeLabelIds': ['UNREAD']
            }
        }, function(err) {
            if (err) {
                error('Failed to mark email as read! Error: '+err);
                return;
            }
            log('Successfully marked email as read', emailId);
        });
    

    【讨论】:

      【解决方案3】:

      当我来到这里用 C# 寻找这个答案时,这是我的经验的答案:

      var gs = new GmailService(
                      new BaseClientService.Initializer()
                      {
                          ApplicationName = gmailApplicationName,
                          HttpClientInitializer = credential
                      }
                  );
      var markAsReadRequest = new ModifyThreadRequest {RemoveLabelIds = new[] {"UNREAD"}};
                                  await gs.Users.Threads.Modify(markAsReadRequest, "me", unreadMessage.ThreadId)
                                          .ExecuteAsync();
      

      【讨论】:

        【解决方案4】:

        这里是 Java 版本,可能有人需要。

        1. 首先,您可以列出所有标签,如下例所示。 欲了解更多信息,请查看here
            public void listLabels(final Gmail service, final String userId) throws IOException {
                    ListLabelsResponse response = service.users().labels().list(userId).execute();
                    List<Label> labels = response.getLabels();
                    for (Label label : labels) {
                      System.out.println("Label: " + label.toPrettyString());
                    }
                  }
        
        1. 修改与它相关联的每条消息所需的标签,如下所示:有关它的更多信息去here
            public void markAsRead(final Gmail service, final String userId, final String messageId) throws IOException {
                    ModifyMessageRequest mods =
                            new ModifyMessageRequest()
                            .setAddLabelIds(Collections.singletonList("INBOX"))
                            .setRemoveLabelIds(Collections.singletonList("UNREAD"));
                    Message message = null;
                
                    if(Objects.nonNull(messageId)) {
                      message = service.users().messages().modify(userId, messageId, mods).execute();
                      System.out.println("Message id marked as read: " + message.getId());
                    }
                  }
        

        【讨论】:

          【解决方案5】:

          如果其他人使用 Golang API 偶然发现了这一点。以下是你可以做到的:

          msg, err := gmail.Users.Messages.Modify("me", msg.Id, &gmail.ModifyMessageRequest{
             RemoveLabelIds: []string{"UNREAD"},
          }).Do()
          

          【讨论】:

            【解决方案6】:

            iOS Swift 中的示例:

            class func markAsReadMessage(messageId: String) {
                let appd = UIApplication.sharedApplication().delegate as! AppDelegate
                println("marking mail as read \(messageId)")
                let query = GTLQueryGmail.queryForUsersMessagesModify()
                query.identifier = messageId
                query.removeLabelIds = ["UNREAD"]
                appd.service.executeQuery(query, completionHandler: { (ticket, response, error) -> Void in
                    println("ticket \(ticket)")
                    println("response \(response)")
                    println("error \(error)")
                })
            }
            

            【讨论】:

              【解决方案7】:

              有两个步骤来实现这一点。我使用 Gmail 客户端库,可在此处获得,特别是来自示例文件夹 get_token.php 和 user-gmail.php: PHP Gmail Client Library

              我也使用了该功能进行修改,在此处可用: Gmail API Modify Message Page

              首先您必须指定您希望拥有修改权限。在示例中,它们仅向您显示只读范围,但您可以在数组中添加其他范围。

              $client->addScope(implode(' ', array(Google_Service_Gmail::GMAIL_READONLY, Google_Service_Gmail::GMAIL_MODIFY)));
              

              我想保留相同的标签,并将邮件标记为已读。所以对于一条消息:

              $arrLabels = $single_message->labelIds;
              foreach($arrLabels as $label_index=>$label) {
                  if ($label=="UNREAD") {
                      unset($arrLabels[$label_index]);
                  }
              }
              

              现在您可以发送修改请求,该邮件将从您的 Gmail 帐户的未读列表中删除。

              modifyMessage($service, "me", $mlist->id, $arrLabels, array("UNREAD"));
              

              其中“我”是user_id

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-10-08
                • 2011-12-02
                • 2015-01-15
                • 2013-02-02
                • 2014-10-19
                • 2017-09-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多