未读电子邮件标签



在PHP中,使用Gmail api我正在获取客户的gmail收件箱。

Array ( ['maxResults'] => 50, ['labelIds'] => INBOX, ['q'] => is:unread)

我正在邮箱/gmail中搜索未读电子邮件,但我收到1封标有

的电子邮件
[labelIds] => Array([0] => Label_2 [1] => SENT). 

Gmail如何将这封电子邮件识别为unread,以及我可以根据什么unread突出显示这封电子邮件? 我的第二个问题是电子邮件标有SENT为什么它出现在INBOX

$service = new Google_Service_Gmail($client);
$batch = new Google_Http_Batch($client);
$userId='me';
$threads = array();
$pageToken = NULL;
$param = array();
$getPageToken = $getParam('pageToken');
if ($getPageToken && $getPageToken!='') {
$param['pageToken'] = $getPageToken;
$pageToken = $getPageToken;
}
if($getParam('limit'))
$param['maxResults']=$getParam('limit');
else
$param['maxResults'] = 50;
if($getParam('in')) {
$this->view->in=$getParam('in');
$param['labelIds'] = strtoupper($this->view->in);
}
else
$param['labelIds'] = 'INBOX';
$search = "";
$read = $getParam('read_status');
if($read && (@$read=='read'||$read=='unread'))
$search = 'is:'.$read;
if($getParam('search')) {
$this->view->search = $getParam('search');
$search .= " ".$this->view->search;
}
if($search)
$param['q'] = $search;
$threadsResponse=$this->gmailApi->get_threads($service,$userId,$param);
if($threadsResponse) {
$threads=$threadsResponse->getThreads();
$this->view->next_page=$threadsResponse->getNextPageToken();
$client->setUseBatch(true);
foreach ($threads as $key => $val) {
$thread = $service->users_threads->get($userId, $val->id,['format' => 'full', 'metadataHeaders' => ['From','Date','Subject']]);      
$batch->add($thread, "mail-".$val->id);
}
$results = $batch->execute();
$threads=$this->gmailApi->get_batch_messages($service,$userId,$results);

谁能告诉我这是否是这里产生的问题(https://issuetracker.google.com/issues/135166258(

您只搜索未读的电子邮件。 如果您想要未读和收件箱标签,请尝试使用

q = label:unread label:inbox 

将来,测试gmail搜索的最简单方法是在gmail网络应用程序中,您可以在那里获得所需的搜索结果,然后将其复制到q中即可。

检索带有"收件箱"标签的所有线程,然后检索这些线程的所有邮件。

请注意,线程包含传入和传出消息。

因此,它将包含标签"收件箱"(用于传入邮件(,但是

如果列出线程的所有消息,则还将列出已发送的消息。

而不是查询

$this->gmailApi->get_threads($service,$userId,$param);

你需要使用

$service->users_messages->listUsersMessages($userId, $param);

labelIds[]指定为此方法的可选参数。

为什么?

  • 如果查询q参数为"is:unread"并labelIds"INBOX"的线程,则结果将包含收件箱中至少包含一封未读邮件的所有线程。
  • 如果在下一步中检索属于这些线程的所有邮件,则将获得属于这些线程的所有邮件 - 其中一些邮件可能会在收件箱中被读取和/或不被读取。
  • 相反,您只需要直接查询所有带有"is:unread"q和"INBOX"labelIds邮件(而不是线程(

基于您的代码的示例代码片段:

//the following code works only if setUseBatch() is set to false
$client->setUseBatch(false);
$messagesResponse = $service->users_messages->listUsersMessages($userId, $param);
if ($messagesResponse) {  
$messages = $messagesResponse->getMessages();
foreach ($messages as $key => $val) {
print ("n unread message id ".$val->id."n");
}
}

最新更新