php 发送邮件(HTML)解析乱码问题(多余叹号!等)

通过php代码调用mail函数发送邮件, 一个原本很简单的功能, 几小时就写完了, 但调试却花了我一天的时间. 现在把这个过程记录下来, 供以后参考.


问题描述: php mail 函数发送邮件, 头和内容分别为,

$header = "MIME-Version: 1.0\r\nContent-type: text/html; charset=utf-8\r\nFrom: test<test@test.com>";

$body = get_email_body($an_array);

其中, 参数$an_array 是从数据库中读出的数据, 函数get_email_body将数组中的内容拆分出来,以table的方式重新组织字符串, 最终返回html格式的内容体, 如: 

<html>
  <head>
  <style>...</style>
  </head>
  <body>
    <table border=\"1\" style=\"border-collapse:collapse;border:none\">
      <tr>...</tr>
      ... ...
      <tr>...</tr>
    </table>
    <br/>
    .... ....
  </body>
</html>        

一个简单到不能再简单的html邮件, 当邮件内容很短的时候, 问题不大, 但当邮件逐渐变大的时候, 问题就来了. 邮件内容里总是出现莫名其妙的格式问题(大部分是多余叹号!, 也有其他格式问题), 如: "8800! 12930067 617". 

可能造成这种现象的两种可能和解决办法:

  •  html表情和CSS与邮件客户端不兼容, 

以outlook为例, 参考http://msdn.microsoft.com/zh-cn/library/aa338201(v=office.12).aspx, 这个问题没其他办法, 只能自己优化代码, 采用标准化写法, 如标签尽量完整, 浏览器可以识别<br>表情, 但要换成标准写法<br/>, 还有就是记得闭合标签.


  • 邮件内容过长, 导致解析出问题.

通常邮件信息每行不得超过998个字符, 而整个html邮件体中没有换行符, 会自动的被认为是一行, 所以就会有问题 (998 听起来有点像电视购物呢 - -!!). 怎么办呢?

两种解决办法:

1. 人工增加换行符: 以上面代码为例, 将$body取值替换为 

$body = wordwrap(get_email_body($an_array),900, "\n");

即, 在邮件体字符串中,每900个字符加一个换行符, 这样就保证了每行字符串不会超过上限. 但同时也会带来新的问题, 因为额外加的字符串在某些情况下, 可能会导致邮件布局有问题(特定浏览器, 操作系统或者邮件客户端).

2. 用base64编码 

$header = "MIME-Version: 1.0\r\nContent-Transfer-Encoding: base64\r\nContent-type: text/html; charset=utf-8\r\nFrom: test<test@test.com>";
$body = rtrim(chunk_split(base64_encode(get_email_body($an_array))));

首先给body添加base64编码, 然后在header中添加Content-Transfer-Encoding: base64说明. 因为base64编码会自动每76个字符添加一个换行符, 所以自然满足了每998字符换行的问题.



Reference:

1. http://www.daniweb.com/web-development/php/threads/75331/exclamation-points-at-odd-places-in-php-email

2. https://drupal.org/node/31524

3. http://baike.baidu.com/view/469071.htm


posted @ 2013-06-07 17:06  bus driver  阅读(981)  评论(0编辑  收藏  举报
Hello world