返回首页

使用PHP语言实现POP3邮件的解码

时间:2009-02-17 来源:未知 作者:小远 点击:
初步认识邮件的源文件 本文简要说明了通过pop3协议收取邮件、mime邮件的解码的原理;针对收取和mime解码,提供了两个实用的php类,并提供了使用的样例。分为邮件收
  初步认识邮件的源文件
  本文简要说明了通过pop3协议收取邮件、mime邮件的解码的原理;针对收取和mime解码,提供了两个实用的php类,并提供了使用的样例。分为邮件收取、mime解码两个部分。我们已经向您介绍过了邮件的收取,现在让我们来为您介绍本文的解码部。

  在上一篇里,我们已经完成了一个用php通过pop3收取邮件的实例,可是在使用这个类的时候,相信你已经看到了,很多的邮件收下来是一堆乱码,自己根本看不懂!是的。现在的邮件大部分都已经经过了编码,需要一个解码的过程才能变成我们习惯的文字、图片、或是其它的附件。

  邮件的源文件

  首先,我们来看一段简单的邮件的源文件:(在foxmail中,选中邮件,点选“查看源文件”就会看到这样的些内容了)

  from:

  to:

  subject: =?gb2312?b?xoo6w6oh?=

  date: sun, 8 oct 2000 20:28:45 0800

  mime-version: 1.0

  content-type: multipart/alternative;

   boundary="----=_nextpart_000_0007_01c03166.5b1e9510"

  x-priority: 3

  x-msmail-priority: normal

  x-mailer: microsoft outlook express 5.00.2919.6700

  x-mimeole: produced by microsoft mimeole v5.00.2919.6700

  this is a multi-part message in mime format.

  ------=_nextpart_000_0007_01c03166.5b1e9510

  content-type: text/plain;

   charset="gb2312"

  content-transfer-encoding: base64

  w7vt0mlswuuwyao/dqo=

  ------=_nextpart_000_0007_01c03166.5b1e9510

  content-type: text/html;

   charset="gb2312"

  content-transfer-encoding: base64

  pcfet0nuwvbfiehutuwgufvcteldicitly9xm0mvl0rurcbive1midqumcbucmfuc2l0aw9uywwv

  l0voij4ncjxive1mpjxirufepg0kpe1fveegy29udgvudd0idgv4dc9odg1soybjagfyc2v0pwdi

  mjmxmiigahr0cc1lcxvpdj1db250zw50lvr5cgu dqo8tuvuqsbjb250zw50psjnu0hutuwgns4w

  mc4yotiwljaiig5hbwu9r0vorvjbve9spg0kpfnuwuxfpjwvu1rzteu dqo8l0hfquq dqo8qk9e

  wsbiz0nvbg9ypsnmzmzmzmy dqo8relwpjxgt05uihnpemu9mj7du9pqwtlc67djo788l0zptlq

  pc9esvy pc9ct0rzpjwvsfrntd4ncg==

  ------=_nextpart_000_0007_01c03166.5b1e9510-

  这样的一段邮件,我想没有人能看得懂的。不要急,我们来仔细看看这些内容。

  from:

  to:

  这个是好理解的,邮件由boy@netease.com发送,收件人是boss_ch@china.com,这些标签的含义我们基本可从字面上理解到,像date:sun, 8 oct 2000 20:28:45 0800表示的是时间,x-priority: 3表示的是邮件的优先级,x-mailer: microsoft outlook express 5.00.2919.6700表示的是邮件发送器的名字,这里用的是outllook 5,不过,这些东西跟邮件的内容是没有很大关系的。我们不需要深究。
mime 编码方式简介
  mime 编码方式简介

  subject: =?gb2312?b?xoo6w6oh?=

  这里是邮件的主题,可是因为编码了,我们看不出是什么内容,其原来的文本是:“你好!”我们先看看 mime 编码的两种方法。

  对邮件进行编码最初的原因是因为 internet 上的很多网关不能正确传输8 bit 内码的字符,比如汉字等。编码的原理就是把 8 bit 的内容转换成 7 bit 的形式以能正确传输,在接收方收到之后,再将其还原成 8 bit 的内容。

  mime 是“多用途网际邮件扩充协议”的缩写,在 mime 协议之前,邮件的编码曾经有过 uuencode 等编码方式 ,但是由于 mime 协议算法简单,并且易于扩展,现在已经成为邮件编码方式的主流,不仅是用来传输 8 bit 的字符,也可以用来传送二进制的文件 ,如邮件附件中的图像、音频等信息,而且扩展了很多基于mime 的应用。从编码方式来说,mime 定义了两种编码方法base64与qp(quote-printable) :

  base 64 是一种通用的方法,其原理很简单,就是把三个byte的数据用 4 个byte表示,这样,这四个byte 中,实际用到的都只有前面6 bit,这样就不存在只能传输 7bit 的字符的问题了。base 64的缩写一般是“b”,像这封信中的subject 就是用的 base64 编码。

  另一种方法是qp(quote-printable) 方法,通常缩写为“q”方法,其原理是把一个 8 bit 的字符用两个16进制数值表示,然后在前面加“=”。所以我们看到经过qp编码后的文件通常是这个样子:=b3=c2=bf=a1=c7=e5=a3=ac=c4=fa=ba=c3=a3=a1。

  在 php 里,系统有两个函数可以很方便地实现解码:base64_decode()与quoted_printable_decode(),前者可用于base64 编码的解码,后者是用于 qp 编码方法的解码。

  现在我们再来看看subject: =?gb2312?b?xoo6w6oh?= 这一主题的内容,这不是一段完整的编码,只有部分是编码了的,这个部分用 =? ?= 两个标记括起来,=? 后面说明的是这段文字的字符集是 gb2312 ,然后一个 ? 后面的一个 b 表示的是用的 base64 编码。通过这段分析,我们来看一下这个 mime 解码的函数:(该函数由 phpx.com 站长 sadly 提供,本人将其放入一个类中,并做了少量的修改,在此致谢)
------分隔线----------------------------
顶一下
(7)
63.6%
踩一下
(4)
36.4%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容