php解析multilpart,使用PHP语言实现POP3邮件的解码
使用PHP語言實現(xiàn)POP3郵件的解碼
時間:2009-02-17 來源:未知 作者:小遠 點擊:次
初步認識郵件的源文件 本文簡要說明了通過pop3協(xié)議收取郵件、mime郵件的解碼的原理;針對收取和mime解碼,提供了兩個實用的php類,并提供了使用的樣例。分為郵件收
初步認識郵件的源文件
本文簡要說明了通過pop3協(xié)議收取郵件、mime郵件的解碼的原理;針對收取和mime解碼,提供了兩個實用的php類,并提供了使用的樣例。分為郵件收取、mime解碼兩個部分。我們已經(jīng)向您介紹過了郵件的收取,現(xiàn)在讓我們來為您介紹本文的解碼部。
在上一篇里,我們已經(jīng)完成了一個用php通過pop3收取郵件的實例,可是在使用這個類的時候,相信你已經(jīng)看到了,很多的郵件收下來是一堆亂碼,自己根本看不懂!是的。現(xiàn)在的郵件大部分都已經(jīng)經(jīng)過了編碼,需要一個解碼的過程才能變成我們習慣的文字、圖片、或是其它的附件。
郵件的源文件
首先,我們來看一段簡單的郵件的源文件:(在foxmail中,選中郵件,點選“查看源文件”就會看到這樣的些內(nèi)容了)
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-
這樣的一段郵件,我想沒有人能看得懂的。不要急,我們來仔細看看這些內(nèi)容。
from:
to:
這個是好理解的,郵件由boy@netease.com發(fā)送,收件人是boss_ch@china.com,這些標簽的含義我們基本可從字面上理解到,像date:sun, 8 oct 2000 20:28:45 0800表示的是時間,x-priority: 3表示的是郵件的優(yōu)先級,x-mailer: microsoft outlook express 5.00.2919.6700表示的是郵件發(fā)送器的名字,這里用的是outllook 5,不過,這些東西跟郵件的內(nèi)容是沒有很大關系的。我們不需要深究。
mime 編碼方式簡介
mime 編碼方式簡介
subject: =?gb2312?b?xoo6w6oh?=
這里是郵件的主題,可是因為編碼了,我們看不出是什么內(nèi)容,其原來的文本是:“你好!”我們先看看 mime 編碼的兩種方法。
對郵件進行編碼最初的原因是因為 internet 上的很多網(wǎng)關不能正確傳輸8 bit 內(nèi)碼的字符,比如漢字等。編碼的原理就是把 8 bit 的內(nèi)容轉(zhuǎn)換成 7 bit 的形式以能正確傳輸,在接收方收到之后,再將其還原成 8 bit 的內(nèi)容。
mime 是“多用途網(wǎng)際郵件擴充協(xié)議”的縮寫,在 mime 協(xié)議之前,郵件的編碼曾經(jīng)有過 uuencode 等編碼方式 ,但是由于 mime 協(xié)議算法簡單,并且易于擴展,現(xiàn)在已經(jīng)成為郵件編碼方式的主流,不僅是用來傳輸 8 bit 的字符,也可以用來傳送二進制的文件 ,如郵件附件中的圖像、音頻等信息,而且擴展了很多基于mime 的應用。從編碼方式來說,mime 定義了兩種編碼方法base64與qp(quote-printable) :
base 64 是一種通用的方法,其原理很簡單,就是把三個byte的數(shù)據(jù)用 4 個byte表示,這樣,這四個byte 中,實際用到的都只有前面6 bit,這樣就不存在只能傳輸 7bit 的字符的問題了。base 64的縮寫一般是“b”,像這封信中的subject 就是用的 base64 編碼。
另一種方法是qp(quote-printable) 方法,通常縮寫為“q”方法,其原理是把一個 8 bit 的字符用兩個16進制數(shù)值表示,然后在前面加“=”。所以我們看到經(jīng)過qp編碼后的文件通常是這個樣子:=b3=c2=bf=a1=c7=e5=a3=ac=c4=fa=ba=c3=a3=a1。
在 php 里,系統(tǒng)有兩個函數(shù)可以很方便地實現(xiàn)解碼:base64_decode()與quoted_printable_decode(),前者可用于base64 編碼的解碼,后者是用于 qp 編碼方法的解碼。
現(xiàn)在我們再來看看subject: =?gb2312?b?xoo6w6oh?= 這一主題的內(nèi)容,這不是一段完整的編碼,只有部分是編碼了的,這個部分用 =? ?= 兩個標記括起來,=? 后面說明的是這段文字的字符集是 gb2312 ,然后一個 ? 后面的一個 b 表示的是用的 base64 編碼。通過這段分析,我們來看一下這個 mime 解碼的函數(shù):(該函數(shù)由 phpx.com 站長 sadly 提供,本人將其放入一個類中,并做了少量的修改,在此致謝)
------分隔線----------------------------
頂一下
(7)
63.6%
踩一下
(4)
36.4%
------分隔線----------------------------
總結(jié)
以上是生活随笔為你收集整理的php解析multilpart,使用PHP语言实现POP3邮件的解码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab矩阵对某一列求和,将矩阵中的
- 下一篇: php mvc单入口搭建,PHP实现MV