【问题标题】:Not able to use IMAP search无法使用 IMAP 搜索
【发布时间】:2014-06-25 00:39:24
【问题描述】:

我的电子邮件 ID 的电子邮件主题为“=?UTF-8?Q?=e2=99=a3?= Styles =?UTF-8?Q?=e2=99=a3?=" 现在我想使用 imap_search 搜索带有此主题行的电子邮件。但是我收到一个错误-:

Notice: Unknown: Unknown search criterion: STYLES (errflg=2) in Unknown on line 0

以下是我正在使用的搜索代码:

    $ToSearch=trim("=?UTF-8?Q?=e2=99=a3?= Styles to Freshen Up Your Home =?UTF-8?Q?=e2=99=a3?=");
        $unreadEmails= imap_search($loginToInbox,'SUBJECT  '.$ToSearch.' SINCE '.$dateToSearch.'');
var_dump($unreadEmails);

如何搜索带有主题行的电子邮件。

【问题讨论】:

    标签: php imap


    【解决方案1】:

    对我来说似乎很清楚:它被“样式”这个词绊倒了。那是因为有一个空格,所以它认为应该有一个新的 IMAP 关键字。尝试用引号括起来:

    $unreadEmails = imap_search($loginToInbox,'SUBJECT "'.$ToSearch.'" SINCE '.$dateToSearch);
    

    您还必须小心 $dateToSearch - 您可能还必须将其括在引号中,并确保它采用服务器期望的格式(很可能是 RFC2822 - 请参阅第 3.3 节,日期和时间规范。请参阅 this other question 以了解其外观示例。

    【讨论】:

    • RFC 3501 指定搜索日期格式,它没有时间部分,因此它不是 RFC 2822。
    • 有趣。请问日期格式是在哪个部分定义的?
    • 在 6.4.4 中举例说明:C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith" 在形式语法第 9 节、search-keydate 和相关语法说明符中定义。
    【解决方案2】:

    该代码非常危险——它包含“IMAP 命令注入”,类似于将用户控制的数据直接传递到 SQL 数据库中的 SQL 注入。

    在将用户提供的数据输入 IMAP 连接之前,您绝对必须对其进行清理。阅读RFC3501,了解如何传输字符串,了解 PHP 的imap_search 是否可以免费为您做一些事情(当涉及到文字时,您不想从应用程序代码中处理它们),并确保您仅将经过清理的数据传递给服务器。

    当前版本的代码容易出现严重错误;攻击者可以通过它删除所有电子邮件。

    【讨论】:

    • 您的问题是“为什么我收到错误消息未知搜索条件:样式”。再次阅读我的答案,了解 RFC3501 中定义的 quoted-string 语法的要求,并查看您实际传递给 IMAP 服务器的内容。服务器将如何解释该字符串?完成此操作后,您就会知道为什么会收到错误消息。
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多