PHP 日本大会 2024
添加注释

用户贡献的注释 8 条注释

匿名用户
12 年前
例如,SINCE 的日期格式根据 rfc3501 为

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",带或不带双引号。
Steve
2 年前
已注意到imap_search函数与imap4语法不兼容。要执行imap4搜索,请使用curl发送自定义命令,然后获取结果。最好进行UID搜索以获取唯一的ID,以便以后使用。以下是一个带有可运行curl函数的示例。

<?php
$host
= '你的服务器地址.tld';
$user = '用户名';
$pass = '密码';
$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"]="错误 (". 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);
?>
mail at nikha dot org
10年前
你好:
请注意,imap_search() 函数并不会(正如你预期的那样)在未找到任何结果时返回一个空数组!
正如手册中所说,它返回 FALSE。

不要像我那样使用 "count($array)" 来测试结果。
对于空结果,这会返回 1。我花了一个小时才找出原因 :-( 仔细阅读手册
britty dot it at hotmail dot com
8年前
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
12 年前
设置你自己的字符集,这在处理中文、日文和韩文查询时非常有用。

<?php imap_search($inbox,'BODY "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
Enriqe
4年前
请注意邮件的 UID。
它并非一个永不改变的 ID!

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

因此,如果你的邮件在 INBOX 文件夹中的 UID 为 100,你将其移动到某个子文件夹,然后又移回 INBOX,则其在 INBOX 中的新 UID 将为 101。
Paula
8年前
这是使用 imap_search 和 ON "date" 的正确方法:

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

$emails = imap_search($inbox,'ON "'.$date.'"' );
joseph dot cardwell at jbcwebservices dot com
12 年前
当连接参数中设置了 op_silent 标志时,imap_search() 始终返回 false。
To Top