Descriere:Expedierea mesajelor de posta electronica
Download:Nu necesita
Autor:Anonim
Sursa (Link-ul oficial): Propria parere:Util.
Tutorialul:
În articolul Transmiterea mesajelor prin e-mail folosind PHP şi PEAR am mai discutat depre funcţia mail() şi cum se transmite un mesaj cu ajutorul acestei funcţii. În acest articol o să încerc să aprofundez mai detaliat expedierea şi recepţionarea mesajelor de e-mail.
Configuraţia PHP standard acceptă expedierea mesajelor de e-mail prin intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta este protocolul standard folosit pentru transferul mesajelor de e-mail de la un sistem la altul prin internet. Mesajele de e-mail sunt alcătuite din două părţi: o serie de antete de mesaj şi un corp. Antetele de mesaj indică adresa destinatarului şi subiectul mesajului, precum şi alte informaţii. Corpul conţine mesajul în sine. Un exemplu de trimitere a unui mesaj prin intermediul funcţiei mail:
mail (destinatar, subiect, corp, antete)
unde destinatar indică adresa de e-mail a destinatarului, subiect specifică antetul de e-mail care conţine subiectul mesajului, corp este corpul mesajului şi antete specifică adresele de e-mail suplimentare, precum antetul from sau alte antete...
Exemplu:
mail ("adresa_mea@server.ro", "Mesaj de test", "Corpul mesajului", "From: adresa_mea@server.ro");
Puteţi specifica mai mulţi destinatari prin separarea fiecărui destinatar de următorul prin intermediul unei virgule:
mail ("adresa1@server1.ro, adresa2@server2.ro, adresa3@server3.ro", "Mesaj de test", "Corpul mesajului", "From: adresa_mea@server.ro");
Funcţia mail() returnează TRUE dacă serverul SMTP acceptă mesajul; în caz contrar, returnează FALSE. Reţineţi că acceptarea de către serverul SMTP nu garantează transmiterea către destinatar a mesajului dvs. Nu există nici o modalitate 100% sigură de a verifica faptul că mesajul a fost trimis, aşa cum nu există nici o modalitate absolut sigură de a garanta că destinatarul a citit mesajul, l-a înţeles şi că a fost de acord cu el.
Unele servere SMTP refuză să accepte adrese şi antete care conţin spaţii albe la sfârşit. Pentru aceasta folosiţi funcţia trim() înainte de a trimite mesajul.
Recepţionarea mesajelor de e-mail
Recepţionarea mesajelor de e-mail este un proces oarecum mai complex decât expedierea lor. Deşi SMTP face parte din configuraţia PHP standard, IMAP (protocolul de recepţionare a mesajelor Interim Mail Access Protocol) nu este o componentă a acestei configuraţii. Dacă administratorul serverului nu a configurat serverul PHP astfel încât să lucreze cu IMAP, exemplele următoare nu vor funcţiona.
Un server IMAP este accesibil în acelaşi mod ca şi un fişier oarecare. Mai întâi, trebuie deschisă o conexiune cu serverul, apoi se pot trimite cereri serverului şi se pot primi răspunsuri de la acesta. După terminarea utilizării serverului, trebuie închisă conexiunea. Pentru a deschide o conexiune cu un server IMAP, folosiţi funcţia imap_open():
imap_open (cutie_postala, identificator_utilizator, parola)
Argumentul cutie_postala specifică patru elemente:
- Numele gazdei sau adresa IP a serverului IMAP
- Protocolul care va fi utilizat (IMAP)
- Portul care se va folosi pentru conectarea serverului (în general 143)
- Cutia poştală care va fi deschisă (în general INBOX)
Argumentul foloseste numeroşi delimitatori pentru a separa un element de altul. Iată o valoare caracteristică a argumentului:
{localhost/imap:143}INBOX
în cadrul acestui exemplu, numele gazdei este localhost; acest lucru este posibil când un server PHP şi un server IMAP rulează pe acelaşi sistem gazdă. În caz contrar, trebuie să specificaţi numele gazdei care rulează sistemul IMAP:
Celelalte argumente ale funcţiei imap_open(), identificator_utilizator şi parola, specifică identificatorul de utilizator şi parola folosite pentru a obţine accesul la serverul IMAP. Aşa cum funcţia fopen() returnează un identificator pe care îl puteţi folosi pentru a obţine accesul la un fişier, la fel şi funcţia imap_open() returnează un identificator pe care îl puteţi folosi pentru a obţine accesul la serverul IMAP. Dacă PHP nu poate deschide o conexiune cu serverul IMAP, funcţia imap_open() returnează FALSE.
Dacă un script se încheie cu mesajul "Call to undefined function: imap_open", aceasta arată că PHP nu a fost configurat pentru a folosi IMAP.
Exemplu:
Cod:
Cod: Selectaţi tot
$server = "{mail.as.ro/imap:143}";
$utilizator = "php4";
$parola = "parola";
$identificator = imap_open($server."INBOX", $utilizator, $parola);
if ($identificator === false) {
echo "Nu se poate deschide cutia poatala";
}
?>
Cod:
Cod: Selectaţi tot
$server = "{mail.as.ro/imap:143}";
$utilizator = "php4";
$parola = "parola";
$identificator = imap_open($server."INBOX", $utilizator, $parola);
if ($identificator === false) {
echo "Nu se poate deschide cutia poatala";
}
else {
// se schimba directorul curent
$prefix = "~/mail/";
$director = $server.$prefix."INBOX"."nume_director";
$schimba = imap_reopen($identificator, $director);
if ($schimba === false) {
echo "Nu se poate deschide directorul specificat";
}
}
?>
Dacă doriţi să afişati directoarele existente în căsuţa de mail puteţi folosi următorul script:
Cod:
Cod: Selectaţi tot
echo "Lista directoarelor";
$directoare = imap_listmailbox($identificator, $server, $prefix, "*");
if ($directoare == false) {
echo "A aparut o eroare la afisarea directoarelor";
}
else {
foreach ($directoare as $cheie=>$valoare) {
echo "\n $cheie=>$valoare";
}
}
?>
Cod:
Cod: Selectaţi tot
$director = "diverse";
$director = $server.$prefix."INBOX.".$director;
$creare = imap_createmailbox($identificator, $director);
if ($creare === false) {
echo "Nu s-a putut crea directorul";
}
?>
Pentru modificarea numelui unui director din căsuţa de email folosiţi funcţia imap_renamemailbox() astfel:
Cod:
Cod: Selectaţi tot
$director_vechi = $server.$prefix."INBOX.".$director_vechi;
$director_nou = $server.$prefix."INBOX.".$director_nou;
$modificare = imap_renamemailbox($identificator, $dosar_vechi, $dosar_nou);
if ($modificare === false) {
echo "A aparut o eroare la modificarea numelui directorului";
}
?>
Cod:
Cod: Selectaţi tot
$director = $server.$prefix."INBOX.".$director;
$stergere = imap_deletemailbox($identificator, $director);
if ($stergere === false) {
echo "A aparut o eroare la stergerea directorului";
}
?>
După deschiderea unei conexiuni IMAP, puteţi obţine acces la informaţii care descriu cutia poştală curentă. De exemplu, pentru a afla câte mesaje sunt în cutia poştala se invocă funcţia imap_num_msg():
imap_num_msg($identificator)
În continuare este o variantă prin care puteţi obţine diferite informaţii despre conţinutul cutiei poştale:
Cod:
Cod: Selectaţi tot
$nr_mesaje = imap_num_msg($identificator);
echo "Cutia postala contine $nr_mesaje mesaje";
$nr_mesaje_recente = imap_num_recent($identificator);
echo "Cutia postala contine $nr_mesaje_recente mesaje recente";
$obiect_cutie_postala = imap_mailboxmsginfo($identificator);
if ($obiect_cutie_postala) {
$tablou_cutie_postala =&;nbsp;get_object_vars($obiect_cutie_postala);
foreach ($obiect_cutie_postala as $cheie=>$valoare) {
echo "\n $cheie: $valoare";
}
}
?>
Citat:
Cod:Cutia postala contine x mesaje
Cutia postala contine y mesaje recente
Unread: 0
Deleted: 0
Nmsgs: x
Size: dimensiunea in octeti a mesajelor
Date: data
Driver: imap
Mailbox: numele cutiei postale
Recent: y
Se mai poate utiliza şi varianta următoare:
Cod: Selectaţi tot
echo "Afisarea starii cutiei postale";
$obiect_cutie_postala = imap_mailboxmsginfo($identificator);
print_r($obiect_cutie_postala);
?>
În continuare este un exemplu care afişează o listă de mesaje din directorul curent:
Cod:
Cod: Selectaţi tot
echo "Antete de mesaje in cutia postala curenta:"
$antete = imap_headers($identificator);
if ($antete == false) {
echo "A aparut o eroare la afisarea mesajelor";
}
else {
foreach ($antete as $cheie=>$valoare) {
echo "\n $valoare";
}
}
?>
O chestie ciudată a serviciului IMAP constă în aceea că fiecare mesaj dintr-un director are atât un număr, cât şi un identificator. Numărul reprezintă poziţa mesajului în directorul respectiv; această valoare se poate modifica la adăugarea mesajelor, respectiv la ştergerea mesajelor din dosar. Pe de altă parte, identificatorul unui mesaj nu se modifică niciodată. IMAP furnizează funcţii care vă permit să determinaţi identificatorul unui mesaj dacă este dat numărul său şi invers. Iată funcţiile descrise mai jos:
imap_uid($identificator, $numar)
şi
imap_msgno($identificator, $id)
O limitare a funcţiei imap_headers() este aceea că nu separă fiecare caracteristică a mesajului în câmpuri distincte, astfel încât acestea să fie uşor accesibile pentru un script. Funcţia de bibliotecă IMAP imap_fetch_overview() returnează un tablou asociativ care descrie un mesaj. Iată un exemplu care afişează informaţiile despre mesaje:
Cod:
Cod: Selectaţi tot
$nr_mesaj = 1;
$mesaje = imap_fetch_overview($identificator, $nr_mesaj, 0);
foreach ($mesaje as $mesaj) {
foreach ($mesaj as $proprietate=>$valoare) {
echo "\n $proprietate: $valoare";
}
}
?>
- subiectul mesajului
- numele şi adresa de e-mail ale expeditorului
- data la care a fost trimis mesajul
- numărul mesajului
- identificatorul mesajului
- dimensiunea mesajului în octeţi
- indicatoare care precizează dacă:
= mesajul este recent
= mesajul a fost citit
= mesajul a primit un răspuns
= mesajul a fost marcat în vederea ştergerii
= mesajul este o ciornă
Pentru a obţine corpul unui mesaj (care include conţinutul efectiv al mesajului) putem utiliza scriptul de mai jos:
Cod:
Cod: Selectaţi tot
// afisare dupa numar
$numar = imap_msgno($identificator, $id)
$corp = imap_body($identificator, $numar, FT_UID);
echo $corp;
?>
Cod:
Cod: Selectaţi tot
$n = 0;
$numar = 0;
$obiect_antet = imap_header_info($identificator, $numar);
$antete = get_object_vars($obiect_antet);
foreach ($antete as $proprietate=>$valoare) {
if (!is_array($valoare)) {
echo "\n $proprietate: $valoare";
}
else {
foreach ($valoare as $sub_valoare) {
echo "\n $proprietate: ";
$sub_valori = get_object_vars($sub_valoare);
for_each ($sub_valoare as $articol=>$valoare_articol) {
echo "\n $articol=>$valoare_articol";
}
}
}
}
?>
- data expedierii mesajului
- subiectul mesajului
- identificatorul mesajului la care s-a răspuns prin acest mesaj, dacă există
- indicatoare de mesaj, cum sunt cele returnate de funcţia imap_fetch_overview()
- numele şi adresa de e-mail ale:
= expeditorului
= persoanei care primeşte răspunsul, dacă este specificată
= destinatarilor
= destinatarilor eventualelor copii (cc:)
= destinatarilor eventualelor copii la indigo necunoscute (bcc:), dacă informaţiile respective sunt disponibile
Numeroase elemente ale tabloului asociativ au valori de tip tablou. Pentru parcurgerea iterativă şi afişarea valorii acestor elemente se foloseşte o buclă îmbricată.
Pentru aplicaţii mai puţin pretenţioase se poate utiliza exemplul următor:
Cod:
Cod: Selectaţi tot
$antete = imap_headerinfo($identificator, $numar);
print_r($antete);
?>
Pentru a şterge un mesaj IMAP, mai întâi îl marcaţi în vederea ştergerii şi apoi îl eliminaţi. Mesajele marcate pentru ştergere, dar care nu au fost încă eliminate, sunt numai semnalate ca şterse şi sunt în continuare accesibile. Iată un exemplu care vă permite să ştergeţi un mesaj prin specificarea numărului sau a identificatorului mesajului:
Cod:
Cod: Selectaţi tot
$stergere = imap_delete($identificator, $id, FT_UID);
if ($stergere == false) {
echo "Nu se poate sterge mesajul";
}
?>
Cod:
Cod: Selectaţi tot
$eliminare = imap_expunge($identificator);
if ($eliminare == false) {
echo "Nu s-a reusit eliminarea mesajelor";
}
?>
Cod:
Cod: Selectaţi tot
$erori = imap_errors();
if ($erori) {
foreach ($erori as $cheie=>$valoare) {
echo "\n $cheie: valoare";
}
}
?>
Cod:
Cod: Selectaţi tot
$numar = 0;
$director = $prefix."INBOX.".$director;
echo "Se copiaza mesajul $numar in directorul $director";
$nr_mesaje = "".$numar;
$copiere = <;/span>imap_mail_copy($identificator, $nr_mesaje, $director);
if ($copiere === false) {
echo "A aparut o eroare la copierea mesajului specificat";
}
?>
Când aţi terminat de utilizat un server IMAP, trebuie să îl închideţi, aşa cum închideţi un fişier atunci când aţi terminat cu el. Iată cum se poate închide o conexiune IMAP:
Cod:
Cod: Selectaţi tot
$inchidere = imap_close($identificator);
if ($inchidere === false) {
echo "Nu se poate inchide cutia postala";
}
?>
În cazul în care furnizorul de servicii internet dispune de un server POP, nu de un server IMAP, puteţi avea acces la cutia poştală POP cu ajutorul sistemului PHP, folosind biblioteca IMAP. Pur şi simplu deschideţi o conexiune cu serverul POP specificând o cutie poştala POP astfel:
$mbox = imap_open("{localhost/pop3:110}INBOX", $identificator_utilizator, $parola);
Numele gazdei, protocolul şi numărul portului sunt asemănătoare cu valorile similare folosite pentru conectarea la un server IMAP. De asemenea, puteţi folosi biblioteca IMAP pentru a vă conecta la un server de informaţii folosind NNTP (Network News Transfer Protocol). Pentru aceasta, deschideţi o conexiune astfel:
$nntp = imap_open("{localhost/nntp:119}comp.test", "", "");