当前位置: 首页 > 知识库问答 >
问题:

如何根据“收件人”标题进行IMAP搜索(或者如何使用gmail imap扩展?)

储俊英
2023-03-14

我需要通过imap / php搜索gmail邮件(谷歌工作应用程序)。但是,imap_search标准不足以捕获有问题的消息。

我使用的代码如下所示:

$imap = imap_open("{imap.gmail.com:993/imap/ssl}Label1/label2", $user_email, $user_passwd);

$msg_list = imap_search($imap, 'TEXT "Delivered-To: username+label@gmail.com"');

imap_close($imap);

imap_search调用未返回任何内容。

我做了一些研究,看起来我可以通过gmail搜索语法< code>X-GM-RAW基于“Delivered-To”标题字段过滤邮件,但我就是无法实现这一点,我尝试了所有这些呼叫(以及更多):

$msg_list = imap_search($imap, 'UID SEARCH X-GM-RAW "deliveredto:username+label@gmail.com"');
$msg_list = imap_search($imap, 'SEARCH X-GM-RAW "deliveredto:username+label@gmail.com"');
$msg_list = imap_search($imap, 'X-GM-RAW "deliveredto:username+label@gmail.com"');

但是没用,有人知道我的代码有什么问题吗?

共有1个答案

东和怡
2023-03-14

好吧,要么我不知道如何提问,要么他们很忙,要么我在问一些困难的问题。

无论如何,现在我知道PHP内置的imap_*函数不处理直接IMAP命令,所以我必须使用zend框架(对我的需求来说太重了),或者通过套接字直接连接到imap。

我选择了第二个选项,代码如下(从这里偷来的代码并适应我自己的需要),以防有人需要它:

<?php
// Open a socket
if (!($fp = fsockopen('ssl://imap.gmail.com', 993, $errno, $errstr, 15))) die("Could not connect to host");

// Set timout to 1 second
if (!stream_set_timeout($fp, 1)) die("Could not set timeout");

// Fetch first line of response and echo it
echo fgets($fp);

// =========================================
fwrite($fp, "0001 LOGIN user.name@gmail.com YOUR_PASSWORD_HERE_WITHOUT_QUOTES\r\n");
// ie. fwrite($fp, "0001 LOGIN super.dude@gmail.com pass123\r\n");

// Keep fetching lines until response code is correct
while ($line = trim(fgets($fp)))
{
    echo "Line = [$line]\n";
    $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
    $code = $line[0];

    if (strtoupper($code) == '0001') {
        break;
    }
}
// =========================================

fwrite($fp, "0002 SELECT Inbox\r\n");

// Keep fetching lines until response code is correct
while ($line = trim(fgets($fp)))
{
    echo "Line = [$line]\n";
    $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
    $code = $line[0];

    if (strtoupper($code) == '0002') {
        break;
    }
}
// =========================================

fwrite($fp, "0003 SEARCH X-GM-RAW \"deliveredto:user.name+someLabel@gmail.com\"\r\n");
// Keep fetching lines until response code is correct
while ($line = fgets($fp))
{
    echo "Line = [$line]\n";
    $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
    $code = $line[0];

    if (strtoupper($code) == '0003') {
        break;
    }
}

fclose($fp);
echo "I've finished!";
?>

瞧!只需复制并粘贴,现在您就可以直接从PHP访问gmail语法!(如果你喜欢:p,嘿投票)

 类似资料:
  • 是的,我对这个问题非常认真。使用pip搜索是如何工作的? 关键字

  • 问题内容: 在Mockito 文档和javadocs中,它说 建议将ArgumentCaptor用于验证,但不能用于存根。 但我不明白如何将ArgumentCaptor用于存根。有人可以解释上面的陈述并显示ArgumentCaptor如何用于存根或提供显示其完成方式的链接吗? 问题答案: 假设使用以下方法进行测试: 文档的Mockito说,你应该 不 以这种方式使用的捕手: 因为您只能在存根期间使

  • 问题内容: 我有两个具有以下映射的索引(我将简化它们的映射): 1)AccountType映射: 2)ProductType映射: 现在,我有几件事需要弄清楚: 1)首先,有一个索引是一个好主意,在我的情况下是帐户,并且产品是嵌套对象,但是在这里每次我要更新/添加新产品时,我都必须重新索引(更新)整个帐户文件? 2)我的第二个问题是:我想具有搜索功能,因此,如果用户通过在文本框中键入内容进行搜索,

  • 问题内容: 我正在使用Hibernate 4和Lucene 3.6。我对构面计数有要求。根据我的要求,我有一个实体“产品”。实体“产品”具有某些属性,例如ID,颜色,品牌。 现在,我的要求是,我想以多维方式获取该实体的商品数,并获取红色(彩色)耐克(品牌)服装的数量。 所以举个例子。我的数据库中保存了以下产品实体。 id品牌颜色 1锐步红 2锐步黑 3锐步绿 4利红 5利黑 6利黑 现在,我希望我

  • 在这里,我可以搜索python。 我希望放置负模式,实际上应该不会产生任何结果或不匹配。 当字符串包含python但字符串“在python上工作很容易”中不包含容易时,我喜欢使用re.search。我该怎么做?同时使用正负条件。

  • 我目前正在研究如何在我的项目中实现搜索。我有一个名为users的表,它有两列,firstName和lastName。我希望能够在这两列之间搜索,例如,用户的名字是John,姓是Smith,因此当他们搜索John Smith时,它将返回具有该名称的用户。 或者他们可以只搜索名字等。解决这个问题的方法是什么? 使用PostgreSQL的全文功能是正确的途径吗?我目前正在使用Node w/TypeORM