Cine este MIME, și de ce avem nevoie pentru a lucra cu el?
MIME - multifuncțională Mail Extension Internet - standard de e-mail. mesajul de poștă electronică nu este numai textul și atașamentele pe care le-ați utilizat pentru a vedea, în sine, un mesaj de e-mail este format dintr-un MIME-antete. care conțin toate informațiile necesare despre mesaj, cum ar fi date despre expeditor / destinatar, subiect, textul mesajului, atașamente, fișiere, informații despre codificare și de criptare metode, precum și calea completă a mesajului. Dacă aveți un client de e-mail The Bat!. atunci vă puteți uita cu ușurință la interiorul oricărui mesaj e-mail prin selectarea orice mesaj și faceți clic pe meniul special => Textul original al scrisorii. sau tasta F9 (vezi. fig. 1).
Specificațiile MIME
MIME detaliu standard, în conformitate cu RFC-1341 standard si este extensibil, mai jos am subliniat principalele domenii MIME.
tip multipart indică faptul că mesajul a amestecat tipul de date, adică, Un mesaj poate conține una sau mai multe dintre tipurile de date descrise mai sus. tip multipart are 4 subtipuri principale: mixt. alternativă. Digest. paralel.
Subtipului amestecat definește un mesaj alcătuit din mai multe părți (multi) (parte), separate una de cealaltă graniță (delimitare). Granița definit parametrul limită în Content-Type. Limita este un set de caractere ASCII. Fiecare parte a mesajului, în plus față de datele de bază pot conține antete care definesc tipul de conținut și informații cu privire la codificarea utilizată. Din mesajul sunt separate unul de altul în numele frontierei, precum și numele frontierei în corpul mesajului începe întotdeauna cu caracterele -. ca ultima frontiera se termină suplimentar cu -.
Pentru a face mai clar despre ce este vorba, uita-te la următoarea bucată de MIME:
Content-Type: multipart / mixt; limita = "moia granica"
--moia granica
Content-Type: text plan
Buna ziua! Este proba limita mea!
--moia granica
Content-Type: text / plan de
Și aceasta este următoarea parte a mesajului!
După cum puteți vedea, acest mesaj are un tip de conținut de subtip amestecat multipart. aici este dat numele de frontieră - moia granica. Un mesaj este format din două părți, fiecare parte este planul de tip subtip de text. Prima parte a mesajului conține textul: «Bună ziua! Este proba limita mea », iar a doua parte a mesajului conține textul:«! Și aceasta este următoarea parte a mesajului». Peste un mesaj text din partea unei acțiuni va fi, acest lucru se face de obicei, în cazul în care orice atașament () sunt prezente etichetare în mesaj.
Subtipului alternativ subtip identic mixt. Cu toate acestea, fiecare parte a mesajului este un mesaj optimizat de caracteristici ale clientului de e-mail. De exemplu, mesajul poate consta din mai multe părți, o parte va conține text conținut de text / plan. altele - text hipertext / html. În acest caz, în cazul în care nu există un program client de e-mail pentru a sprijini HTML, apoi afișează prima parte a mesajului (text / planul), în caz contrar - al doilea (text / html).
Subtipului subtip identic paralel amestecat și este proiectat în principal pentru a afișa în același timp toate părțile mesajului.
Acestea sunt principalele subtipuri de multipart. numărul lor, după cum am spus mai devreme, poate crește.
Tipul de mesaj este utilizat în principal în cazurile în care un mesaj nu poate fi transferat în totalitate. Subtipurile primare ale acestui tip sunt: parțial - indică faptul că mesajul este împărțit în părți, în care, în câmpul Content-Type indică numărul de piese de parametri (total), numărul (număr) și un identificator (id); extern-corp - vă permite să facă referire la surse externe.
De asemenea, trebuie remarcat faptul că câmpul Content-Type poate cuprinde parametrul charset. care conține informații despre codificarea utilizată, aceasta poate fi un ferestre-1251, kio8-r, etc. Dacă mesajul conține atașamente, Content-Type poate avea, de asemenea, numele opțiunii. care conține numele fișierului atașament, de exemplu:
Content-Type: application / x-zip comprimat; name = "MyFile.zip"
După cum probabil ați observat, toți parametrii sunt separate prin punct și virgulă (;), în același timp, fiecare parametru poate fi scris pe o linie separată, precum și valorile parametrilor pot fi citate, cu toate că acest lucru nu este necesar. Acest lucru poate cauza unele probleme atunci când scrieți MIME-Reader (MIME Reader), dar cu toate acestea, această caracteristică trebuie să ia în considerare.
Posturi tip de codificare (Content-Type-Encoding)
Câmp Content-Type-codificării conține informații referitoare la tipul de codificare a mesajului. Există 6 tipuri de bază de codare: Base64. Quoted-tipărit. 7bit. 8bit. Binar. X-Token. Tipuri de 7bit de codificare. Binare 8Bit și necesită nici o conversie, deoarece datele sunt transferate în octeți.
codare de tip Base64 - sistem numeric pozițional cu bază 64, în cazul în care 64 - cea mai mare putere a doua, care este reprezentat folosind ASCII caractere. Base64 Codificarea utilizează caractere A-Z, a-z și 0-9, sunt de asemenea folosite în simboluri MIME "+", "/" și "=".
Tipul de codare text tipăribil reprezintă ordinea caracterelor din hexazecimal, ASCII codificat numai simbolurile de cod care depășește 122, iar celelalte simboluri sunt așa cum este. Înainte de a simbolurilor codificate pune semnul „=“.
Tipul de codare X-Token permite utilizatorului să definească regulile de codificare.
Câmpul Subiect conține subiectul mesajului.
Subiect: Subiectul mesajului
De la: [numele expeditorului <]email@отправителя.ru[> (Company)]
Pentru numele companiei poate utiliza, de asemenea, un câmp de organizație separată.
Pentru: [email protected]
De la: Nemiro Aleksey
CC: Utilizator
Organizație: www.Kbyte.Ru
De asemenea, trebuie menționat câmpul primite. care conține informații despre calea mesajului. câmpuri primite pot fi câteva, numărul acestora depinde de numărul de servere prin care mesajul către destinația finală, fiecare server lasă informații despre sine în acest domeniu.
Un alt domeniu interesant - X-Mailer. care conține numele unui client de e-mail, prin care a fost trimis mesajul.
Data trimiterii de mesaje pot fi găsite în câmpul Dată.
câmp X-prioritate conține o notă despre prioritatea scrisorii, de regulă, este o valoare numerică, sau o combinație de valori numerice și alfanumerice. Scrisoarea poate avea următoarele priorități:
2 (High) - Prioritate ridicată
3 (Normal) - Prioritate normală
4 (Low) - prioritate redusă
În prezența atașări (attachey) în câmpul mesajului poate fi de asemenea prezent Content-Disposition. care conține o descriere a investițiilor (incintei), în special numele fișierului, de exemplu:
Content-Disposition: atașament; filename = "MyFile.rar"
Numărul de câmpuri MIME pot fi, de asemenea, a crescut, în cazul în care am vorbit despre principalele domenii, care de multe ori pot fi găsite în rapoartele.
Vă rugăm să rețineți că toate câmpurile pot fi, de asemenea criptate tipuri, criptare este utilizat în mod tipic de codare Base64 și quoted-tipărit. precum și pot fi specificate codificare de text, de exemplu: ferestre-1251. kio8-r. utf-8, etc. În cazul în care valoarea câmpului este criptat, este scris în următorul format:
=? pagina de cod. tip de codare. Valoarea câmpului =
Pagina de cod - este, de fapt, nu există ferestre-1251. kio8-r. utf-8, etc.
Codificare Type - reprezinta primul nume simbol tipul de codificare, acesta poate fi fie B - Base64. sau Q - Cotate-Printable.
Valoarea câmpului - această codificare specificată valoare de câmp de tip codificate.
Trebuie remarcat faptul că numai caracterele românești sunt convertite în text tipăribil, și anume coduri de caractere mai mult de 122, caracterele rămase sunt scrise așa cum este, cu partea din față a fiecărui simbol codificat este pus semnul „=“. Și tot textul este codificat în Base64.
citește MIME
Și astfel, pentru început să încerce să scrie funcția de descifrare a textului de la Base64 și quoted-tipărit. Să începem cu un simplu și scrie funcția de decriptare quoted-tipărit. Așa cum am spus, quoted-tipărit convertește unele caractere în codul hexazecimal și în fața fiecărui simbol transformat pune semnul „=“ în acest lucru și se va baza:
Funcția privată QPDecode (ByVal sText ca șir) Ca String
Dacă sText.Length <= 0 Then Return ""
sResult Dim Ca String = ""
Dim chrCurrentChar CHAR
Dim intTextLength Ca Integer = sText.Length
Dim i Ca Integer = 1
Face în timp ce eu <= intTextLength
„Ia simbolul
chrCurrentChar = Convert.ToChar (Mid (sText, i, 1))
„Dacă începe cu =, acest cod hex
Dacă chrCurrentChar = "=" Atunci
încerca
„Luând următoarele două personaje
„Și încearcă să se convertească la un număr zecimal,
„Urmat de un simbol
sResult + = Cro (CINT ( "H0" Mid (sText, i + 1, 1) _
Mid (sText, i + 2, 1)))
i + = 3
Prinde ex Ca excepție
„Este un personaj obișnuit, lăsați-o așa
sResult + = chrCurrentChar
i + = 1
end Încercați
altfel
„Este un personaj obișnuit, lăsați-o așa
sResult + = chrCurrentChar
i + = 1
End If
buclă
„Returnează textul decriptat
Întoarcere sResult
end Function
După cum puteți vedea, nimic complicat în asta, pur și simplu, această funcție convertește text tipăribil text la normal. Să ne întoarcem la Base64. Textul codificat în Base64. Se compune dintr-o serie de caractere mari și mici ale alfabetului englez, numere, iar caracterul „+“, „/“ și „=“. Pentru a decripta Base64 poate utiliza următoarea funcție:
Funcția privată Base64Decode (ByVal sText ca șir) Ca String
sResult Dim Ca String = ""
Dim i ca integer
Pentru i = 1 Pentru sText.Length
Dacă nu Instr (1, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + / =", Mid (sText, i, 1)) = 0 Atunci
sResult + = Mid (sText, i, 1)
End If
Următoarea I
Dacă (sResult.Length Mod 4) <> 0 Atunci
sResult + = StrDup (4 - (sResult.Length Mod 4), "=")
End If
Codificare Dim Ca System.Text.Encoding = System.Text.Encoding.GetEncoding (1251)
încerca
„Conversia un caracter matrice de 8-biți
sResult = encoding.GetString (Convert.FromBase64String (sResult))
Prinde ex Ca excepție
„eroare
end Încercați
Întoarcere sResult
end Function
Această funcție este destinată în principal pentru decodificarea datelor de text pentru a obține un binar (binar) de ieșire de date prin System.Text.Encoding.GetBytes sări peste funcția suficient obținută. sau retur Convert.FromBase64String (sResult).
Pentru valori de câmp MIME am folosi expresii regulate:
Funcția privată GetHeaderBySource (ByVal sSource Ca String, ByVal sHeader ca șir) Ca String
Dim myRegex Ca nou Regex ( „((?
myMatchCollection Dim Ca MatchCollection = myRegex.Matches (sSource)
sResult Dim Ca String = ""
Dim iStrt Ca Integer, iLngth Ca Integer
Pentru i Ca Integer = 0 până la (myMatchCollection.Count - 1)
Dacă myMatchCollection (i) .Groups ( "cheie"). Value.Trim.ToLower = sHeader.Trim.ToLower Atunci
sResult + = (myMatchCollection (i) .Groups ( "valoare"). Value.Trim) vbCrLf
„Uite, e ceva după acest grup
Dacă am
iLngth = myMatchCollection (i + 1) ( "cheie") Index .Groups -. iStrt - 1
Dacă iStrt
End If
altfel
„Ajungem la final antetul
iStrt = myMatchCollection (i) .Groups ( "valoare"). Index + myMatchCollection (i) .Groups ( "valoare"). Lungime + 1
iLngth = sSource.Length - iStrt - 1
Dacă iLngth> 0 Atunci
sResult + = Înlocuiți (sSource.Substring (iStrt, iLngth) .Trim, vbCrLf Chr (9), vbCrLf)
End If
End If
End If
următor
Dacă sResult.EndsWith (vbCrLf) Apoi sResult = Mid (sResult, 1, sResult.Length - vbCrLf.Length)
Dacă sResult.StartsWith (vbCrLf) Apoi sResult = Mid (sResult, vbCrLf.Length, sResult.Length - (vbCrLf.Length + 1))
Întoarcere sResult
end Function
Pentru a prelua date de pe teren, este suficient pentru a indica textul MIME și numele câmpului, a căror valoare este necesară pentru a obține, de exemplu:
Acest exemplu va returna valoarea câmpului FROM. De asemenea, trebuie remarcat faptul că datele pot fi criptate, deci ar trebui să determine tipul de codificare și decriptarea datelor. Așa cum am spus, în cazul în care datele sunt criptate, atunci ei vor avea următorul format:
=? pagina de cod. tip de codare. Valoarea câmpului =
Acesta este un format standard, și nu poate fi schimbat, astfel încât pentru a obține informațiile de care aveți nevoie, puteți utiliza cu ușurință o expresie regulată:
Folosind această sintaxă poate fi preparat nume de codare (windows-1251 kio8-r, etc.) - grupa encode. tip de codificare (Q sau B) - tip de grup. precum și setarea - un text de grup. În plus, după datele criptate pot conține, de asemenea, orice alt text - grup othertext. Acum, că aveți aceste date le puteți rula cu ușurință printr-unul din funcția de decriptare scrisă anterior și să se bucure de viață ;-) Nu, prea devreme pentru a sărbători, după decriptare, aveți nevoie pentru a converti textul în pagina de cod dorit, pentru aceasta puteți utiliza System.Text.Encoding. getEncoding.
mesajul în sine, sau a incintei, vine imediat după prima pagină a ziarelor, trebuie să se țină seama de faptul că limitele antetului sunt determinate de prezența la sfârșitul secvenței de cele două personaje CRLF. Cu alte cuvinte, imediat după terminarea antete caracterele pereche CRLF.
Instr (smime, vbCrLf vbCrLf)
Orice altceva - acesta este un mesaj text sau un organism de atașare (carcasă).
Există, de asemenea, un mic exemplu de utilizarea sa în proiecte ASP .NET.
Desigur, pentru a scrie un generic MIME-Reader nu doar pentru câteva ore, dar pentru o utilizare limitată, de exemplu, în proiectele lor, este destul de real.