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