如何使用Google API Client区分回复邮件与普通邮件?(基于邮件列表获取场景)
判断Gmail邮件是否为回复邮件(PHP Google API Client)
嘿,我来帮你搞定这个问题!要区分回复邮件和普通邮件,核心得靠Gmail邮件头里的特定字段——这是最准确的判断方式,比看主题里的「Re:」靠谱多了。下面一步步来拆解:
1. 先获取单封邮件的完整详情
你现在用listUsersMessages拿到的只是邮件的ID和线程ID,没有包含判断所需的邮件头信息。所以得循环遍历你的$messageList,调用users_messages->get方法获取每封邮件的完整数据(记得指定format参数来拿到邮件头)。
示例代码:
foreach ($messageList as $message) { // 获取完整邮件数据,指定format为'full'以包含邮件头 $fullMessage = $service->users_messages->get('sender@mail.com', $message->getId(), ['format' => 'full']); // 提取邮件头信息 $headers = $fullMessage->getPayload()->getHeaders(); // 接下来判断是否为回复邮件... }
2. 检查邮件头里的关键字段
Gmail里的回复邮件会包含以下两个邮件头字段之一(或两者都有):
In-Reply-To: 直接指向被回复的那封邮件的Message-IDReferences: 包含当前邮件所属线程里的一系列Message-ID(包括被回复的邮件ID)
只要这两个字段里有任意一个存在且不为空,就可以判定这是一封回复邮件。
完整判断逻辑代码
把上面的循环补充完整,加入判断逻辑:
foreach ($messageList as $message) { $fullMessage = $service->users_messages->get('sender@mail.com', $message->getId(), ['format' => 'full']); $headers = $fullMessage->getPayload()->getHeaders(); $isReply = false; $subject = ''; // 遍历邮件头,查找目标字段和主题 foreach ($headers as $header) { $name = $header->getName(); if ($name === 'In-Reply-To' || $name === 'References') { if (!empty($header->getValue())) { $isReply = true; } } elseif ($name === 'Subject') { $subject = $header->getValue(); } } // 输出结果 echo "邮件ID: {$message->getId()} \n"; echo "主题: {$subject} \n"; echo $isReply ? "这是一封回复邮件\n" : "这是普通邮件\n"; echo "-------------------------\n"; }
3. 补充:主题里的「Re:」可以作为辅助判断
虽然有些用户会手动修改主题去掉「Re:」,但如果需要的话,也可以结合主题来辅助验证:
// 检查主题是否以Re:开头(不区分大小写) $hasRePrefix = strtolower(substr($subject, 0, 3)) === 're:';
不过还是优先用In-Reply-To和References字段,准确性更高。
注意事项
- 调用
users_messages->get时,确保你的API权限包含读取邮件内容的权限(比如https://www.googleapis.com/auth/gmail.readonly)。 - 如果邮件是线程里的第一封,那它的
In-Reply-To和References字段都会是空的,属于普通邮件。
内容的提问来源于stack exchange,提问作者Hiral Mavani
相关产品推荐
相关产品推荐

