添加说明

用户贡献的说明 18 个说明

Steve
2 年前
已经注意到 imap_search 在 imap4 语法中会中断。要执行 imap 4 搜索,请使用 curl 并发送自定义命令,然后获取结果。最好执行 UID 搜索以获取以后使用的唯一 ID。以下是一个带有效 curl 函数的示例。

<?php
$host
= 'your-server.tld';
$user = 'username';
$pass = 'password';
$folder = 'INBOX';

function
send_imap_command($server, $user, $pass, $command, $folder="INBOX")
{
//直接向IMAP服务器发送IMAP命令

$result=["response"=>"", "error"=>""];
$url = "imaps://$server/". rawurlencode($folder);
$options=[CURLOPT_URL=>$url, CURLOPT_PORT=> 993, CURLOPT_USERNAME=> $user,
CURLOPT_PASSWORD=> $pass, CURLOPT_RETURNTRANSFER=> true, CURLOPT_HEADER=> true,
CURLOPT_CUSTOMREQUEST=> $command];
$ch = curl_init();
curl_setopt_array($ch, $options);

$result["response"] = curl_exec($ch);
if(
curl_errno($ch)) $response["error"]="Error (". curl_errno($ch) ."): ". curl_error($ch);

return
$result;
}

//使用curl从收件箱中提取远程邮件服务器返回的所有无法投递的电子邮件
$response=send_imap_command($host, $user, $pass,
'UID SEARCH SINCE "01-Jan-2022" (OR FROM "mailer-daemon" FROM "postmaster") (OR SUBJECT "fail" (OR SUBJECT "undeliver" SUBJECT "returned"))',
$folder);

if(
$response["error"]!="")
{
echo
$response["error"]."\n";
} elseif (
strlen($response["response"])>5){
//服务器返回一个字符串,形式为* SEARCH uid1 uid2 uid3 ... 清理并创建UID数组。
$response["response"]=str_replace("* SEARCH ","",$response["response"]);
$messages=explode(" ",$response["response"]);
}

print_r($messages);
?>
Anonymous
12 years ago
例如,RFC3501 中的 SINCE 的日期格式为

date = date-text / DQUOTE date-text DQUOTE

date-day = 1*2DIGIT
; 月份中的日期

date-day-fixed = (SP DIGIT) / 2DIGIT
; date-day 的固定格式版本

date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

date-text = date-day "-" date-month "-" date-year

因此,有效的日期例如为 "22-Jul-2012",带或不带双引号。
mail at nikha dot org
10 years ago
您好,
请注意,imap_search() 不会(如您预期的那样)在没有找到任何内容时返回空数组!
如手册所述,它返回 FALSE。

不要像我那样使用 "count($array)" 来测试结果。
对于空结果,这会为您提供 1。花了我一个小时才发现原因 :-( RTFM
britty dot it at hotmail dot com
8 years ago
imap_search 函数与 IMAP4 不完全兼容。目前使用的 c-client 只支持 IMAP2,因此某些搜索条件将无法使用,例如 "OR"

因此,类似于以下的 PHP 代码
$inbox = imap_open('{imap.example.com:993/imap/ssl}INBOX', '[email protected]', 'pass123', OP_READONLY);
$search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"';
$emails = imap_search($inbox, $search_string);

将抛出错误,提示 "Unknown search criterion"

观察结果和参考

PHP 源代码跟踪:(参考:https://github.com/php/php-src/blob/master/ext/imap/php_imap.c
/ext/imap/php_imap.c -> 行号:4126
imap_search => 行号:4148

c-client 库源代码跟踪
src/c-client/mail.c -> 行号:3973

internal.txt -> 行号:1919 => mail_criteria()
criteria IMAP2 格式搜索条件字符串
警告:此函数不接受 IMAP4 搜索条件。

IMAP2 RFC1064 => [参考:https://tools.ietf.org/html/rfc1064] [页码:13]
IMAP4 RFC2060 => [参考:http://www.faqs.org/rfcs/rfc2060.html] [部分:6.4.4]

注意
核心模块(IMAP)中的核心搜索功能在 PHP 中仍然不可用。希望这能引起开发者社区的关注...
james at medbirdie dot com
11 years ago
设置自己的 CHARSET,如果您处理中日韩查询,这很有用。

<?php imap_search($inbox,'BODY "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
Enriqe
3 years ago
请注意邮件的 UID。
它不是永远不变的 ID!

如果您将邮件移动到 IMAP 帐户中的另一个文件夹,此 UID 将会更改。

因此,如果您的邮件在 INBOX 文件夹中的 UID 为 100,您将其移动到某个子文件夹,然后又移回 INBOX,它在 INBOX 中的新 UID 将为 101。
joseph dot cardwell at jbcwebservices dot com
12 years ago
当连接参数中设置了 op_silent 标志时,imap_search() 始终返回 false。
Paula
7 years ago
这是使用 imap_search 的正确方法,方法是使用 ON "date"

$date = date("j F Y");

$emails = imap_search($inbox,'ON "'.$date.'"' );
oliver at samera dot com dot py
21 years ago
imap_search() 只支持 IMAP2 搜索条件,因为该函数 mail_criteria()(来自 c-client 库)用于在 ext/imap/php_imap.c 中解析搜索字符串。
IMAP2 搜索条件在 RFC 1176 的“tag SEARCH search_criteria”部分中定义。
trimoreau dot yonn at gmail dot com
11 years ago
无法使用此函数查找包含双引号的字符串。

例如,如果您有一封名为:Hello, this is "Bob" 的邮件
您可以尝试
imap_search($inbox, 'SUBJECT "Hello, this is "Bob""')
或者
imap_search($inbox, "SUBJECT 'Hello, this is \"Bob\"'")

但两者都是 false,因为您没有在第一种情况下转义双引号,而且您不能在第二种情况下在 imap_search 条件中的 SUBJECT 后使用单引号。

真正的问题是,您不能使用单引号将您的条件括起来,以作为 imap_search 的第二个参数,在 SUBJECT 之后。
admin at rancid-tea dot com
16 years ago
此搜索将查找与所有条件匹配的邮件,而不是任何条件。例如,搜索

imap_search($mailbox,'FROM "user" TO "user"')

将返回在发件人和收件人标头中都包含“user”的邮件,但不返回在发件人或收件人标头中包含“user”的邮件。
Brett
12 years ago
我还没有找到有关允许的日期格式的任何文档,但(例如)“14 May 2012”可以使用。

// 查找过去一周内的邮件的 UID
$date = date ( "d M Y", strToTime ( "-7 days" ) );
$uids = imap_search ( $mbox, "SINCE \"$date\"", SE_UID );
andrea dot job at libero dot it
9 years ago
关于条件的第二个参数在 ON 条件上不能正常工作。
实际上,如果我想要将来自 $_get 的参数放入 Day-Month-Year 格式(例如 01-01-14),它将返回 Unknown criterion 等。
可能格式不正确?

即使使用例如 Thu-Jan-2014,也会收到相同的错误信息。
samy.sadi.contact in gmail
4 years ago
outlook 365 不支持 utf-8 字符集。因此,如果您传递该字符集,您可能会在这里收到 false 返回值。
oliver at samera dot com dot py
22 years ago
如果 imap_search() 不理解搜索条件或没有找到邮件,它将返回 false。

$emails imap_seach($mbox, "UNDELETED SENTSINCE 01-Jan-2002");
if($emails === false)
echo "The search failed";
Anonymous
9 years ago
关于我之前的笔记

<<关于条件的第二个参数在 ON 条件上不能正常工作。
实际上,如果我想要将来自 $_get 的参数放入 Day-Month-Year 格式(例如 01-01-14),它将返回 Unknown criterion 等。
可能格式不正确?

即使使用例如 Thu-Jan-2014 也收到相同的消息。>>
------------------------------------------------------------------------

现在可以了;)

只需将一个非日期字符串传递到 criteria 参数,而不是使用 mktime 函数返回的时间戳,您可以在其中放入您的日期字符串。

任何日期/时间条件的解决方案都是 unix 时间戳。
tgely
7 years ago
如果电子邮件主题被编码,请使用编码字符集和选项在搜索中查找内容。

邮件头

主题:=?UTF-8?Q?XYZ?=

<?php imap_search($inbox,'SUBJECT "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
anonymous at anonymous dot ru
10 years ago
函数 "imap_search" 对某些邮件不起作用,可能是由于标题语法或某些错误。

非常感谢
To Top