php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法


Posted in PHP onOctober 20, 2015

最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。

 php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

1.使用 PEAR 的 Mail 类

PEAR 的 Mail 类可以让你选择使用 sendmail 或者 SMTP 方式发信,这样的包装好的接口很好用,你没有必要去自己重新发明轮子。

2.关于headers 中subject 的乱码

不要把任何除了 iso-8859-1 编码之外的文字直接放进subject,正确的方式是让subject 里头的文字符合RFC 2047 的规范,假设你的subject 处的文字的编码是GB2312,那么正确的subject 应该是这样的格式
$headers['subject'] = '=?GB2312?B?' . base64_encode('标题文字') . '?=';
如果是UTF-8 的话,把上面开头的GB2312 替换成UTF-8 即可。推荐在标题处使用GB2312 编码,因为MTA 的分化实在是严重,大部分的MSP使用的都是自己开发的 MTA,而相信国内的大部分 MTA 无论如何都是可以支持 GB2312 编码的。

而如果是发送到国外的MSP,则推荐你在subject 处使用经过base64 编码的 UTF-8 文字,因为他们很可能不支持 GB2312 编码。

3.一定在headers 中添加content-type

电子邮件的 headers 中的 content-type 处类似网页的,也是 text/plain; charset=gb2312 这样的格式。这个选项主要对收邮件的客户端有意义,可以避免在客户端出现乱码,部分的 Webmail 也会根据这里的设置对邮件的内容进行编码转换以正确显示。你可以设想一下你用 gb2312 编码发到 .com.tw 的邮箱时候的情况。

4.对你用来发送邮件的主机进行正确配置

1)一定配置反向解析,因为大部分的非固定 IP 都无法做反向解析,部分反垃圾邮件策略以此作为判断依据。
2)一定配置 MX 解析,道理同上。
3)确保你的 return path 是能够收到退信的,否则你的邮件发送服务器可能会进入接收端的黑名单。

$subject = stripslashes($the_post['Title']); 
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/plain; charset=utf-8\r\n"; 
$headers .= "Content-Transfer-Encoding: 8bit\r\n"; 
$message = stripslashes(strip_tags($the_post['Content'])); 
mail($to, $subject, $message, $headers);

先用函数base64_encode() — 使用MIME base64 对数据进行编码
标题字符串前加编码类型例如: =?UTF-8?B?
标题字符串后加:?=
例如:

<?php  
 $to = "clairelume@qq.com"; //将此电子邮件地址改为自己的。  
 $name = $_POST['name'];  
 $email = $_POST['email'];  
 $subject = "来自博客读者的邮件";  
 $subject = "=?UTF-8?B?".base64_encode($subject)."?=";  
 $headers = "MIME-Version: 1.0\r\n";  
 $headers .= "Content-type: text/plain; charset=utf-8\r\n";  
 $headers .= "Content-Transfer-Encoding: 8bit\r\n";  
 $message = $_POST['message'];  
 mail($to,$subject,$message,"From: ".$email."",$headers);  
 echo 'OK '.$name.', 您的邮件已发送。';  
?>

这样,发送的中文邮件标题就不是乱码了。

php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

是不是很简单,其实把问题分析透了,所有的问题都会迎刃而解了,希望这篇文章对大家的学习有所帮助。

PHP 相关文章推荐
消息持续发送的完整例子
Oct 09 PHP
PHP之变量、常量学习笔记
Mar 27 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
C/S和B/S两种架构区别与优缺点分析
Oct 23 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
PHP微信开发用Cache 解决数据缓存
Jul 11 PHP
PHP页面转UTF-8中文编码乱码的解决办法
Oct 20 #PHP
php限制文件下载速度的代码
Oct 20 #PHP
php获取远程文件大小
Oct 20 #PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 #PHP
php生成验证码函数
Oct 20 #PHP
php文件上传你必须知道的几点
Oct 20 #PHP
PHP判断上传文件类型的解决办法
Oct 20 #PHP
You might like
菜鸟修复电子管记
2021/03/02 无线电
PHP自定义函数收代码
2010/08/01 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python pillow模块使用方法详解
2019/08/30 Python
给我一面国旗 python帮你实现
2019/09/30 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
加拿大留学自荐信
2014/01/28 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
七个Python必备的GUI库
2021/04/27 Python
详解php中流行的rpc框架
2021/05/29 PHP
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL