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制作静态网站的模板框架(二)
Oct 09 PHP
请php正则走开
Mar 15 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
php分享朋友圈的实现代码
Feb 18 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 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
php 读取shell管道传输过来的内容
2010/03/01 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
JsRender实用入门教程
2014/10/31 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
javascript每日必学之循环
2016/02/19 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
项目经理岗位职责
2013/11/11 职场文书
主管会计岗位责任制
2014/02/10 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
招商银行收入证明
2015/06/17 职场文书
教导处教学工作总结
2015/08/12 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
Go语言grpc和protobuf
2022/04/13 Golang