vc程式設計 Email亂碼問題的解決

2021-05-05 01:43:55 字數 2145 閱讀 8537

基礎知識:

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 本身就存在亂碼問題 這種情況是指你的 本身就存在亂碼問題。照成這種情況的原因一般是你以另一種編...