1. 程式人生 > >smtp郵件格式(附件)

smtp郵件格式(附件)

已經厭倦了給你的朋友和客戶傳送那些單調乏味的文字通知和信件了嗎?曾經考慮過傳送附件或在郵中嵌入HTML吧

答案就是MIME。接下來的幾頁解釋了MIME的基礎知識,建立符合MIME的資訊,然後用一個可以工作的PHP
類結束,這個類實現了傳送符合MIME郵件。注意對呼叫指令碼,呼叫者等等的引用表示使用了將要開發的類的
指令碼,客戶程式/MUA等等表示郵件閱讀的客戶程式或郵件使用代理程式。

一些MIME基礎
MIME表示多用途Internet郵件擴允協議。MIME擴允了基本的面向文字的Internet郵件系統,以便可以在
訊息中包含二進位制附件。

MIME利用了一個事實就是,RFC 822在訊息體的內容中做了一點限制:唯一的限制就是隻能使用簡單的
ASCII文字。所以,MIME資訊由正常的Internet文字郵件組成,文字郵件擁有一些特別的符合RFC
822的資訊頭和格式化過的資訊體(用ASCII的子集來表示的附件)。這些MIME頭給出了一種在郵件中表示附件的特別的方法。

MIME資訊的剖析
一個普通的文字郵件的資訊包含一個頭部分(To: From:Subject: 等等)和一個體部分(Hello Mr.,等等)。在一個符合MIME的資訊中,也包含一個資訊頭並不奇怪,郵件的各個部分叫做MIME段,每段前也綴以一個特別的頭。MIME郵件只是基於RFC 822郵件的一個擴充套件。然而它有著自已的RFC規範集。


頭欄位
MIME頭根據在郵件包中的位置,大體上分為MIME資訊頭和MIME段頭。(譯者:MIME資訊頭指整個郵件的頭,而MIME段頭只每個MIME段的頭。)

MIME資訊頭有:

MIME-Version:
這個頭提供了所用MIME的版本號。這個值習慣上為1.0。
Content-Type:
它定義了資料的型別,以便資料能被適當的處理。有效的型別有:text,image,audio,video,applications,multipart和message。注意任何一個二進位制附件都應該被叫做application/octet-stream。這個頭的一些用例為:image/jpg, application/mswork,multipart/mixed,這只是很少的一部分。
Content-Transfer-Encoding:
這是所有頭中最重要的一個,因為它說明了對資料所執行的編碼方式,客戶將用它對附件進行解碼。對於每個附件,可以使用7bit,8bit,binary ,quoted-printable,base64和custom中的一種編碼方式。7bit編碼是用在US ASCII字符集上的常用的一種編碼方式,也就是,保持它的原樣。8bit和binary編碼一般不用。對人類可讀的標準文字,如果傳輸要經過對格式有影響的閘道器時對其進行保護,可以使用quoted printable 。Base64是一種通用方法,在需要決定使用哪一種編碼方法時,它提供了一個不用費腦子的選擇;它通常用在二進位制,非文字資料上。注意,任何非7bit 資料必須用一種模式編碼,這樣它就可以通過Internet郵件閘道器!
Content-ID:
如果Content-Type是message/external-body或multipart/alternative時,這個頭就有用了。它超出了本文的範圍。
Content-Description:
這是一個可選的頭。它是任何資訊段內容的自由文字描述。描述必須使用us-ascii碼。
Content-Disposition:
一個試驗性的頭,它用於給客戶程式/MUA提供提示,來決定是否在行內顯示附件或作為單獨的附件。
MIME 段頭(出現在實際的MIME附件部分的頭),除了MIME-Version頭,可以擁有以上任何頭欄位。如果一個MIME頭是資訊塊的一部分,它將作用於整個資訊體。例如,如果Content-Transfer-Encoding顯示在資訊(指整個資訊)頭中,它應用於整個資訊體,但是如果它顯示在一個 MIME段裡,它"只能"用於那個段中。

"好,如何建立符合MIME的資訊呢?"   通過上面的一般性的描述,讓我們現在看一下所謂的MIME資訊到底是什麼!

最簡單的MIME資訊
這個資訊沒有任何段,也就是,沒有附件。然而,因為它是一個MIME訊息,它必須有必要的頭。

From:
[email protected]

To: 'Alex (the Great)' <[email protected]>
Subject: Bucephalus
MIME-Version: 1.0

Hello Alexander,How's Bucephalus doing?

這裡面沒有什麼,它只是一個簡單的擁有MIME頭的符合RFC-822的資訊(文字郵件)。注意,如果沒有指定Content-Type頭,則假設為 Content-Type: text/plain;charset='us-ascii'!當然,它有些簡單,複雜一些的如下:

From: 'Alex (the Great)' <
[email protected]
>

To: [email protected]
Subject: re: Bucephalus
MIME-Version: 1.0
Content-Type: image/jpg;
name='buce.jpg'
Content-Transfer-Encoding: base64
Content-Description: Take a look at him yourself

<.....base64 encoded jpg image of Bucephalus...>

"嗨,但是我想傳送一個word文件和一張我的小狗的圖片在同一封郵件中...!"一個使用者說!如果是真的,上面的那個例子就太簡單了,並且它沒有足夠的內容來支援愛好者和現代郵件處理方面的需要。實際上,許多的郵件客戶端軟體甚至不能顯示描述欄位!

這就是我們所面臨的"多部分資訊"。


多部分資訊(Multipart Messages)
這個概念允許在一封郵件中傳送多條專案。例如,假設Alexander想要給
[email protected]
傳送一封他的馬的照片的郵件,同時還附帶有馬的家族圖譜及精彩的說明!這樣一個簡單的要求沒有多部分訊息的概念是無法被滿足的。在這種情況下,我們建立了一個使用Content-Type的資訊頭的封裝來支援郵件的不同部分,以便收信人得到圖片,家族圖譜和精彩的說明!

Content-Type 頭現在擁有一個"multipart"的值,它表示這是一個完整的郵件資訊並且這個頭只封裝了資訊。而且它還有一個"mixed"的子型別(畢竟圖片,家族圖譜和7bit文字資訊是不同的型別,對嗎?)。

讓我們看一下整個圖片看上去象:


From: 'Alex (the Great)' <[email protected]>
To: [email protected]
Subject: re: Bucephalus
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="XX-1234DED00099A";
Content-Transfer-Encoding: 7bit

This is a MIME Encoded Message

--XX-1234DED00099A
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi PHP,Attached you will find my horse, Bucephalus', pedigree chart and photo.

Alex

--XX-1234DED00099A
Content-Type: image/jpg;
name="buce.jpg";
Content-Transfer-Encoding: base64
Content-Description: "A photo of Bucephalus"

<.....base64 encoded jpg image of Bucephalus...>

--XX-1234DED00099A
Content-Type: application/octet-stream;
name="pedigree.doc"
Content-Transfer-Encoding: base64
Content-Description: "Pedigree Chart of the great horse"

<.....base64 encoded doc (pedigree.doc) of Bucephalus...>

--XX-1234DED00099A--

喲,看上去很複雜,不是嗎?不管怎樣,讓我們瀏覽一遍細節吧:

如果你注意到了在MIME資訊頭中的Content-Transfer-Encoding,為"7bit"。因為Content-Type為 multipart/mixed,編碼應該是7bit,8bit或二進位制中的一種,7bit是一種廣泛使用的格式。象這樣一條資訊包含了多種資訊。客戶程式是如何知道JPG圖片,文件和普通文字之間的區別呢?你會注意到在Content-Type後面有一個boundary="XX- 1234DED00099A"引數。這個值用來分離郵件中的不同部分。它叫做MIME邊界標記。邊界標記的值必須儘可能的唯一,以免在超出郵件範圍時發生混亂。
"警告"資訊(譯者:指"This is a MIME Encoded Message")在那裡是為了讓不符合MIME的客戶程式能夠把它顯示給使用者,否則他們就不理解一個空白郵件是什麼意思。

現在,回到邊界標記。如果你觀察這個簡單的郵件,會發現邊界標記(XX-1234DED00099A在每一個分都出現了,也就是,在每部分之間都使用了一個邊界標記,然而,每個邊界標記都以兩個連線符開始。
很重要的一點需要注意的就是在最後一個MIME段的後面,邊界標記不僅僅以那兩個邊接符作為開始,同時也以它倆作為結束。這一點一定不能忘記,因為它定義了郵件的範圍。

讓我們看一下前兩個MIME段:
第一段是普通文字資訊,因此Content-Type為text/plain,並且編碼為7bit(我們也可以省略它,因為如果不指明它也會預設為如此)。
第二個就是JPEG圖片。相應的表示為Content-Type: image/jpg。name="buce.jpg"(出現在Content-Type的後面,稱之為引數),指出了檔案的名字;它就是可以在客戶程式中看到的附件的名字。如果不給出name="buce.jpg",描述欄位(如果給出)將作為附件的名字顯示出來(然而,在所有客戶程式中它不是統一的做法)。
注意JPEG圖片可以在郵件件中被顯示出來,如果客戶程式可以顯示行內附件。或者,你可以向客戶程指明你想如何顯示附件。例如,如果存在

Content-Disposition: attachment 頭,JPEG圖片將被顯示為一個附件圖示。
MIME 類
在有了這些基礎之後,讓我們用PHP建立和實現一個MIME郵件類。在我們的PHP庫函式中,已經有了編碼所必須的工具。

MIME類必須能夠:

增加附件
對每一個獨立的請求,對所附的資料進行編碼
建立MIME段/頭
生成一個包含MIME段/頭的完整的郵件
將整個郵件作為字串返回
用本地的郵件處理程式進行傳送(或選擇呼叫一個SMTP郵件處理程式)

相關推薦

smtp郵件格式附件

已經厭倦了給你的朋友和客戶傳送那些單調乏味的文字通知和信件了嗎?曾經考慮過傳送附件或在郵中嵌入HTML吧答案就是MIME。接下來的幾頁解釋了MIME的基礎知識,建立符合MIME的資訊,然後用一個可以工作的PHP類結束,這個類實現了傳送符合MIME郵件。注意對呼叫指令碼,呼叫者等等的引用表示使用了將要開發的類的

C#傳送郵件附件

本部落格主要利用C#中System.Net.Mail中的MailMessage 類進行郵件的傳送。話不多說直接上程式碼: using System; using System.Collections.Generic; using System.Conf

http格式graph

addclass pos ava dsm div pop ide 請求 fun http請求格式 http請求頭 字段 http響應 http響應頭字段 $(function () {

DNS報文格式RFC1035

zone txt form 暫時 let gen 表示 字節 ron 2、資源記錄定義(RR definitions) 2.1 格式 後面分析報文的時候詳細解釋。 2.2 類型值(TYPE values) 類型主要用在資源記錄中,

解決jdk1.8中發送郵件失敗handshake_failure問題

註意 自己 ota target util tom exceptio images ive 解決jdk1.8中發送郵件失敗(handshake_failure)問題 作者 zhisheng_tian 2016.08.12 22:44* 字數 1573 閱讀 2

郵件報警postfix

login span sendmail shp str sta 主機ip 宋體 build postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟件。postfix是Wietse Venema想要為使用最廣泛的sendmail提供替

zabbix系列之郵件告警

zabbix 郵件告警 設置郵件告警有兩種方式:1)、通過Linux自帶的mail發送告警郵件2)、通過第三方郵箱發送(如QQ郵箱、163郵箱等)告警郵件1、修改 zabbx_server.conf 文件,指定腳本路徑,沒有則添加[root@centos1 ~]# vim /usr/local/zab

Azure雲部署Postfix郵件系統

安全機制 變量賦值 分享圖片 car 帶來 核心部分 相同 nco 容易 簡介毫無疑問,雲計算是今年和今後幾年IT界最重要的概念之一,而隨著雲的提出,各種應用也不斷出現,在雲計算領域,各大著名IT廠商都推出自己的特有“雲”。在一個新技術的探索階段,在雲計算的模式最終成熟之前

Postfix郵件系統+dovecat

star ati red interface 開啟 安裝 發送 從域名服務器 swd 郵件服務器是一種用來負責電子郵件收發管理的設備。它比網絡上的免費郵箱更安全和高效,因此一直是企業公司的必備設備。本次實驗是由DNS、postfix、dovecot服務共同組建成為郵

C# 應用Excel條件格式

add mfile cell 運行程序 afa arc lin png studio Excel中的條件格式功能是個十分強大且方便的功能,通過對使用條件格式功能可以在很大程度上改進表格的設計和可讀性,用戶可以指定單個或者多個單元格區域應用一種或者多種格式,如此一來,也大大提

C# 設置Excel條件格式

result pbo 調試運行 註意 sin 兩個 collect raw gree 上一篇文章中介紹了關於設置Excel條件格式,包括基於單元格值、自定義公式等應用條件格式、應用數據條條件類型格式、刪除條件格式等內容。在本篇文章中將繼續介紹C# 設置條件格式的方法。 要點

日期型轉json格式springboot

可以在屬性上增加 GMT+8表示東八區 @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") 或 @JsonFormat(shape = JsonFormat.Shape.NUMBER) 全域性修改可以在application.

使用者註冊傳送郵件啟用

  由於本人實戰專案,編碼習慣等方面欠缺,本文存在不妥地方,還請大家多多留言。特此宣告:此文僅作技術交流與探討,不允許發垃圾郵件等破壞公共資訊保安行為,愛護網路環境,人人有責。 本系統參考的博文有: 系統分層:https://blog.csdn.net/zdwzzu200

深入理解Java Class檔案格式

經過前八篇關於class檔案的部落格, 關於class檔案格式的內容也基本上講完了。 本文是關於class檔案格式的最後一篇。 在這篇部落格中, 將會講解關於方法的幾個屬性。 理解這篇部落格的內容, 對於理解JVM執行引擎起著重要作用。 關於虛擬機器執行引擎有關的內容, 會在本專欄後面的部落格中涉及

深入理解Java Class檔案格式

在本專欄的第一篇文章 深入理解Java虛擬機器到底是什麼 中, 我們主要講解了什麼是虛擬機器, 這篇部落格是對JVM的一個概述。 在隨後的幾篇文章中,一直在講解class檔案格式。 在今天這篇部落格中, 將會繼續講解class檔案中的其他資訊。 在本文中, 將會講解class檔案中的最後一

深入理解Java Class檔案格式

本專欄列前面的一系列部落格, 對Class檔案中的一部分資料項進行了介紹。 本文將會繼續介紹class檔案中未講解的資訊。 先回顧一下上面一篇文章。 在上一篇部落格中, 我們介紹了: this_class    對當前類的描述 super_class  &

深入理解Java Class檔案格式

經過前幾篇文章, 終於將常量池介紹完了, 之所以花這麼大的功夫介紹常量池, 是因為對於理解class檔案格式,常量池是必須要了解的, 因為class檔案中其他地方,大量引用了常量池中的資料項。  對於還不瞭解常量池的讀者, 如果想要深入瞭解class檔案格式, 或者想繼續讀這篇部落格和本專

Java mail 傳送郵件 主題標題亂碼

最近開發遇到Javamail  傳送郵件標題亂碼問題,騰訊、網易郵箱不會亂碼,阿里郵箱  標題則會亂碼。解決辦法: String subject = MimeUtility.encodeWord(mailEntity.getMailSubject(), "UTF-8", "Q");

上傳檔案Base64格式React

     記錄一下上傳檔案時將檔案資料轉為Base64的方法      通過 FileReader物件建立一個例項,然後使用 readAsDataURL方法將資料轉為Base64格式      注意: 讀取

請問C#壓縮常見圖片格式JPG質量/解析度該如何實現

如何識別驗證碼VS2010開發C#工程怎麼用命令列分析計算程式碼度量值如何識別驗證碼VS2010開發C#工程怎麼用命令列分析計算程式碼度量值 C#可以寫伺服器端嗎C#類的解釋C#可以寫伺服器端嗎C#類的解釋 winformc#程式碼如何實現圖片只一個角變形通過asp.netC