MIME格式解析
“?本文介紹常見的MIME數據格式。”
在協議還原中,不可避免地,經常會在各類協議內容中碰到MIME格式,例如標準郵件協議、HTTP協議。
那么,什么是MIME呢?
MIME是英文Multipurpose Internet Mail Extensions的縮寫,即多用途互聯網郵件擴展。從名字就可以看出,它產生于對郵件內容編碼的過程。它是一個一個互聯網標準,在一系列RFC文檔中進行了定義和更新,例如RFC6532、RFC8098、RFC2231、RFC6838、RFC4289、RFC2049等。
這里需要指出的是,雖然MIME是郵件協議格式的擴展,但并不是所有郵件eml都是MIME格式,一封郵件的格式可能比MIME更簡單,同時,MIME并不局限于在郵件中使用,在很多HTTP報文中,也會發現MIME的身影。
了解了MIME格式,就可以從中提取所需的數據了。
下面將以一封郵件為例子,來對MIME格式進行解析說明。
01
—
郵件例子
一個MIME格式的郵件例子如下:
Return-Path: <mlemos@acm.org>
To: Manuel Lemos <mlemos@linux.local>
Subject: Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message
From: mlemos <mlemos@acm.org>
Reply-To: mlemos <mlemos@acm.org>
Sender: mlemos@acm.org
X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf"
Message-ID: <20050430192829.0489.mlemos@acm.org>
Date: Sat, 30 Apr 2005 19:28:29 -0300
--652b8c4dcb00cdcdda1e16af36781caf
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
aGVsbG8uIOWNj+iuruWIhuaekOS4jui/mOWOnw==
--652b8c4dcb00cdcdda1e16af36781caf
Content-Type: text/plain; name="attachment.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="attachment.txt"
VGhpcyBpcyBqdXN0IGEgcGxhaW4gdGV4dCBhdHRhY2htZW50IGZpbGUgbmFtZWQgYXR0YWNobWVu
dC50eHQgLg==
--652b8c4dcb00cdcdda1e16af36781caf--
在這封郵件里,包含了三個MIME的語句:
MIME-Version:?
Content-Type:?
Content-Transfer-Encoding:?
Content-Disposition:?
從這個MIME的典型應用中,可以看到,MIME的精髓是數據的分段分類描述,以及數據的可嵌套性和可編碼性。
02
—
格式說明
一個MIME消息由兩部分組成,分別是消息頭和消息體。
在消息頭中,語句“MIME-Version: 1.0”是必須的。
而“Content-Type:”項,則是描述數據的類型和編碼,默認為“text/plain”,“/”前后分別為主要類型和次要類型,常見的類型有:
text/plain
text/html
image/jpeg
audio/mpeg
video/3gpp
application/gzip
application/rtf
multipart/alternative
詳細的類型可參考http://www.iana.org/assignments/media-types/media-types.xhtml。
對每個“Content-Type:”,有不同的參數,如charset,name,boundary等。
主類型“multipart”是MIME的精髓所在,它將多種數據編碼在一起,常見的有“multipart/mixed“,” multipart/related“和”multipart/alternative”。
當“Content-Type:”為“multipart/mixed”等時,表示數據為多種內容的混合,此時會有類似boundary="652b8c4dcb00cdcdda1e16af36781caf"的分隔線描述,分隔線會將數據內容分隔成各自獨立的部分,在各部分中,分別有獨立的數據內容描述。分隔線的前后,會有“--”,處理過程中過濾即可。
“Content-Transfer-Encoding:?”描述的是內容的編碼轉換格式。一般有“base64”和“quoted-printable”兩種,即表示內容為BASE64編碼和QP編碼。
“Content-Disposition:?”描述的是數據的安排方式,如“attachment”表示為附件,“inline”表示為內嵌數據,這些有參數“filename”。
消息體是消息頭的各個描述及分隔線之外,在各個0x0d0x0a對之間的內容,一般是各種編碼了的數據。
雖然介紹了這么多,但在數據解析中用起來很簡單,只需要找到各個數據段的描述,名稱,內容,就可進行編碼轉換、形成結構化數據并保存了。
長按進行關注。
總結
- 上一篇: 如何高效地爬取链家的房源信息(四)
- 下一篇: 从新手到入门,如何进入协议分析的世界