Dolgozunk a pantomim

Ki MIME, és miért van rá szükség, hogy vele együtt dolgozni?

MIME - Multipurpose Internet Mail Extension - mail szabvány. Mail üzenet nem csak a szöveg és a mellékletek, hogy használják, hogy önmagában az üzenet tartalmaz egy MIME-fejléceket. amely tartalmazza az összes szükséges információt az üzenetet, mint például az adatok a feladó / címzett, tárgy, üzenet szövegét, mellékletek, fájlok, információk a kódolási és titkosítási módszerek, valamint a teljes útvonalat az üzenetet. Ha van egy e-mail kliens a The Bat!. akkor könnyen nézd meg a belsejét bármilyen e-mail üzenetet, jelölje meg az üzenetet, és kattintson a Speciális menü => Eredeti szöveg a levél. vagy az F9-et (lásd. ábra. 1).

A MIME specifikáció

MIME szabvány részletesen alatt RFC-1341 szabványt, és bővíthető, az alábbiakban általam vázolt fő területeit MIME.

többrészes típus azt jelzi, hogy az üzenet kevert adattípus, azaz Egy üzenet tartalmazhat egy vagy több, a fentiekben leírt adattípusok. többrészes típusú 4 fő altípust: vegyes. alternatíva. kivonatot. párhuzamosan.

Altípus összekeverjük definiál egy üzenetet, amely több (multi) alkatrészek (rész), egymástól elválasztott határvonal (határ). A határ definiált határ paramétert a Content-Type. A határ egy sor ASCII-karakter. Minden része az üzenet, amellett, hogy az alapadatok tartalmazhat a fejléceket, amelyek meghatározzák, hogy milyen típusú tartalom és információ a kódolását. Az üzenet elválasztják egymástól a neve a határon, és a nevét a határ a szervezetben az üzenet mindig karakterekkel kezdődő -. az utolsó határ emellett végződik -.

Ahhoz, hogy érthetőbb, hogy miről szól, nézd meg a következő darab MIME:

Content-Type: multipart / mixed; boundary = "moia granica"
--moia granica
Content-Type: text-terv

Hello! Van minta az én határa!

--moia granica
Content-Type: text / terv

És ez a következő része az üzenet!

Mint látható, ez az üzenet tartalma van típusát többrészes altípus összekeverjük. Itt megadatik a neve a határ - moia granica. Egy üzenet két részből áll, mindegyik rész típusú szöveg altípus tervet. Az első rész az üzenet szövegét tartalmazza: «Hello! Van minta az én határa», míg a második része az üzenet szövegét tartalmazza:»És ez a következő része az üzenet!«. Több mint egy szöveges üzenetet a részét egy részvény lesz, ez általában, ha az esetleges mellékletek (attachi) jelen vannak az üzenetben.

Altípus alternatív azonos altípus összekeverjük. Azonban minden része az üzenet egy üzenet által optimalizált funkciók az e-mail kliens. Például az üzenet állhat több részből áll, az egyik rész szöveges tartalma text / terv. egyéb - hipertext text / html. Ebben az esetben, ha nincs ügyfél e-mail program támogatja a HTML, majd megjeleníti az első része az üzenet (text / terv), ellenkező esetben - a második (text / html).

Altípus párhuzamos azonos altípusú összekeverjük és elsődleges célja, hogy megjelenítse, ugyanakkor minden része az üzenetet.

Ezek a fő altípusa többrészes. számuk, ahogy korábban mondtam, nőhet.

Üzenet típusa főleg azokban az esetekben, amikor egy üzenet nem érkezett meg teljes egészében. Az elsődleges altípusát ilyen típusú: részleges - azt jelzi, hogy az üzenet részekre van osztva, azzal jellemezve, hogy a Content-Type mező jelzi a számú paramétert részek (összesen), cikkszám (szám), és egy azonosító (id); Külső-testület - lehetővé teszi, hogy olvassa el a külső forrásokból.

Azt is meg kell jegyezni, hogy a Content-Type mező tartalmazhat charset paraméter. amely információkat tartalmaz a használt kódolás, ez lehet egy windows-1251, kio8-r, stb Ha az üzenet mellékleteket, a Content-Type is van lehetőség neve. amely tartalmazza a nevét, a csatolt fájlt, például:

Content-Type: application / x-zip-tömörített; name = "MyFile.zip"

Ahogy valószínűleg észre, az összes paraméter elválasztva (;) ugyanabban az időben, minden paraméter lehet írni egy külön sorban, valamint a paraméterértékek idézett, bár ez nem feltétlenül szükséges. Ez okozhat némi problémát írásakor MIME-olvasó (MIME Reader), de mégis ezt a funkciót meg kell vizsgálni.

Hozzászólások típusát (Content-Type-kódolás)

Mező Content-Type-Encoding vonatkozó információt tartalmaz, a kódolás típusát az üzenet. Jelenleg 6 alaptípusa kódolás: Base64. Idézett nyomtatható. 7bit. 8 bites. Binary. X-Token. Típusai 7bit kódolás. Binary 8Bit és nem igényelnek átalakítás, mivel az adatok átvitele bájt.

kódolási típus Base64 - pozicionális számrendszer bázissal 64, ahol 64 - a legnagyobb hatalom két, amely képviseli ASCII-karakter. Base64 kódolás használ karakterek A-Z, a-z, és az 0-9, is használják MIME szimbólumok "+", "/" és a "=".


kódolás idézett típusú nyomtatható sorrendjét képviseli a karakterek hexadecimális, az ASCII-kódolt csak a kód szimbólumot, amely meghaladja a 122, és a többi szimbólum jelentése a van. Mielőtt a kódolt jelek helyezi a jel „=”.


Kódoiástípust X-Token segítségével a felhasználó határozza meg a kódolási szabályok.

Tárgy mező az üzenet tárgyát.

Tárgy: Az üzenet tárgya

Ország: [a feladó nevét <]email@отправителя.ru[> (Társaság)]

A társaság neve is egy külön szervezet mezőben.

To: [email protected]
From: Nemiro Aleksey
CC: Felhasználó
Szervezet: www.Kbyte.Ru

Azt is meg kell említeni a területen érkezett. amely információkat tartalmaz az út az üzenet. Kapott területeken lehet néhány, számuk attól függ, hogy a szerverek számát, amelyen keresztül az üzenetet a végső rendeltetési helyre, minden szerver hagyja magára vonatkozó információkat ezen a területen.

Egy másik érdekes területen - X-Mailer. amely tartalmazza a nevét, e-mail kliens, amelyen keresztül az üzenetet küldte.

Időpontja üzenetküldés megtalálható a dátum mezőben.

X-Priority mező egy megjegyzés a prioritás a levél, mint általában, egy számérték, vagy a kettő kombinációja numerikus és alfanumerikus értékeket. A levél lehet a következő prioritásokat:

2 (Magas) - Magas prioritás
3 (normál) - Normál prioritás
4 (alacsony) - alacsony prioritású

Jelenlétében mellékletek (attachey) az üzenet területen is lehet jelen Content-Disposition. amely tartalmaz egy leírást a beruházás (ház), különösen a fájl nevét, például:

Content-Disposition: attachment; fájlnév = "MyFile.rar"

Száma MIME területeken is lehet növelni, ahol beszélt a fő területeit, amelyek gyakran megtalálhatók a jelentéseket.

Felhívjuk figyelmét, hogy minden területen is lehet titkosított, titkosító tipikusan típusú kódolási Base64 és jegyzett-nyomtatható. valamint esetleg meghatározott szöveges kódolás, például: windows-1251. kio8-R. utf-8, stb Ha a mező értéke titkosított, meg van írva a következő formában:

=? kódlapot. kódolás típusát. mező értéke =

Code oldal - van, sőt, van windows-1251. kio8-R. utf-8, stb
Kódolási típus - jelenti az első szimbólum nevét kódolási típust, ez lehet akár a B - Base64. vagy Q - Quoted-Printable.

Mező Érték - ez kódolt meghatározott kódolási típus mező értéke.

Meg kell jegyezni, hogy csak a magyar karakterek alakítjuk Idézi nyomtatható, azaz karakter kódok több mint 122, a többi karakter van írva, ahogy van, az első az egyes kódolt szimbólum kerül a jel „=”. És a szöveg kódolva Base64.

olvasni MIME

És így, a kezdet próbál írni funkciója megfejtése a szöveg Base64 és jegyzett-nyomtatható. Kezdjük egy egyszerű és írjon a dekódolási funkció Idézi nyomtatható. Mint már mondtam, idézte nyomtatható alakítja néhány karakter hexadecimális és előtte az egyes transzformált szimbólum hozza a jel „=” ebben és alapja:

Private Function QPDecode (ByVal sSzoveg As String) As String
Ha sText.Length <= 0 Then Return ""
Dim sResult As String = ""
Dim chrCurrentChar As Char
Dim intTextLength As Integer = sText.Length
Dim i As Integer = 1

, Amíg én <= intTextLength
„Vedd a szimbólum
chrCurrentChar = Convert.ToChar (Mid (sSzoveg, i, 1))
„Ha kezdődik = ez hexadecimális kódját
Ha chrCurrentChar = "=" Akkor
megpróbál
„Figyelembe a következő két karakter
És próbálják átalakítani a decimális szám,
„Majd egy szimbólum
sResult + = Chr (CInt ( "H0" Mid (sSzoveg, i + 1, 1) _
Mid (sSzoveg, i + 2, 1)))
i + = 3
Fogási ex Amint Kivétel
„Van egy közönséges karakter, hagyja, ahogy van
sResult + = chrCurrentChar
i + = 1
vége Try
más
„Van egy közönséges karakter, hagyja, ahogy van
sResult + = chrCurrentChar
i + = 1
End If
hurok

„Adja a dekódolt szöveg
Vissza sResult
End Function

Mint látható, semmi bonyolult ebben, ez a funkció egyszerűen átalakítja Quoted-Printable szöveget normális. Térjünk át Base64. Szöveg kódolt Base64. Ez áll egy sor kis és nagy karakterek az angol ábécé, számok és a „+” karakter „/” és a „=”. Visszafejteni Base64 az alábbi függvény:

Private Function Base64Decode (ByVal sSzoveg As String) As String
Dim sResult As String = ""
Dim i As Integer

I = 1 To sText.Length
Ha nem InStr (1, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + / =", Mid (sSzoveg, i, 1)) = 0, akkor
sResult + = Mid (sSzoveg, i, 1)
End If
Következő i

Ha (sResult.Length Mod 4) <> 0 Then
sResult + = StrDup (4 - (sResult.Length Mod 4), "=")
End If

Dim kódolás System.Text.Encoding = System.Text.Encoding.GetEncoding (1251)

megpróbál
„Konvertálása egy 8 bites karakter tömb
sResult = encoding.GetString (Convert.FromBase64String (sResult))
Fogási ex Amint Kivétel
„hiba
vége Try

Vissza sResult
End Function

Ez a funkció célja elsősorban a dekódolására szöveges adatot, hogy megkapja egy bináris (bináris) adatkimenet keresztül System.Text.Encoding.GetBytes Skip funkció kellően kapunk. vagy visszatérő Convert.FromBase64String (sResult).

MIME mezőértékeket Használhatok reguláris kifejezéseket:

Private Function GetHeaderBySource (ByVal sSource As String, ByVal sHeader As String) As String
Dim myRegex As New Regex ( „((?[A-zA-Z0-9 -] *): (?.*)) | ((?[A-zA-Z0-9 -] *): s (?.*))”, RegexOptions.Multiline)
Dim myMatchCollection Ahogy MatchCollection = myRegex.Matches (sSource)
Dim sResult As String = ""
Dim iStrt As Integer, iLngth As Integer
Az i As Integer = 0 A (myMatchCollection.Count - 1)
Ha myMatchCollection (i) .Groups ( "key"). Value.Trim.ToLower = sHeader.Trim.ToLower Aztán
sResult + = (myMatchCollection (i) .Groups ( "érték"). Value.Trim) vbCrLf
„Nézd, van valami, amit ez után csoportból
Ha én iStrt = myMatchCollection (i) .Groups ( "érték"). Index + myMatchCollection (i) .Groups ( "érték"). hossza + 1
iLngth = myMatchCollection (i + 1) .Groups ( "kulcs") Index -. iStrt - 1
Ha iStrt sResult + = cserél (sSource.Substring (iStrt, iLngth) .Trim, vbCrLf Chr (9), vbCrLf)
End If
más
„Azt, hogy a végén fejléc
iStrt = myMatchCollection (i) .Groups ( "érték"). Index + myMatchCollection (i) .Groups ( "érték"). hossza + 1
iLngth = sSource.Length - iStrt - 1
Ha iLngth> 0 Then
sResult + = cserél (sSource.Substring (iStrt, iLngth) .Trim, vbCrLf Chr (9), vbCrLf)
End If
End If
End If
következő
Ha sResult.EndsWith (vbCrLf) Ezután sResult = Mid (sResult, 1, sResult.Length - vbCrLf.Length)
Ha sResult.StartsWith (vbCrLf) Ezután sResult = Mid (sResult, vbCrLf.Length, sResult.Length - (vbCrLf.Length + 1))
Vissza sResult
End Function

Adatokat lekérni a területen, van elég a MIME szöveg és a mező nevét, amelynek értéke megszerzéséhez szükséges, például:

Ez a példa visszatér a mező értéke tól. Azt is meg kell jegyezni, hogy az adatok titkosítva vannak, így meg kell határozni, hogy milyen típusú kódolás és dekódolja az adatokat. Mint már mondtam, ha az adatok titkosítva vannak, akkor ők lesznek a következő formában:

=? kódlapot. kódolás típusát. mező értéke =

Ez egy szabványos, és nem lehet változtatni, így, hogy a szükséges információt, akkor könnyen reguláris kifejezéssel:

Ezzel a szintaxis állíthatók elő kódolás neve (windows-1251 kio8-R, stb) - csoport kódolás. kódolási típusát (Q vagy B) - csoport típusa. valamint a környezetben - a csoport szöveget. Ezen felül, miután a titkosított adatok is tartalmazhat semmilyen más szöveg - csoport othertext. Most, hogy van ez az adat könnyen futtatni őket az egyik korábban írt dekódolási funkció és élvezni az életet ;-) Nem, túl korai ünnepelni, dekódolás után, meg kell konvertálni a szöveget, hogy a szükséges kódlapot, ehhez használhatja a System.Text.Encoding. getEncoding.

Az üzenet maga, vagy zárt, jön után azonnal a címlapokra, meg kell venni, hogy a határokat a fejléc jelenléte határozza meg a végén a sorozat a két CRLF karaktereket. Más szóval, vége után azonnal fejlécek pár CRLF karaktereket.

InStr (smime, vbCrLf vbCrLf)

Minden más - ez egy szöveges üzenet vagy melléklet test (zárt).

Van is egy kis példa annak használata ASP .NET projektek.

Persze, hogy levelet generikus MIME-olvasó nem csak egy-két órát, de csak korlátozott felhasználásra, például a projektek, ez nagyon is valóságos.

Kapcsolódó cikkek