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 高效率写法 推荐
Feb 21 PHP
PHP Array交叉表实现代码
Aug 05 PHP
关于svn冲突的解决方法
Jun 21 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
May 12 PHP
PHP关于foreach复制知识点总结
Jan 28 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
xml和web特殊字符
2009/04/28 Javascript
JS面向对象编程 for Cookie
2010/09/19 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
js date 格式化
2017/02/15 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
python的re模块应用实例
2014/09/26 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
python如何实现代码检查
2019/06/28 Python
python代码编写计算器小程序
2020/03/30 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
python双向链表原理与实现方法详解
2019/12/03 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
Python pip配置国内源的方法
2020/02/14 Python
python Canny边缘检测算法的实现
2020/04/24 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
董事长职责范文
2013/11/08 职场文书
食品安全标语
2014/06/07 职场文书
机械操作工岗位职责
2014/08/08 职场文书
党代会心得体会
2014/09/04 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
以下牛机,你有几个
2022/04/05 无线电