【问题标题】:UNREAD email labels未读电子邮件标签
【发布时间】:2020-01-21 13:07:53
【问题描述】:

在 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);

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

【问题讨论】:

  • 以后有没有机会发布您的 PHP 代码来帮助他人?
  • 使用 Try this API 进行测试以了解问题是源自请求本身还是它在 PHP 中的实现总是很有用:developers.google.com/gmail/api/v1/reference/users/messages/…
  • @ziganotschka 如何使用Try this API 我没有登录详细信息
  • @softech 您可以使用用于访问收件箱的同一 Google 或 Gmail 帐户登录
  • @ziganotschka 这个问题出在一个客户的 gmail 帐户中,我无法将其复制到我的 gmail 中,如果我使用用于访问我的收件箱的同一个 Google 或 Gmail 帐户登录,那么它会给我的收件箱

标签: php gmail-api


【解决方案1】:

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

q = label:unread label:inbox 

将来测试gmail搜索最简单的方法是在gmail网络应用程序中,你可以在那里得到你想要的搜索结果,然后把它复制到q中。

【讨论】:

  • 同样的结果,仍然收到那封电子邮件
【解决方案2】:

您检索所有带有“收件箱”标签的话题,然后检索这些话题的所有消息。

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

因此它将包含标签“收件箱”(用于传入的消息),但是

如果你列出线程的所有消息,你也会列出发送的消息。

而不是查询

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

你需要使用

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

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

为什么?

  • 如果您查询带有“is:unread”作为q参数和labelIds“INBOX”的线程,结果将包含收件箱中至少包含一个未读消息的所有线程.
  • 如果在下一步中检索属于这些线程的所有消息,您将获得属于这些线程的所有消息 - 其中一些可能已被阅读和/或不在收件箱中。李>
  • 相反,您只需使用q "is:unread" 和labelIds "INBOX" 直接查询所有这些消息(而不是线程)

基于您的代码的示例代码 sn-p:

//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");
  }
 }

【讨论】:

  • 不,我仅使用您提到的相同方法列出收件箱标签
  • 如果我没记错的话,你得到的是列出线程的所有消息,而不是列出所有带有指定标签的消息
  • 我正在INBOX 中搜索unread 电子邮件,我已经提到了我正在传递的参数列表。但作为回应,我收到 1 或 2 封没有收件箱标签或未读标签的电子邮件
  • @softech:我更新了我的答案,希望现在更清楚了。
  • @ziganotchka 我知道我的代码结果将包含所有线程,这些线程在收件箱中至少包含一条未读消息,但是当我打开该线程时只有一条消息,而且我的第二个问题是电子邮件标有 SENT 怎么会出现在 INBOX 中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多