【遇到的問(wèn)題】
嘗試使用 PHP 的 imap_fetchstructure 函數(shù)來(lái)獲取郵件內(nèi)容傳輸編碼的 encoding,以便進(jìn)行對(duì)應(yīng)的解碼操作??墒菧y(cè)試了一下發(fā)現(xiàn),返回的 encoding 代表值卻并不總與實(shí)際的編碼相符,比如——
該郵件實(shí)際使用的是 Base64 編碼,預(yù)期的函數(shù) encoding 返回值應(yīng)該是3,而實(shí)際返回值卻為0(7bit)。
該郵件實(shí)際使用的是 Quoted-Printable 編碼,預(yù)期的函數(shù) encoding 返回值應(yīng)該是4,而實(shí)際返回值卻為0(7bit)。
【相關(guān)代碼】
function retrieve_message($auth_user,$accountid,$messageid,$fullheaders){
$message=array();
if(!($auth_user && $accountid && $messageid)){
return false;
}
$imap=open_mailbox($auth_user,$accountid);
if(!$imap){
return false;
}
/*
header部分代碼省略
*/
$structure=imap_fetchstructure($imap,$messageid);
$encoding=$structure->encoding;
$message['body']=imap_body($imap,$messageid);
if(!$message['body']){
$message['body']='[This message has no body.]';
}
if(($encoding==3) || stristr($message['body'],'Content-Transfer-Encoding: base64')){
$message['body']=base64_decode($message['body']);
if(is_gbk($message['body'])){
$message['body']=iconv('gbk','utf-8',$message['body']);
}
} elseif(($encoding==4) || stristr($message['body'],'Content-Transfer-Encoding: quoted-printable')){
$message['body']=quoted_printable_decode($message['body']);
if(is_gbk($message['body'])){
$message['body']=iconv('gbk','utf-8',$message['body']);
}
}
imap_close($imap);
return $message;
}
【進(jìn)行過(guò)的嘗試】
在網(wǎng)上搜索了很久,沒(méi)找到特別明確的答案,只看到有些文章里提到對(duì)于一個(gè)復(fù)雜郵件可以有多個(gè) parts,而主內(nèi)容一般在 parts[1],于是添加了如下判斷——
if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])){
$encoding=$structure->parts[1]->encoding;
} else {
$encoding=$structure->encoding;
}
不過(guò)只有小部分原來(lái)的問(wèn)題郵件因此獲取了正確的 encoding,大部分還是不行。
【測(cè)試環(huán)境】
●XAMPP操作系統(tǒng):Windows 10 家庭中文版 1803Apache版本:2.4.16 (Win32)PHP版本:5.6.12
- 1 回答
- 0 關(guān)注
- 711 瀏覽
添加回答
舉報(bào)
0/150
提交
取消