CATEGORII DOCUMENTE |
E-mail-ul a devenit o sarcina de zi cu zi. Vom vedea cum putem verifica e-mail-ul folosind PHP si cum stocam informatia despre e-mail in baza de date.
Aspecte fundamentale
Pe multe sisteme textul este codat utilizand cod pe 7 biti. Desi un caracter are nevoie de 8 biti, multe sisteme de e-mail se bazeaza pe codare pe 7 biti. Pe langa caracterele ASCII este necesar sa transmitem datele binare. Pentru a transmite datele care nu pot fi codate utilizand caractere pe 7 biti, a fost inventat mecanismul de encoding al datelor. Au fost definite urmatoarele standarde:
- Uuencode - Unix-To-Unix-Encode a fost inventat pentru managementul comunicatiilor cu masinile UNIX. Algoritmul a fost raspandit pe scara larga datorita folosirii pe scara larga a serverelor Unix. Un fisier codat este cu 42% mai mare decat fisierul original;
- MIME - MIME semnifica Multipurpose Internet Mail Extensions. Acest format a fost inventat pentru a transmite fisierele atasate si mesajele structurate care constau in diverse componente. In anumite cazuri codarea Base64 este utilizata in combinatie cu MIME. Definitia exacta se poate gasi in RFC 2045.
- Base64 - Base 64 este o modalitate standard de a transmite fisiere atasate. Dimensiunea unui fisier codat cu Base64 este cu 37% mai mare.
- Quoted Printable - acest algoritm este utilizat in combinatie cu MIME. De obicei este utilizat pentru textul care nu este in engleza. Dimensiunea unui fisier codat este cu 3% mai mare decat a celui care nu este codat.
- BinHex - raspandir mai ales pe Mac. Datele codate sunt compresate, fisierul codat fiind mai mic decat fisierul original.
- HTML - mesajele e-mail HTML au devenit populare odata cu aparitia tehnologiilor Web moderne. Este un format standard care poate fi citit pe toate platformele.
- Binary - datele binare sunt transmise in mod direct
Alte metode sunt BTOA, BOO sau ROT-13.
Protocoalele implicate in lucrul cu e-mail-ul sunt:
SMTP- protocolul este utilizat pentru comunicatia cu diferite servere de mail. Definitia protocolului se gaseste in RFC 821.
POP3- in contrast cu SMTP, protocolul POP3 este utilizat pentru extragerea mesajelor de pe server.
IMAP- IMAP este protocolul utilizat pentru extragerea mesajelor de pe server. Prin contrast cu POP3, mesajele raman pe server.
Trimiterea mesajelor cu PHP este usoara.Ex:
<html>
<title>Mesaj e-mail </title>
<body bgcolor='#EEEEEE'>
<b>Mail </b><br><br>
<form action='mail.php' method='post'>
<table>
<tr>
<td>Mail catre: </td>
<td><input type='text' name='email' value=''></td>
</tr><tr>
<td>Subiect: </td>
<td><input type='text' name='subject' value=''></td>
</tr><tr>
<td>Continut: </td>
<td><textarea cols='50' rows='10' name='content'>
</textarea></td>
</tr>
</table>
<br>
<td><input type='submit' name='submit' value='Trimite mesajul'></td>
</form>
</body>
</html>
Va fi afisat un formular pentru trimiterea mesajelor. Vom specifica adresa persoanei catre care dorim sa trimitem mesajul. In plus, putem insera subiectul si continutul mesajului de e-mail.
Printr-un clic pe buton vom porni un script numit mail.php. Acest program afiseaza un cod HTML si trimite mesaj utilizatorului dorit.
<html>
<title>Mail </title>
<body bgcolor='#EEEEEE'>
<b>Mail </b><br><br>
<?php
if (mail('$email', '$subject', '$content'))
else
?>
In cazul unor destinatari multipli, adresele trebuie separate prin virgula.
IMAP si POP3 sunt doua din cele mai importante protocoale pentru accesarea datelor stocate pe serverul de e-mail. Prin contrast cu POP3, serverele IMAP stocheaza mesajele pe server si datele sunt extrase cand un mesaj este solicitat. Doarece datele nu sunt stocate pe masina utilizatorului, proprietarul mailbox-ului este mult mai flexibil. Dezavantajul IMAP-ului este ca necesita mai mult timp pentru a extrage mesajul deoarece datele sunt transmise catre client de fiecare data cand mailbox-ul este deschis. Ne vom focaliza pe IMAP.
Extragerea datelor
Vom crea adresa de e-mail phpdb@localhost pe masina locala. Sistemul ruleaza sendmail in combinatie cu demonul IMAP. Un mesaj a fost trimis la aceasta adresa. Sa vedem un script care care afiseaza informatii din casuta postala.
<?php
echo '<b>Afisez informatii despre phpdb@localhost</b><br><br>';
$mbox = imap_open('INBOX','phpdb', 'test123')
or die('nu ma pot conecta la serverul IMAP: '.imap_last_error());
$testconn = imap_mailboxmsginfo($mbox);
if ($testconn)
else
imap_close($mbox);
?>
La inceputul scriptului este afisat un antet si este deschisa conexiunea la serverul de mesaje. In acest scenariu adresa de IP a serverului de mesaje este 194.176.165.12, parola test123.
Afisez informatii despre phpbdb@localhost
Date: Sat, 9 Feb 2002 15:30:10 +0100 (CET)
Deleted: 0
Driver: imap
Mailbox: INBOX
Messages: 1
Recent: 0
Size: 1515
Unread: 1
Dimensiunea mesajului este 1515 bytes. Exista un mesaj in INBOX.
Pentru a extrage continutul unui mesaj vor fi utilizate doua fisiere. Fisierul numit mailserver.php va contine librariile pentru interactiunea cu serverul IMAP. Fisierul fetchmail.php va apela libraria IMAP. Fisierul mailserver.php :
<?php
# librarie pentru interactiunea cu serverul IMAP
class mailserver
INBOX',
$this->user, $this->passwd)
or die('cannot connect to IMAP server: '.
imap_last_error());
return $mbox;
}
function summary()
}
}
?>
Dupa definirea unor variabile, a fost implementat un constructor. Acesta stabileste conexiunea la serverul de mesaje si afiseaza o eroare daca nu este returnata un manipulator de conexiune valid. Functia summary extrage headerul din mailbox si numara antelele returnate. O bucla este procesata si parcurge toate antetele. Corpul acestor mesaje este extras si afisat pe ecran.
Fisierul fetchmail.php este bazat pe libraria anterioara:
<?php
include('mailserver.php');
$mail = new mailserver();
$mail->summary();
imap_close($mail->mbox);
?>
Libraria este inclusa si o noua instanta a obiectului de pe serverul de mesaje este generata. Sumarul este afisat si conexiunea la serverul de mesaje este inchisa.
Dupa cum putem vedea continutul mesajului este confuz. Contine cod HTML codat.
Uneori este necesar sa ne uitam mai atent la antetul mesajului. Acest lucru este important pentru a vedea de unde anume vine mesajul si care este adesa de e-mail pe care vom da reply. Urmatorul excemplu afiseaza o noua versiune a functiei summary care afiseaza parti importante ale antetului :
function summary()
}
Dupa cum putem observa PHP ofera functii pentru procesarea antetului unui e-mail. Functia returneaza un sir care poate fi procesat direct.
Linia "Mail comes from" nu este utila deoarece contine numele persoanei care a trimis mesajul. Sa vedem urmatoarea versiune de summary:
function summary()
}
Unele metode pe care le-am vazut in versiunea anterioara pot fi utilizate pentru a returna array-uri sau obiecte. In cazul lui "from" este util deoarece pot fi extrase mai multe detalii despre cele care trimite mesaje. In cazul lui from este util deoarece aflam mai multe informatii despre cel care trimite mesaje. Functia displayarray a fost folosita afiseaza continutul unui array si a fost definita in afara obiectului. Codul functiei este :
function displayarray($data, $text)
echo '<br>';
}
Cheile si valorile apartinand cheilor sunt afisate. Cand executam fetchmail.php sunt afisate mai multe informatii:
Numarul mesajelor de pe server: 1
To:
mailbox => phpdb
host => b2-12.feaa.uaic.ro
From:
personal => John Doe
mailbox => john
host => b2-12.feaa.uaic.ro
Cc:
Bcc:
Reply to:
personal => John Doe
mailbox => john
host => b2-12.feaa.uaic.ro
Sender:
mailbox => john
host => mail.uaic.ro
Return path:
In lista se poate observa numele masinii gazda b2-12.feaa.uaic.ro. Mesajul a fost trimis de la mail.uaic.ro.
Am vazut cum se extrag mesajele si informatiile despre aceste mesaje de pe serverul de mesaje. Vom vedea cum se proceseaza mesajele care constau din mai multe componente.
In exemplul urmator vom trimite un mesaj care contine o imagine catre phpdb@localhost. Vom vedea din ce cosntau partile mesajelor de e-mail. Informatii privitoare la aceste parti vor fi afisate.
Versiunea aditionala a lui summary :
function summary()
echo '<br>';
}
}
}
Functia imap_fetchstructure returneaza un obiect care contine structura e-mail. $data contine un array cu toate componentele. Array-ul este procesat si diferite parti si campuri sunt afisate.
Cu ajutorul acestei functii, este posibil sa extragem informatii despre un e-mail sau un set de mesaje de e-mail. Sa vedem ce tipuri de date afiseaza scriptul.
Numarul de mesaje de pe server: 2
message number: 1
ifsubtype => 1
subtype => PLAIN
ifdescription => 0
ifid => 0
lines => 12
bytes => 218
ifdisposition => 0
ifdparameters => 0
ifparameters => 1
parameters => Array
ifsubtype => 1
subtype => HTML
ifdescription => 0
ifid => 0
lines => 11
bytes => 388
ifdisposition => 0
ifdparameters => 0
ifparameters => 1
parameters => Array
message number: 2
ifsubtype => 1
subtype => PLAIN
ifdescription => 0
ifid => 0
lines => 4
bytes => 52
ifdisposition => 0
ifdparameters => 0
ifparameters => 1
parameters => Array
type => 5
encoding => 3
ifsubtype => 1
subtype => JPEG
ifdescription => 0
ifid => 0
bytes => 201382
ifdisposition => 1
disposition => INLINE
ifdparameters => 1
dparameters => Array
ifparameters => 1
parameters => Array
Sunt doua mesaje pe server. Primul mesaj consta in doua componente. Prima componenta este PLAIN, deci este o componenta text. A doua componenta consta in cod HTML. Informatii privitoare la lungimea sau numarul liniilor de mesaje pot fi gasite in rezultat aceasta informatie putand fi extrasa si utilizata de aplicatie. Al doilea mesaj are un subtip numit JPEG. Codarea trebuie sa fie 3. Tipul mesajului este 5. Aceasta ne spune ca partea mesajului este un fisier atasat.
Urmatoarea functie arata calea de descarca un fisier atasat :
function summary()
elseif ($part->disposition == 'ATTACHMENT')
}
}
}
Cea mai importantǎ parte a codului incepe dupǎ generarea lui $struct. Toate componentele structurii sunt procesate una dupǎ alta. $pnumber este utilizatǎ pentru a numǎra pǎrtile mesajului care va fi procesat. Aceasta este destul de important deoarece aceastǎ informatie va fi necesarǎ pentru a extrage partea corectǎ a corpului mesajului. Dacǎ $part>disposition contine INLINE a fost gǎsit un fisier atasat. In prezent majoritatea fisierelor atasate sunt trimise inline. Aceasta este o metodǎ convenabilǎ de a coda mesaje de e-mail. Dacǎ $part>disposition este un ATTACHMENT, va fi gǎsit un fisier atasat. Sǎ detaliem mesajele INLINE. Dupǎ calcularea dimensiunii fisierului atasat, este extras numele fisierului. Acest lucru este important deoarece avem nevoie de acest nume de fisier pentru a scrie fisierul pe disc. In urmǎtorul pas este extras corpul mesajului. Este important sǎ extragem corpul corect al mesajului altfel o piesǎ gresitǎ de date va fi tratatǎ ca fisier atasat. Dupǎ ce datele sunt citite, sirul este decodat. Deoarece atasul INLINE este codat Base64, imap_base64 poate fi utilizat pentru a regenera piesa originalǎ de date. Dupǎ extragere si decodare, datele sunt scrise pe disc. Aceasta se realizeazǎ cu ajutorul lui fopn, fputs si fclose.
Dupǎ ce scriptul este executat, sunt afisate pe ecran cateva linii:
Numarul de mesaje de pe server: 2
message number: 1
message number: 2
size: 201382
filename: nura.jpg
Pentru a verifica dacǎ fisierul a fost scris pe disc, vom utiliza ls:
[root@ mail]# ls -l /tmp/nura.jpg
-rw-r--r-- 1 apache apache 146953 Feb 14 18:28 /tmp/nura.jpg
Dimensiunea fisierul de pe disc este de 140KB. Dimensiunea fisierului este mult mai mare (cam 200KB). Fisierul codat este cu 42% mai mare decat fisierul original.
In aceastǎ sectiune vom vedea cum extragem informatii privind starea unui server IMAP. PHP oferǎ o comandǎ numitǎ imap_status. Aceasta solicitǎ serverului informatii de bazǎ. Ex:
<?php
$server = '194.176.165.12';
$user = 'phpdb';
$passwd = 'test123';
$mbox = @imap_open('INBOX', $user, $passwd)
or die('cannot connect to IMAP server: '.
imap_last_error());
$status = imap_status ($mbox, 'INBOX', SA_ALL);
if ($status)
else
?>
Dupǎ ce informatiile au fost extrase de pe server, ele sunt afisate pe ecran utilizand un tabel.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1425
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved