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 相关文章推荐
无JS,完全php面向过程数据分页实现代码
Aug 27 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
Jun 29 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
php统计数组元素个数的方法
Jul 02 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 PHP
Yii框架日志操作图文与实例详解
Sep 09 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
php 伪静态之IIS篇
2014/06/02 PHP
php中的ini配置原理详解
2014/10/14 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
Bootstrap精简教程
2015/11/27 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
极简的Python入门指引
2015/04/01 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
用python对excel查重
2020/12/07 Python
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
岗位职责定义及内容
2013/11/08 职场文书
教师实习自我鉴定
2013/12/13 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
办公室岗位职责
2014/02/12 职场文书
2014年德育工作总结
2014/11/20 职场文书
党小组评议意见
2015/06/02 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
MySQL系列之二 多实例配置
2021/07/02 MySQL