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 strtr() 函数使用说明
Nov 21 PHP
php 日期时间处理函数小结
Dec 18 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
探讨php中header的用法详解
Jun 07 PHP
php从数组中随机选择若干不重复元素的方法
Mar 14 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
php cookie工作原理与实例详解
Jul 18 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
Yii框架where查询用法实例分析
Oct 22 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 adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
javascript 动态创建表格
2015/01/08 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
英文演讲稿
2014/05/15 职场文书
真诚的求职信
2014/07/04 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
男方婚前保证书
2015/02/28 职场文书
二审代理词范文
2015/05/25 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
学习焦裕禄观后感
2015/06/09 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
Python实现视频中添加音频工具详解
2021/12/06 Python