一步一步從原理跟我學郵件收取及發送 13.mime格式與常見字符編碼

    在前面的本系列文章中咱們已經學會了郵件的發送和收取。但在收取中咱們看到的是一串串的亂碼,回憶前面的發送過程,咱們會奇怪:咱們前面的郵件是明文啊。爲何明文的郵件明明也能夠正常工做,還要弄亂碼似的字符串編碼呢?讓咱們先來看一下前面發送過的郵件內容:

php

From: "test1@newbt.net" <test1@newbt.net>
To: "clq@newbt.net" <clq@newbt.net>
Subject: test
Date: Sun, 21 Jan 2018 11:48:15 GMT

Hello World.

    從中咱們能夠看到,其實能夠直接在"記事本"中把郵件直接寫出來。這是由於電子郵件的格式是 mime 而最簡單的 mime 格式並不複雜。mime 固然也是有 rfc 文檔進行說明的,不過明顯太過複雜,咱們先不要管它,先直接直觀的看看眼前的這個郵件的格式。前面幾行比較簡單,咱們猜也能猜出來,無非是說明了郵件的發件人、收件人這樣的信息。後面的內容也簡單啊,不就是郵件內容嘛!可是這裏就有一個 mime 初學者很是容易出錯的地方,後面的內容不單單是電子郵件的內容那麼簡單。實際上它包含了分隔符。什麼分隔符號?你會問。我要說這封郵件裏包含了兩部分:一部分是頭信息,包括髮件人、收件人、標題、日期;另外一部分是內容 "Hello World." 你能從上面的內容中找到它們的分隔符號是什麼嗎?大部分的同窗仔細看過都會說,我看得出來是兩部分,可是分隔符號是什麼我真不知道。這個就是直觀感覺和程序處理的區別了,一眼看過去咱們彷佛能知道是兩部分,但具體的就要知道格式的標準了。在這裏,它的標準說明是:分隔符號是一個空行,不過在程序中它應該或者說必須描述爲 "字符串流中的第一個空行前是頭信息" 我不能說以後的就是內容,雖然這封信裏看起來是這樣。只能說對於這封信來講後面的內容是具體的信息,能夠用下圖表示:
程序員


在繼續往下說之前咱們要明白 mime 實際上在 http 中和 email 中是不太同樣的,學過 http 的 mime 內容的同窗要注意了:mime 在電子郵件中要比 http 中複雜得多,雖然它們是同一個標準

    這裏要再提出一個問題,若是咱們要寫一箇中文的標題應該怎麼寫?你會說,改 subject 那裏爲"中文標題"就能夠啦。若是咱們這樣作的話,確實對方能夠收到一封中文的郵件。但我要說的是這樣作是錯誤的。

(錯誤的中文標題作法)

咱們前面的文章已經說過了,中文的內容在傳統上是要使用編碼的,因此正確的標題應該是下面的這樣:
編碼


這裏使用的編碼方式就是前面說過的 base64。不過在郵件編碼中還有一種更傳統的,那就是"quoted-printable"編碼,例如如下的這封 facebook 的信件內容就是這種編碼的。

spa


因此咱們就明白了,要處理好電子郵件的 mime 那麼就要先處理好這些編碼格式,幸虧經常使用的編碼就這兩種,而 base64 咱們前面又掌握了。因此咱們只要再學會"quoted-printable"編碼就能夠了。

其實"quoted-printable"說來也很簡單,基本上就是咱們經常使用的 http 的網址的編碼,即將一個不可打印字符按16進制轉換成基本字符串,而後在前面加上"="號就能夠了,因此一個普通字符轉換後要變成三個字符,是比較佔空間的。不過如今是地球村時代,咱們要特別注意字符集的處理,具體處理咱們下一篇用純C的代碼來作一個示例。好了這一次的內容就到這裏了。

.net

注:查看電子郵件源碼的話,直接在163 這樣的站點上是看不到的,能夠搜索一下 foxmail4.2 (最新版本我沒試過);也能夠用筆者的 eemail ,不過早期版本 mime 標題部分不完善,請到如下地址下載最新版本:3d

http://newbt.net/ms/vdisk/show_bbs.php?id={B7106D5A-A5CB-3CFE-DFEB-4A4909A9B13A}&pid=43code

這篇的內容稍少,不過不先搞清楚"quoted-printable"編碼是不行的,因此仍是得有這一章節。blog

--------------------------------------------------文檔

版權聲明:字符串

本系列文章已受權百家號 "clq的程序員學前班" . 文章編排上略有差別.

相關文章
相關標籤/搜索