php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码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+jQuery翻板抽奖功能实现
推荐阅读
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法,
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法,
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法_php技巧
-
php mail发邮件标题中文乱码的问题解决办法
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法_PHP
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法_PHP
-
PHP发送UTF-8编码中文邮件标题乱码的解决
-
PHP发送UTF-8编码中文邮件标题乱码的解决