imap_search с тире - PullRequest
       19

imap_search с тире

0 голосов
/ 30 августа 2018

У меня есть имя файла, которое создается на основе строки темы письма с помощью 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 () или заменой странного символа на некоторый тип подстановочного знака или использование регулярное выражение, чтобы разделить поиск объекта).

есть идеи?

1 Ответ

0 голосов
/ 17 сентября 2018

я исправил это как показано ниже:

$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' также может соответствовать, так что это не совсем без риска

...