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 相关文章推荐
php网页后退不再出现过期
Mar 08 PHP
PHP set_time_limit(0)长连接的实现分析
Mar 02 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
PHP is_subclass_of函数的一个BUG和解决方法
Jun 01 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
又拍云异步上传实例教程详解
Apr 19 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中所有数据库的方法
2015/03/12 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
List the UTC Time on a Computer
2007/06/11 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
Python中optparse模块使用浅析
2015/01/01 Python
python杀死一个线程的方法
2015/09/06 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
详解python之heapq模块及排序操作
2019/04/04 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
营销与策划个人求职信
2013/09/22 职场文书
数控专业推荐信范文
2013/12/02 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
大学生作弊检讨书
2014/09/11 职场文书
困难补助申请报告
2015/05/19 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
redis 解决库存并发问题实现数量控制
2022/04/08 Redis