带有破折号的imap_search

时间:2018-08-30 20:40:05

标签: php utf-8 imap

我有一个文件名,该文件名是使用imap_header()根据电子邮件的主题行生成的。具体来说:

$header = imap_header($imap, $m);
$email[$m]['subject'] = imap_utf8($header->subject);
$name = str_replace('/','~~',$email[$m]['subject']) . '[|].txt';  //replace slashes to avoid confusion in filenames 
file_put_contents($name, $contents)

在另一个脚本中,我处理了文件,然后我想根据主题行查找电子邮件并将其移到另一个电子邮件文件夹中。

$ffileA = explode('[|]',$ffile);
$subj = $ffileA[0];
$ms = imap_search($imap, 'SUBJECT "'.str_replace('~~','/',$subj).'"');
foreach($ms as $msg){
    imap_mail_move($imap, $msg, 'INBOX/Processed');
}
imap_expunge($imap); 

这几乎在所有情况下都有效,但是我刚遇到一封电子邮件,该邮件具有用于主题的=?utf-8?B编码(因此需要imap_utf8($ header-> subject))并带有破折号主题行。在服务器上,文件名带有―而不是破折号,并且imap_search找不到关联的电子邮件。 我假设我需要将其转换回imap_search将能够找到的格式。我可能可以使用str_replace为此单个特殊字符执行此操作,但我更希望能够处理类似怪异字符的一般情况(例如,使用iconv()或通过使用某种类型的通配符替换怪异字符或使用regex来拆分SUBJECT搜索)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我对此进行了如下修复:

$ffileA = explode('[|]',$ffile);
$subj = $ffileA[0];
$ssubj = preg_replace("/[^[:ascii:]]+/",'" SUBJECT "',$subj);
$ms = imap_search($imap, 'SUBJECT "'.str_replace('~~','/',$ssubj).'"');
foreach($ms as $msg){
    imap_mail_move($imap, $msg, 'INBOX/Processed');
}
imap_expunge($imap); 

这实际上将主题搜索拆分为任何非ASCII子字符串,因此

SUBJECT "abcdefâ€xyz" 

成为

SUBJECT "abcdef" SUBJECT "xyz"

由于imap_search具有隐式AND,因此这非常安全,尽管可以肯定也可以匹配主题'xyzabcdef',所以这并非完全没有风险