duanche5149 2014-09-30 23:12
浏览 147
已采纳

如何根据“Delivered-To”标题(或如何使用gmail imap扩展名?)进行IMAP搜索?

I need to search gmail messages (google apps for work) via imap/php. However, imap_search criterias are not enough to catch the messages in question.

The code I use looks like this:

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

The imap_search call didn't return anything.

I did some research, it seems I can filter messages based on "Delivered-To" header field via the gmail search syntax X-GM-RAW, but I just couldn't achieve this, I tried all these calls (and more):

$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"');

But it didn't work, anyone knows what's wrong with my code?

  • 写回答

1条回答 默认 最新

  • dongmangji0950 2014-10-02 13:10
    关注

    OK, either I don't know how to ask questions, SOers are busy, or I'm asking difficult questions.

    Anyway, now I know the imap_* functions built-into PHP don't handle direct IMAP commands, so I had to either use the zend framework (too heavy for my needs), or directly connect to imap via sockets.

    I chose the second option, the code is as follow (code stolen from here and adapted for my own needs), in case someone needs it:

    <?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
    ");
    // ie. fwrite($fp, "0001 LOGIN super.dude@gmail.com pass123
    ");
    
    // Keep fetching lines until response code is correct
    while ($line = trim(fgets($fp)))
    {
        echo "Line = [$line]
    ";
        $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
        $code = $line[0];
    
        if (strtoupper($code) == '0001') {
            break;
        }
    }
    // =========================================
    
    fwrite($fp, "0002 SELECT Inbox
    ");
    
    // Keep fetching lines until response code is correct
    while ($line = trim(fgets($fp)))
    {
        echo "Line = [$line]
    ";
        $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\"
    ");
    // Keep fetching lines until response code is correct
    while ($line = fgets($fp))
    {
        echo "Line = [$line]
    ";
        $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
        $code = $line[0];
    
        if (strtoupper($code) == '0003') {
            break;
        }
    }
    
    fclose($fp);
    echo "I've finished!";
    ?>
    

    Voila! Just copy and paste and now you have access to the gmail syntax right from PHP! (Hey vote if you like :p)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了