基礎知識:
smtp
1、概述
smtp被用來在網際網路上傳遞電子郵件。檔案rfc821規定了該協議的所有細節。
協議的原理很簡單。無非是乙個客戶端計算機向伺服器傳送命令,然後伺服器向客戶端計算機返回一些資訊。客戶端傳送的命令以及伺服器的回應都是字串。
首先要與郵件伺服器連線,伺服器將返回文字。該文字包含乙個三位數的**及描述,例如:
220-ns.cinfo.ru sendmail 8.6.12/8.6.9 ready at wed, 22 apr 1998 22:54:41 +0300
220 esmtp spoken here
這些描述可能會因伺服器而異。只須要知道**所代表的意思就行了。**220表示成功建立連線,伺服器等待你的第乙個命令。
向伺服器傳遞的第乙個命令是helo. 該命令包含乙個引數,即你的郵箱名。
helo oleg
注意: 在rfc821中,helo是乙個可選擇性命令,如果伺服器不要求該命令的話,你可以把它忽略掉。
如果命令成功,伺服器會返回乙個**為250的回應。
下一步用mail from命令告訴伺服器你想發一封郵件。該命令以發信人的郵件位址為引數。
mail from: [email protected]
發完命令後,如果伺服器返回乙個**為250回應,你就可以向伺服器傳送rcpt to命令了。
rcpt to命令以收信人位址為引數,是告訴伺服器你想將郵件發到收信人位址處。
rcpt to: [email protected]
解決方法:
為了適應有些傳統系統 會把8bits首位過濾掉的問題,
郵件 協議裡專門新增了base64和quoted-printable兩種編碼方式,把多位元組字元轉換成7bits字元,
具體的概念以及編碼規則 本文就不說了。
按照rfc的規範, 「簡單email測試」這幾個字會被轉成
=?gb2312?b?vpklpwvtywlssulkla==?=
抽象的說,是以 "=?" 開頭 , "?="結束,中間 兩個問號夾著編碼規則, q表示quoted-printable , b 表示 base64 。 如果按照q或b規則重新解碼,郵件原字就能正確顯示。
但是有些軟體 會有乙個不同於rfc要求的處理,即在使用base64編碼時對乙個字串進行分段處理。比如上面的「簡單email測試」, 就會分成三段 「簡單」 「email" "測試」。
按照這樣處理的編碼就成了出來的
=?gb2312?b?vpklpq==?=email=?gb2312?b?sulkla==?=
大家應該都能看出來,區別在於處理時對於天然就是7bits的字元,不作任何編碼轉換,保持原貌,其他的分段編碼。
mime對信頭字段的擴充套件
mime 對rfc822的字段補充了一些信頭字段,這些字段通常是在傳送電子郵件的軟體在建立電子郵件時產生的,接受電子郵件的軟體提取其中的字段得到有用的資訊
mime補充的信頭字段:
mime-version欄位用於標誌使用的mime版本號,這是為了將來增加版本號解決相容的問題。該字段是mime信件唯一必須要求出現的字段。
目前只有乙個mime版本在使用,一般加入一下字段:
mime-version: 1.0
content-type是mime中的主要字段,描述特定mime實體中包含的資料。
這個欄位有3部分:前兩部分組成**型別和1個可選分號分開的引數列表。如:
content-type:text/plain;charset="us-ascii"
其中text是**型別主類別,plain指**型別的附加層次類別。charset="us-ascii"是可選的引數列表。又如: content-type:text/html;charset=gb2312
指定**的主型別是text,但文字內容是html格式檔案。使用字符集是gb2312。
content-transfer-encoding,許多資料格式可以包含在信件中允許的字元範圍之外的位元組值,而且含有超過允許長度的資料行。一些資料格式的定義甚至沒有行的概念。content-transfer-encoding欄位解決這些問題.
該字段有5個值:7bit,8bit,binary,base64和quoted-printable.每個值都不區分大小寫。符合mime規範的郵件處理程式必須能對這些編碼正確處理。
php程式設計時亂碼,php GD庫中文亂碼的解決方法
注意 在用gd庫輸出中文字串時,要使用imagettftext 函式,呼叫imagestring 函式是不行的。參考示例如下。示例1 pic imagecreate 250,30 black imagecolorallocate pic,0,0,0 white imagecolorallocate ...
Ubuntu gedit 中文亂碼問題 秒解
在中文支援配置還不完整的ubuntu 14.04中,使用gedit開啟帶有中文字元的檔案有時會出現亂碼的情況,這是由於gedit對字元編碼匹配不正確導致的,解決方法如下 在終端中輸入如下命令,然後重新開啟gedit即可 gsettings set org.gnome.gedit.preference...
PHP 程式設計亂碼問題
他設定了瀏覽器端採用gb2312的字符集,此時如果程式使用的是utf8的編碼 就是指以什麼樣的編碼來編寫的程式,一般在編輯器中設定 那麼就會產生亂碼。此時的解決方法就是把charset的值改為utf8 2 本身就存在亂碼問題 這種情況是指你的 本身就存在亂碼問題。照成這種情況的原因一般是你以另一種編...