Wyświetlenie konkretnej wiadomości
tych samych autorów
- Własne RSS [MP]
- Rodzina XSL [MP]
- Wprowadzenie do XML [MP]
- Rozszerzenia XSSI [MP]
- Dynamiczne generowanie grafiki w PHP [MP]
zobacz również
Tworząc stronę wyświetlającą cały list zaczniemy pewnie od wypisania nagłówków, takich jak nadawca, adresat czy tytuł, co w praktyce opisane zostało przed chwilą przy okazji wyświetlania listy wszystkich wiadomości. Przejdźmy więc do treści listu. Przyjmijmy, że identyfikator wiadomości którą chcemy wyświetlić mamy zapisany w zmiennej $msg_id.
nl2br(imap_fetchbody($mbox, $msg_id, "1"));
Funkcja imap_fetchbody() zwraca żądaną część wiadomości. W naszym przypadku będzie to część pierwsza, a więc czysty tekst, który dla poprawnego wyświetlenia musimy jeszcze poddać działaniu funkcji nl2br() zamieniającej nowe linie w tekście na znaczniki <br />.
Można by się to tego sposobu wyświetlania ograniczyć, jednakże nie uwzględnia on wszystkich możliwych wiadomości e-mail, które być może będziemy musieli wyświetlić. Tutaj niestety zaczynają się schody. Jak wszyscy wiemy list elektroniczny może zostać napisany czystym tekstem, co jednak w obecnych czasach coraz częściej ustępuje wersjom tzw. "wzbogaconym" czyli po prostu HTML. Zwłaszcza, że duża część programów domyślnie ustawiona jest na wysyłanie listów w tym formacie, co zresztą typowym użytkownikom zdaje się podobać. Do tego dochodzą wszelkie załączniki.
Wracając jednak do naszego wyświetlania wiadomości, jeżeli chcielibyśmy w systemie obsługi poczty uwzględnić również przypadki innych maili niż czysto tekstowe, będziemy musieli głębiej zainteresować się nie tylko możliwościami funkcji imap_fetchbody() ale również towarzyszącej jej imap_fetchstructure().
Ta nowa funkcja, jak wskazuje jej nazwa, służy analizie struktury wiadomości email. Zwraca bardzo bogato wyposażony obiekt z informacjami, z których najistotniejsze dotyczą rodzaju danych, które zawiera wiadomość oraz kodowania załączników.
Obsługa złożonych wiadomości to temat na zupełnie nowy artykuł, ograniczmy się tutaj więc do podstawowego przykładu.
Wysyłanie poczty
Wysyłaniem poczty zajmuje się funkcja imap_mail(), której parametry przypominają znaną już zapewne mail():
imap_mail('adresat@example.com', 'temat', 'tresc wiadomosci');Trzy powyższe parametry są wymagane, możemy jednak wykorzystać również kolejne opcjonalne, a są to:
- dodatkowe nagłówki, podawane jako String
- adresy cc – "carbon copy", co w polskiej wersji znaczy "do wiadomości"
- adresy bcc – "blind karbon copy", po polsku "ukryte do wiadomości"
- ścieżka zwrotna, czyli adres pod jaki domyślnie ma być wysyłana odpowiedź na list
Możemy więc już wysłać czysto tekstowego maila. Rozszerzenie IMAP daje nam jednak znacznie bardziej zaawansowane możliwości. Korzystając z funkcji
imap_mail_compose() możemy dodać do naszego maila zarówno załączniki jak i stworzyć list w formacie HTML.W tym miejscu, aby niepotrzebnie nie wydłużać tekstu zakładam, że masz pewne pojęcie o sposobie, w jaki załączniki przesyłane są razem z listami.
Funkcja imap_mail_compose() wygeneruje nam pełną treść listu razem z nagłówkami i załącznikami na podstawie dwóch parametrów:
| envelope | dosłownie "koperta", spełnia podobną funkcję jak swój papierowy odpowiednik. Jest tablicą zawierającą pola adresowe. |
| body | "ciało" czyli treść wiadomości razem z zakodowanymi załącznikami. |
Przykładowy kod może wyglądać następująco:
// koperta zawiera adres nadawcy listu
$envelope["from"]= "joe@example.com";// pierwsza część mówi o tym że wiadomość zawiera różnego typu dane
$part1["type"] = TYPEMULTIPART;
$part1["subtype"] = "mixed";// druga część to nasz załącznik
$part2["type"] = TYPEAPPLICATION;
$part2["encoding"] = ENCBINARY;
$part2["subtype"] = "octet-stream";
$part2["description"] = $plik;
$part2["contents.data"] = file_get_contents('test.txt');// trzecia część to obrazek tła
$part3["type"] = TYPEIMAGE;
$part3["subtype"] = "jpeg";
$part3["encoding"] = ENCBINARY;
$part3["id"] = "abc";
$part3["description"] = "tlo";
$part3["contents.data"] = file_get_contents('tlo.jpg');// czwarta część zawiera tekst jako HTML
$part4["type"] = TYPETEXT;
$part4["subtype"] = "html";
$part4["description"] = "czesc 3";
$part4["contents.data"] = "<html><body background=CID:abc>test1</body></html>\n\n\n\t";// składamy treść w jedną tablicę
$body[1] = $part1;
$body[2] = $part2;
$body[3] = $part3;
$body[4] = $part4;// generujemy wiadomość
$msg = imap_mail_compose($envelope, $body);// oddzielamy nagłówki od ciała
$msg_head = substr($a, 0, strpos($msg, "\r\n\r\n"));
$msg_body = substr($a, strpos($msg, "\r\n\r\n"));// wysyłamy wiadomość
imap_mail('bob@example.com', 'Temat', $msg_body, $msg_head);
Jest to prosty przykład, który można udoskonalić. Rzecz, na którą warto zwrócić uwagę to, w jaki sposób zostało zapisane w kodzie HTML odwołanie do obrazka, który ma być tłem. Każda część może mieć swój identyfikator (Content-ID). Obrazek (część 3) ma ustawiony identyfikator jako abc i aby się odwołać do tego obrazka w HTMLu użyłem zapisu CID:abc. Aby zobaczyć jak stworzyć bardziej złożoną wiadomość najlepiej utworzyć ją jakimś klientem poczty i podejrzeć źródło.
Po odebraniu wiadomości z powyższego przykładu MS Outlook interpretował obrazek jako załącznik. Ukrycie załącznika wymagałoby znacznie więcej starań i komplikacji, które na dobrą sprawę nie przynoszą żadnego efektu.
Dla funkcji imap_mail_compose() w dokumentacji PHP nie istnieje praktycznie żaden opis, warto jednak przyglądnąć się licznym komentarzom napisanym przez czytelników.
NNTP, POP3
Jak wspomnieliśmy wcześniej, funkcje rozszerzenia IMAP obsługują poza tytułowym protokołem również POP3 oraz NNTP.
POP3 jest powszechnie stosowanym protokołem do odbierania poczty, działającym na porcie 110. Korzystając z niego możemy jedynie odebrać wiadomość i ją skasować. Nie działają żadne flagi, nie można nic wysyłać oraz nie ma on wbudowanej obsługi katalogów.
Połączenie z POP3 nawiązujemy w identyczny sposób jak w przypadku IMAP, zmieniając jednak port i dodając do imap_open() stosowną opcję:
$mbox = imap_open('{mail.example.com:110/pop3}INBOX', 'user', 'pass')Protokół NNTP z kolei służy do obsługi list dyskusyjnych. Połączenie wywołuje się w jego przypadku nieco inaczej.
$nntp = imap_open('{news.example.com:119/nntp}pl.comp.lang.php', "", "")Jak widać zamiast wywołania domyślnej skrzynki INBOX podajemy nazwę grupy dyskusyjnej, nazwą użytkownika i hasło pozostawiamy puste. Teraz pobieramy nagłówki wiadomości:
$overview = imap_fetch_overview($nntp, "1:20", 0);
W tym momencie pobierzemy 20 wiadomości, zaczynając od wiadomości 1. Jeśli łączymy się nie z lokalnym serwerem NNTP to nie polecam pobierania wszystkich nagłówków na raz, ponieważ spowoduje to najprawdopodobniej przekroczenie limitu wykonywania skryptu.
Funkcja imap_fetch_overview() zwraca obiekt, który zawiera wszystkie interesujące nas informacje (m.in. temat – "subject", datę – "date", nadawcę – "from", identyfikator wiadomości – "message_id").
Wyświetlamy teraz listę, którą pobraliśmy przed chwilą:
echo '<table>';while (list($key, $val) = each($overview))
{
$temat = (empty($val->subject)) ? 'brak tematu' : $val->subject;
echo '<tr><td>' . $val->msgno . '</td>
<td>' . $temat . '</a>' . '</td>
<td>' . $val->from . '</td>
<td>' . $val->date . '</td></tr>';
}echo '</table>';
Wyświetlanie zawartości danej wiadomości odbywa się w ten sam sposób jak podczas połączenia z IMAP.
echo nl2br(imap_fetchbody($nntp, $msgid, '1'));
Osoby korzystające z bardziej zaawansowanych programów do obsługi grup dyskusyjnych przywiązane będą zapewne do widoku listy wiadomości w formie drzewa wątków, tzn. kiedy kolejne wiadomości będące odpowiedziami na inne są pod nie wizualnie "podczepiane". Możemy również taki efekt osiągnąć stosując funkcję imap_thread(). Szczegóły jej wykorzystania najlepiej również poznać studiując dokumentację PHP.
Podsumowanie
Artykuł ten miał za zadanie wprowadzić jedynie w bardzo bogaty świat możliwości związanych z rozszerzeniami IMAP. Pełna lista dostępnych funkcji zawiera kilkadziesiąt pozycji, z których spora część przydatna jest głównie przy próbach wyświetlania wiadomości o bardziej skomplikowanej zawartości.
Aby w pełni wykorzystać zarówno możliwości protokołu IMAP jak i jego obsługi w PHP warto zacząć od zapoznania się z odpowiednim dokumentem RFC opisującym omawiany protokół. Być może to właśnie on jest przyszłością poczty elektronicznej.