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
Dec 14 PHP
php+mysql分页代码详解
Mar 27 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
浅谈使用PHP开发微信支付的流程
Oct 04 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 PHP
PHP crc32()函数讲解
Feb 14 PHP
php探针使用原理和技巧讲解
Sep 17 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(7) php 字符串相关应用
2010/03/05 PHP
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
HTML5实现签到 功能
2018/10/09 HTML / CSS
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
什么是SCM(软件配置管理)
2014/08/16 面试题
超市重阳节活动方案
2014/02/10 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
毕业留言寄语大全
2014/04/10 职场文书
档案保密承诺书
2014/06/03 职场文书
公司年终奖分配方案
2014/06/16 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
秋冬农业生产标语
2014/10/09 职场文书
社团个人总结范文
2015/03/05 职场文书
个人自荐书范文
2015/03/09 职场文书
关于远足的感想
2015/08/10 职场文书
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs