$Subj=$Subject; $arr_parts=array();
#Если есть кодированный текст, то разбиваем на части
while ( FALSE!==($begin=strpos($Subj, '=?')) ) { #Пока есть маркеры начала кодированного текста
if ( 0!==$begin ) { #Если маркер не в самом начале строки
$part=substr($Subj, 0, $begin); # Отпилим некодированный кусочек от начала и до маркера включительно
$Subj=substr($Subj, $begin); # Выпилим этот кусочек из темы от маркера и до конца
} else { #Тут надо искать два следующих знака вопроса
# =?windows-1251?B? # =?utf-8?Q?
# ^--$begin | ^--$coding_type_end
# |--$codepage_end
$codepage_end=strpos($Subj, '?', $begin+2);
$codepage=substr($Subj, $begin+2, $codepage_end-2);
$coding_type_end=strpos($Subj, '?', $codepage_end+1);
$coding_type=substr($Subj, $codepage_end+1, $coding_type_end-$codepage_end-1);
$Subj=substr($Subj, $coding_type_end+1); # Выпилим всё из темы сначала и до знака вопроса $coding_type_end
##### А вот дальше до конечного маркера идёт кодированный текст, его выковыриваем в $encoded_text
if ( $end=strpos($Subj, '?=') ) {# Если нашли конец
$encoded_text=substr($Subj, 0, $end); # Отпилим кусочек от начала и ДО маркера включительно
$Subj=substr($Subj, $end+3); # Выпилим этот кусочек из темы от маркера и до конца
} else { # Маркера нету - значит остался кодированный текст до конца строки
$encoded_text=$Subj; $Subj='';
}#end if
if ( 'Q'===strtoupper($coding_type) ) {# Если тип Quoted Printable c =
$decoded_text = preg_replace("/\=/","%", $encoded_text); # то меняем = на % для urlDecode
$part=rawurldecode($decoded_text);
} else { #Иначе кодировка Base64
$text="=?$codepage?$coding_type?$encoded_text?="; #Собираем кусочек правильно
$part=iconv_mime_decode($text, 2, 'UTF-8'); # Перекодируем
}#end else Q!==coding_type
}#end else
if ( !empty($part) ) { $arr_parts[]=$part; } #Если не пустой, добавим
}#end while
if ( !empty($Subj) ) { $arr_parts[]=$Subj; } #Добавим остаток темы
$Subj_FULL=implode($arr_parts);
echo "Subject='$Subj_FULL'";