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+Html+缓存
Dec 20 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
PHP5.4中json_encode中文转码的变化小结
Jan 30 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
详解thinkphp中的volist标签
Jan 15 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
php中动态修改ini配置
2014/10/14 PHP
php强制运行广告的方法
2014/12/01 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
向左滚动文字 js代码效果
2013/08/17 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
Python hashlib模块加密过程解析
2019/11/05 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
《忆江南》教学反思
2014/04/07 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
患者身份识别制度
2015/08/06 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
学校团代会开幕词
2016/03/04 职场文书
python基础详解之if循环语句
2021/04/24 Python
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
nginx结合openssl实现https的方法
2021/07/25 Servers
MySQL慢查询优化解决问题
2022/03/17 MySQL