PHP如何解码含=20、=A0的字符串?Gmail IMAP邮件主题解码求助
解决PHP中Gmail IMAP邮件主题的MIME编码解码问题
这个问题我日常做邮件相关开发时经常碰到,你遇到的这种=?utf-8?Q?We=20aren=27t=20fooling=20around=3A=20Up=20to=2050%=20off=20on=20Polo=27s=2C=20Swimwear=2C=20Jeans=20&=20More?=格式的字符串,是MIME RFC 2047标准定义的邮件头编码方式,专门用来在邮件头中安全传输包含特殊字符(比如单引号、百分号、&符号)或者非ASCII的内容。
编码结构拆解
这个编码串的各部分含义很清晰:
=?:编码段的起始标记utf-8:原始字符串使用的字符编码Q:表示采用quoted-printable编码方式(另一种常见的是B代表Base64编码)- 中间的
We=20aren=27t...:经过quoted-printable编码后的内容,比如=20对应空格、=27对应单引号、=3A对应冒号 ?=:编码段的结束标记
PHP中的解码方案
PHP有两个非常实用的内置函数可以直接处理这种编码,不用手动解析编码规则:
方法1:使用IMAP扩展的imap_mime_header_decode()
既然你已经在使用IMAP API获取邮件,这个函数是最适配的选择,它专门为解码邮件头内容设计:
$encodedSubject = '=?utf-8?Q?We=20aren=27t=20fooling=20around=3A=20Up=20to=2050%=20off=20on=20Polo=27s=2C=20Swimwear=2C=20Jeans=20&=20More?='; $decodedParts = imap_mime_header_decode($encodedSubject); $decodedSubject = ''; foreach ($decodedParts as $part) { $decodedSubject .= $part->text; } echo $decodedSubject; // 输出:We aren't fooling around: Up to 50% off on Polo's, Swimwear, Jeans & More
函数会把编码内容拆分成数组,每个元素包含charset和text属性,循环拼接后就能得到完整的解码主题。
方法2:使用MBString扩展的mb_decode_mimeheader()
如果你的环境没有安装IMAP扩展,MBString扩展的这个函数也能完美处理,而且用法更简洁:
$encodedSubject = '=?utf-8?Q?We=20aren=27t=20fooling=20around=3A=20Up=20to=2050%=20off=20on=20Polo=27s=2C=20Swimwear=2C=20Jeans=20&=20More?='; $decodedSubject = mb_decode_mimeheader($encodedSubject); echo $decodedSubject; // 输出:We aren't fooling around: Up to 50% off on Polo's, Swimwear, Jeans & More
这个函数会自动识别MIME编码格式并直接返回解码后的字符串,非常省心。
注意事项
- 确保你的PHP环境已经启用了对应的扩展(MBString一般主流环境默认启用,IMAP如果没开需要在php.ini中开启)
- 如果邮件主题包含多个编码段(比如混合了不同字符集的内容),这两个函数都能自动处理拼接,不需要额外操作
内容的提问来源于stack exchange,提问作者RAUSHAN KUMAR
相关产品推荐
相关产品推荐

