使用imap_fetchbody获取Gmail邮件正文返回异常乱码字符串如何解决
PHP imap扩展获取邮件正文乱码解决方案
你获取到的无意义长字符串是Base64编码后的邮件正文内容,PHP的imap扩展默认不会自动处理邮件的传输编码解码和字符集转换,同时你的原始代码还存在循环内硬编码邮件ID的逻辑错误,调整方法如下:
原始代码存在的问题
- 循环内硬编码了固定邮件ID
415,没有使用遍历得到的$email_number变量,导致每次循环都读取同一封邮件 - 没有对获取到的正文做传输编码解码
- 没有适配不同邮件的字符集,容易出现二次乱码
调整后的可运行代码
$imap_conn = imap_open('{imap.gmail.com:993/imap/ssl}INBOX','user','password'); $inbox = imap_search($imap_conn, 'ALL'); if (! empty($inbox)) { foreach($inbox as $email_number) { // 获取当前邮件的结构信息 $structure = imap_fetchstructure($imap_conn, $email_number); // 优先读取纯文本正文,对应part编号1.1;如果不存在则 fallback 读取HTML正文1.2 $message = imap_fetchbody($imap_conn, $email_number, 1.1); if (trim($message) == '') { $message = imap_fetchbody($imap_conn, $email_number, 1.2); } // 根据邮件的编码类型做对应解码 if ($structure->encoding == 3) { // 编码类型为Base64 $message = base64_decode($message); } elseif ($structure->encoding == 4) { // 编码类型为Quoted-Printable $message = imap_qprint($message); } // 统一转换字符集为UTF-8,适配不同发件方的字符集设置 $charset = isset($structure->parameters[0]->value) ? $structure->parameters[0]->value : 'UTF-8'; $message = mb_convert_encoding($message, 'UTF-8', $charset); var_dump($message); } } // 操作结束后关闭imap连接 imap_close($imap_conn);
补充说明
如果需要处理带附件、结构更复杂的邮件,可以递归解析imap_fetchstructure返回的结构对象的parts属性,找到类型为文本的部分再做读取解码即可。
内容的提问来源于stack exchange,提问作者Marco Silva
相关产品推荐
相关产品推荐

