CompZone.Org :: Artykuły :: PHP
Pytania w drugiej edycji Testu PHP powinny być:
Trudniejsze
Łatwiejsze
Skomplikowane
Na myślenie
Do liczenia
Sonda Wyniki

Add to Google

Pobieranie e-maili przy pomocy IMAP

W tym artykule postaram się przybliżyć Wam obsługę protokołu IMAP w PHP. Czym jest IMAP? Cytat z Wikipedii na pewno dobrze to wyjaśni: "IMAP4 (Internet Message Access Protocol) to internetowy protokół pocztowy zaprojektowany jako następca POP3.

W przeciwieństwie do POP3, który umożliwia jedynie pobieranie i kasowanie poczty, IMAP pozwala na zarządzanie wieloma folderami pocztowymi oraz pobieranie i operowanie na listach znajdujących się na zdalnym serwerze". Jak widać mamy do czynienia z potężnym i nowoczesnym narzędziem. Wbrew nazwie, IMAP w PHP potrafi korzystać również z innych protokołów pocztowych - POP3 i NNTP. To daje nam duże pole manewru, gdyż POP3 jest wciąż najszerzej stosowany.

Instalacja IMAP

Instalacja IMAP w systemie Windows jest niezwykle prosta. Sprowadza się jedynie do ustawienia w pliku php.ini wpisu "extension=php_imap.dll". Po wykonaniu tej czynności należy zrestartować serwer. Odtąd funkcje opisywane w dalszej części artykułu powinny być już dostępne.

Budujemy prostego klienta poczty

Pora na przedstawienie zastosowania IMAP w praktyce. Napiszemy skrypt, który będzie łączył się z serwerm poczty i wyświetlał nam wiadomości z naszej skrzynki.

Oto kod pliku index.php

 <?php
if (!$PHP_AUTH_USER){
Header("WWW-authenticate: basic realm="Sprawdzanie poczty"");
Header("HTTP/1.0 401 Unauthorized");
}
else{
Header("Location: lista.php");
}
?>

Nie ma tutaj jeszcze nieczego ciekawego. Jest to tylko okno autoryzacji, w którym będziemy podawać login i hasło uzywane przy połączeniu z serwerem poczty.

Teraz kod pliku lista.php

 <?php
$link=imap_open("{poczta.o2.pl:110/pop3}INBOX", $PHP_AUTH_USER, $PHP_AUTH_PW);
echo imap_last_error();
$headers=imap_headers($link);
for($x=1; $x < count($headers); $x++) {
$idx=($x-1);
echo "<a href="wiadomosc.php?num=$x">$headers[$idx]</a><br>";
}
?>

Tutaj mamy już do czynienia z nieznaną funkcją imap_open. Jest ona odpowiedzialna za otwarcie połączenia z serwerem. Jako pierwszy parametr przyjmuje ona adres serwera. Ma on dość nietypową składnię.

Wygląda to tak:

{adres.serwera.pl:port/dodatkowe_parametry}folder

W moim przykładzie użyłem adresu serwera POP3 o2.pl. Domyślnym portem tego protokołu jest 110. Jako dodatkowy paramter dodałem pop3, aby poinformować IMAP, przez jaki protokół chcę się połączyć. Inne dodatkowe parametry, takiej jak bezpieczne połączenie SSL znajdziemy w manualu w opisie funkcji imap_open. Jako folder podałem INBOX i dzięki temu będą mi się wyświetlały tylko nieprzeczytane wiadomości ze skrzynki odbiorczej. Dwa kolejne argumenty to przesłane wcześniej dane - login i hasło.

Funkcja imap_last_error wyświetla ostatni błąd, jaki zwrócił IMAP. Może się przydać, jeżeli będziemy mieli kłopoty z połączeniem.

Następnie, dzięki funkcji imap_headers, otrzymujemy tablicę z naszymi wiadomościami. W pętli wyśwetlamy linki, które będą prowadziły do kolejnego skryptu, a dokładnie wiadmomosc.php:

 <?php
$link=imap_open("{poczta.o2.pl:110/pop3}INBOX", $PHP_AUTH_USER, $PHP_AUTH_PW);
$header=imap_header($link,$_GET['num']);
echo "Od: $header->fromadress<br>";
echo "Do: $header->toaddress<br>";
echo "Data: $header->Date<br>";
echo "Temat: $header->Subject<br><br>";
echo imap_body($link,$_GET['num']);
?>

Tutaj ponowanie łączymy się z serwerem poczty. Tym razem jednak interesuje nas konkretna wiadmość, więc używami funkcji imap_header i pobieramy jej nagłówek. Wypisujemy z niego informacje o nadawcy, odbiorcy, dacie i tytule. Następnie funkcją imap_body wyświetlamy treść wiadmomości.

I to by było na tyle. Nasz klient potrafi już odbierać pocztę. Można do niego dodać jeszcze np. funkcję wysyłki używając imap_mail. Po więcej zapraszam jednak do odpowiedniego rzdziału w manualu.

Źródło: phpbuilder.com

michalg @ 09-07-2006 19:55

#1

Te skrypty się nie kompilują. Przecież są z błędami. Np. w 1-szym skrypcie w 3-ciej linijce (index.php) jest Header("WWW-authenticate: basic realm="Sprawdzanie poczty""); a powinno być Header('WWW-authenticate: basic realm="Sprawdzanie poczty"'); czyli trzeba zamienić " w '. To samo w drugim skypcie - jest: echo "<a href="wiadomosc.php?num=$x">$headers[$idx]</a><br>"; a powinno być: echo '<a href="wiadomosc.php?num=$x">'.$headers[$idx].'</a><br>'; A poza tym skrypt nie działa. Nie wiem jaki jest sens w publikowaniu skryptów, których nawet autor nie przetestował!

modul @ 06-01-2011 12:52
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!