使用PHP的imap_fetchstructure获取邮件传输编码encoding与实际不符

【遇到的问题】

尝试使用 PHP 的 imap_fetchstructure 函数来获取邮件内容传输编码的 encoding,以便进行对应的解码操作。可是测试了一下发现,返回的 encoding 代表值却并不总与实际的编码相符,比如——

https://img2.mukewang.com/5c8f39220001bf9007630097.jpg
该邮件实际使用的是 Base64 编码,预期的函数 encoding 返回值应该是3,而实际返回值却为0(7bit)。

https://img1.mukewang.com/5c8f39230001de4707460212.jpg
该邮件实际使用的是 Quoted-Printable 编码,预期的函数 encoding 返回值应该是4,而实际返回值却为0(7bit)。

【相关代码】

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;
}

【进行过的尝试】

在网上搜索了很久,没找到特别明确的答案,只看到有些文章里提到对于一个复杂邮件可以有多个 parts,而主内容一般在 parts[1],于是添加了如下判断——

if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])){
  $encoding=$structure->parts[1]->encoding;
} else {
  $encoding=$structure->encoding;    
}

不过只有小部分原来的问题邮件因此获取了正确的 encoding,大部分还是不行。

【测试环境】

●XAMPP
操作系统:Windows 10 家庭中文版 1803
Apache版本:2.4.16 (Win32)
PHP版本:5.6.12

手掌心
浏览 668回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP