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 数组实例说明
Aug 18 PHP
PHP连接SQLServer2005 的问题解决方法
Jul 19 PHP
php 过滤器实现代码
Aug 09 PHP
php设计模式小结
Feb 15 PHP
解析PHP的session过期设置
Jun 29 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
php 删除cookie方法详解
Dec 01 PHP
Yii2实现log输出到file及database的方法
Nov 12 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
Jun 12 PHP
laravel 时间格式转时间戳的例子
Oct 11 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扎实个人基本功
2008/03/27 PHP
PHP中串行化用法示例
2016/11/16 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
java必学必会之static关键字
2015/12/03 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
初中三好学生事迹材料
2014/01/13 职场文书
小学生学习感言
2014/03/10 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
董事长助理工作职责
2014/06/08 职场文书
工地宣传标语
2014/06/18 职场文书
开服装店计划书
2014/08/15 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
专业见习报告范文
2014/11/03 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书