PHP发送UTF-8编码中文邮件标题乱码的解决

 更新时间:2016年11月25日 16:08  点击:1633

  当我们使用下面的PHP语句发送中文电子邮件的时候,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢?

  $subject = stripslashes($the_post[''Title'']);
  $headers = "MIME-Version: 1.0rn";
  $headers .= "Content-type: text/plain; charset=utf-8rn";
  $headers .= "Content-Transfer-Encoding: 8bitrn";
  $message = stripslashes(strip_tags($the_post[''Content'']));
  mail($to, $subject, $message, $headers);

  先用函数base64_encode() — 使用 MIME base64 对数据进行编码
  标题字符串前加编码类型例如: =?UTF-8?B?
  标题字符串后加:?=

  例如:

  $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

  将上面一句添加到代码之中,这样,发送的中文邮件标题就不是乱码了。

 

关键就是两点

1 define('CLIENT_MULTI_RESULTS', 131072);
2 
3 $link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());

下面就可以正常使用了,以下是例子程序。

 1 <?php
 2     define('CLIENT_MULTI_RESULTS', 131072);
 3 
 4     $link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
 5     mysql_select_db("vs") or die("Could not select database");
 6 ?>
 7 
 8 <?php
 9         $result = mysql_query("call get_news_from_class_id(2)") or die("Query failed:" .mysql_error());
10         while($row = mysql_fetch_array($result, MYSQL_ASSOC))
11         {
12                 $line = '<tr><td><a target = _blank href=''.$row["url"].''>'.$row["title"].'('.$row["page_time"].')'.'</a></td></tr>';
14                 echo $line;
15                 printf("n");
16 
17         }
18         mysql_free_result($result);
19 ?>
20 
21 <?php
22     mysql_close($link);
23 ?>

< 邮件发送和收取是目前网上交流最为重要的途径之一,我们当然很希望自己的PHP程序也能够实现某些商业网站注册程序中采用的方法,即通过邮件方式进行密码(或激活码)发送和资料确认。另一方面,这种方式也是一种反馈用户信息的有效途径。当然,要实现这些功能是离不开邮件服务器的,目前比较流行的Mail服务器(更准确的说是邮件传输代理MTA)有:sendmail、qmail、postfix。至于如何配置其中的pop、 smtp、imap等服务已经超出这篇文章的范围,读者可以参考其他这方面文章。那么好了,我们究竟可以利用PHP来作些什么呢?
  1. 简单邮件发送
  PHP函数库中有一个mail函数,可以用来进行简单的邮件发送,函数原型为:
  boolean mail(string $to, string $subject, string $message, string [$additional]);
  $to指定邮件寄送地址,$subject指定邮件标题,$message指定邮件内容,$additional指定邮件的附加头部,例如:
  
  
复制PHP内容到剪贴板
PHP代码:
  <?php
  mail( "ywg_263@263.net", "message from php", "hello, xiaoyz! " );
  ?>
  就可以向 ywg_263@263.net发送一个标题为“message from php” 内容为“hello, xiaoyz!”的邮件,其中的邮件接受人$to可以是多个邮件地址,也就是说可以同时给多个人发送同一份邮件,邮件地址之间用逗号分隔,示例如下:
  
  
复制PHP内容到剪贴板
PHP代码:
  <?php
  $emails = Array( "xiaoyz@birdy.dhs.org", "xiaoyz@hotmail.com" );
  mail( implode(",", $emails), "message from php", "hello, xiaoyz!" );
  ?>
  笔者做过的论坛程序中的注册部分就曾经使用过这种方法,不过最后还是采用了一种变通的形式,下文将会具体讲到。其中主要的需求是:当一个用户注册之后,必须得到组管理员的身份确认才能成为论坛的正式会员,我所采用的方法是:用户注册完成提交表单时,先把用户各种注册信息写入数据库,同时把用户的必要信息通过邮件的方式发送给用户所注册组的所有组管理员(如果没有组管理员的话,会给站管理员发送邮件,并告之该组没有组管理员),当然,读者可能会觉得如果有人恶意注册了很多id的话是否会在数据库中造成很多垃圾信息呢?这种考虑是必要的,所以我们需要给出一个策略,提供一个管理界面,来剔除掉这些垃圾,一种简单的方法就是对于超过了给定时期还没有成为正式会员的id一律删除,前提就是必须保证组管理员要在给定时期之内审批这些id,否则会造成误删。读者可以试试上面的代码能否工作,如果没有发送成功,请考虑重新配置邮件服务器的smtp服务。好了,按照上述形式发送的邮件将只是简单的文本形式,如果希望发送一个HTML形式的邮件,就需要知道如何发送MIME形式的邮件了。
  2. MIME邮件发送
  MIME(Multi-purpose Internet Mail Extensions,多用途Internet邮件扩展) 协议扩展了基于文本的Internet邮件系统,以便可以在消息体中包含二进制附件。MIME信息由正常的Internet文本邮件组成,在文本邮件中包含了一些信息头和格式化过的信息体(用ASCII 码子集表示的附件),这些MIME信息头给出了在邮件中表示附件的特定方法。
  刚才通过mail函数发送的邮件接受之后的MIME信息如下(其中的localhost
  (localhost[127.0.0.1])表示采用本机上的postfix提供的smtp服务,userid 48表示apache):
  [code]
  Received: from localhost (localhost [127.0.0.1])
  by mx01.263.net (Postfix) with SMTP id E7C8B1DC38A78
  for <ywg_263@263.net>; Sat, 8 Dec 2001 20:08:45 +0800 (CST)
  Received: by birdy.dhs.org (Postfix, from userid 48)
  id 706F3C4923A; Sun, 9 Dec 2001 03:52:26 +0800 (CST)
  T ywg_263@263.net
  Subject: message from php
 

1:为什么我得不到变量

  我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值?
  在PHP4.2以后的版本中register_global默认为off
  若想取得从另一页面提交的变量:

  方法一:在PHP.ini中找到register_global,并把它设置为on.
  方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()).
  方法三:一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等,这种方法虽然麻烦,但比较安全.

  2:调试你的程序

  在运行时必须知道某个变量为何值。我是这样做的,建立一文件debug.php,其内容如下:

  PHP代码:

PHP
  <?PHP
  Ob_Start();
  Session_Start();
  Echo "<pre>";

  Echo "本页得到的_GET变量有:";
  Print_R($_GET);

  Echo "本页得到的_POST变量有:";
  Print_R($_POST);

  Echo "本页得到的_COOKIE变量有:";
  Print_R($_COOKIE);

  Echo "本页得到的_SESSION变量有:";
  Print_R($_SESSION);

  Echo "</pre>";
  ?>

  然后在php.ini中设置:include_path = "c:/php",并将debug.php放在此文件夹,以后就可以在每个网页里包含此文件,查看得到的变量名和值.

  3:如何使用session

  凡是与session有关的,之前必须调用函数session_start();

  为session付值很简单,如:

  PHP代码:

  <?php
  Session_start();
  $Name = "这是一个Session例子";
  Session_Register("Name");//注意,不要写成:Session_Register("$Name");
  Echo $_SESSION["Name"];
  //之后$_SESSION["Name"]为"这是一个Session例子"
  ?>

  在php4.2之后,可以为session直接付值:

  PHP代码:

PHP
  <?PHP
  Session_Start();
  $_SESSION["name"]="value";
  ?>

取消session可以这样:

PHP代码:

<

用法:void parse_str ( string $str [, array &$arr] )

parse_str用来解析(分离)URL中的查询字符串(Query String),所谓查询字符串是指一个URL中?后面的部分,如http://localhost/test/result.php?name=anve&age=21,则查询字符串就是“name=anve&age=21”。

当然在PHP里,你可以用$_GET数组来取得查询字符串的值,但有时候parse_str会方便些,特别是当查询字符串中的变量名(对应于上面例子中的name和age)不知道的时候。

index.html:



<html>
<body>
    
<form action="result.php" method="get">
        name: 
<input type="text" name="name">
        age: 
<input type="text" name="age">
        
<input type="submit">
    
</form>
</body>
</html>

result.php:



<html>
<body>
<?php
$string=$_SERVER[''QUERY_STRING'']; // 用$_SERVER[''QUERY_STRING'']取得查询字符串。

echo ''$string: ''.$string.''<br>'';
parse_str($string);
echo ''$name: ''.$name.''<br>'';
echo ''$age: ''.$age.''<br>''// 经过parse_str后,生成了$name和$age两个变量,并被正确赋值。

parse_str($string,$arr); // 第二个参数$arr是一个用来保存结果的数组,这样就不会像刚才那样产生多个变量了。
echo ''<pre>'';
print_r($arr); // $arr[''name'']和$arr[''age'']被正确赋值。
echo ''</pre>'';
?>
</body>
</html>

另注:parse_str会自动进行urldecode(URL解码)。例如在index.html的name中输入“波波”,我的测试结果是:



SyntaxHighlighter.highlight();

[!--infotagslink--]

相关文章

  • php生成二维码中文乱码问题解决方法

    最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Mysql在debian系统中不能插入中文的终极解决方案

    在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • linux mint 下mysql中文支持问题

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<&#63;php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • 解决HttpPost+json请求---服务器中文乱码及其他问题

    这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22
  • php中iconv编码转换来解决中文乱码的问题

    用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些 代码如下 复制代码 ...2016-11-25
  • c#字符串编码编码(encoding)使用方法示例

    System.Text提供了Encoding的抽象类,这个类提供字符串编码的方法。使Unicode字符数组的字符串,转换为指定编码的字节数组,或者反之,看下面的例子...2020-06-25
  • php mail发邮件标题中文乱码的问题解决办法

    本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。 当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码...2016-11-25
  • 通过javascript进行UTF-8编码的实现方法

    下面小编就为大家带来一篇通过javascript进行UTF-8编码的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-01
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • php中把unicode编码转化为中文

    小编在网上看到最多的就是汉字转换unicode编码了,今天我们看到一个反过来的操作就是把unicode转换成中文了,下面一起来看看 这两天帮别人开发微信平台好友板块,存...2016-11-25
  • .Net(c#)汉字和Unicode编码互相转换实例

    下面小编就为大家带来一篇.Net(c#)汉字和Unicode编码互相转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • php 判断是否是中文/英文/数字示例代码

    复制代码 代码如下: $str='asb天水市12'; if (preg_match("/^[/x7f-/xff]+$/", $str)){ echo '全部是汉字'; }else { echo '不全是汉字'; } /** PHP自带的判断是否是中文, eregi('[^/x00-/x7F]', $str ) //中文 ereg...2013-10-04