我想开始同步用户邮箱,因此我需要用户邮箱的最新historyId。似乎没有办法通过一次API调用获得此功能。
gmail.users.history.list端点包含一个historyId,它似乎是我需要的,来自文档:
historyId unsigned long The ID of the mailbox's current history record.
但是,要从此端点获得有效响应,您必须提供startHistoryId
作为参数。
我看到的唯一选择是发出列出用户消息的请求,从中获取最新的历史记录ID,然后向gmail.users.history.list发出请求,提供historyid以获取最新消息。
其他想法?
答案 0 :(得分:4)
你看了https://developers.google.com/gmail/api/guides/sync吗?
根据您的用例,为了避免您当前状态与开始转发同步之间的比赛,您需要提供适当的historyId。如果有"获取当前历史记录ID"然后你之前的状态和你获得这些结果之间的任何东西都会丢失。如果您没有任何特定的现有状态(例如,只想获得更新并且在此之前不关心任何事情)那么您可以使用任何返回的historyId(例如,在消息或线程上)。
答案 1 :(得分:0)
C#
个用户的小例子(@EricDeFriez
的评论中提到)。
必须安装Nuget包Google.Apis.Gmail.v1
。另请参阅quickstart for .NET developers。
var service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
var req = service.Users.GetProfile("me");
req.Fields = "historyId";
var res = req.Execute();
Console.WriteLine("HistoryId: " + res.HistoryId);
答案 2 :(得分:0)
此答案与使用服务帐户的Java Gmail API客户端库有关。
我发现gmail.users.getprofile()
不能工作,因为它返回的对象是Class Gmail.Users.GetProfile
类型的对象,它没有获取historyId的接口。
com.google.api.services.gmail.model.Profile
实际上具有一个getHistoryId()
函数,但是调用service.users().getProfile()
将返回一个Class Gmail.Users.GetProfile
对象。
要解决此问题,我使用了history.list()函数,该函数将始终返回最新的historyId作为其响应的一部分。
Gmail service = createGmailService(userId); //Authenticate
BigInteger startHistoryId = BigInteger.valueOf(historyId);
ListHistoryResponse response = service.users().history().list("me")
.setStartHistoryId(startHistoryId).setMaxResults(Long.valueOf(1)).execute();
我将结果的最大数量设置为1,以限制返回的不必要数据,并且我将收到如下所示的有效负载:
{“ history”:[{“ id”:“ XXX”,“消息”:[{“ id”:“ XXX”,“ threadId”:“ XXX”}]}]],“ historyId”:“ 123456 “,” nextPageToken“:” XXX“}
historyId(123456)将是用户的当前historyId。您可以使用response.getHistoryId()
如果您为Users.history:list使用API测试器,您还可以看到响应中提供了最新的historyId。
https://developers.google.com/gmail/api/v1/reference/users/history/list