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分页函数
Jul 08 PHP
第三节 定义一个类 [3]
Oct 09 PHP
php 字符串函数收集
Mar 29 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
PHP5.4起内置web服务器使用方法
Aug 09 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
Banner程序
2006/10/09 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
Python写的服务监控程序实例
2015/01/31 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
详解Python学习之安装pandas
2019/04/16 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
大学自我评价
2014/02/12 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
初中生毕业评语
2014/12/29 职场文书
初中差生评语
2014/12/29 职场文书
如何写辞职信
2015/05/13 职场文书
发票退票证明
2015/06/24 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书