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 相关文章推荐
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
PHP 批量删除 sql语句
Jun 05 PHP
PHP中文分词的简单实现代码分享
Jul 17 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
php post json参数的传递和接收处理方法
May 31 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
laravel框架 laravel-admin上传图片到oss的方法
Oct 13 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入门之连接mysql数据库的一个类
2012/04/21 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
Python的Django框架中if标签的相关使用
2015/07/15 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python xpath获取页面注释的方法
2019/01/14 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
django序列化serializers过程解析
2019/12/14 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
异步传递消息系统的作用
2016/05/01 面试题
县优秀教师事迹材料
2014/01/31 职场文书
房屋租赁意向书
2014/04/01 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
2014年女职工工作总结
2014/11/27 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android