为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
手掌心 2019-03-06 12:59:19
【遇到的问题】 尝试使用 PHP 的 imap_fetchstructure 函数来获取邮件内容传输编码的 encoding,以便进行对应的解码操作。可是测试了一下发现,返回的 encoding 代表值却并不总与实际的编码相符,比如—— 该邮件实际使用的是 Base64 编码,预期的函数 encoding 返回值应该是3,而实际返回值却为0(7bit)。 该邮件实际使用的是 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 家庭中文版 1803Apache版本:2.4.16 (Win32)PHP版本:5.6.12
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 667 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信