Okna.  Wirusy.  Laptopy.  Internet.  Biuro.  Narzędzia.  Kierowcy


E-mail- jest to najważniejsze narzędzie wymiany informacji i jeśli wykorzystujesz je w pracy, prawdopodobnie spotkałeś się z sytuacją: w poczcie przychodzi list zawierający dane niezbędne do przetworzenia przez skrypt. Porozmawiamy o poczcie Yandex - w tym artykule podzielę się z wami, drodzy czytelnicy, moimi doświadczeniami dotyczącymi wyciągania listów ze skrzynki pocztowej, przyjrzymy się również opcji, gdy list zawiera załączony plik - jak go wykryć i ostatecznie pobierz go w celu dalszych manipulacji nim.

Sam stanąłem przed tym problemem dość dawno temu, a potem, mimo że miałem niewielkie doświadczenie w pracy z programami pocztowymi Yandex, spędziłem dużo czasu i nerwów, aby osiągnąć wymagany rezultat. Mój pierwszy błąd polegał na tym, że podobnie jak wielu twórców stron internetowych zacząłem intensywnie szukać podobnych przykładów w Internecie, ale nie skorzystałem z pomocy Yandex. Tak, są tam przydatne informacje, choć jest ich bardzo mało, ale są na tyle ważne, aby napisać tego typu skrypt (więcej na ten temat poniżej). W tamtym czasie konieczne było napisanie skryptu, którego istota była następująca: raz dziennie na pocztę Yandex klienta wysyłano list z cennikiem towarów w formacie xls, należało go przetworzyć (przeanalizować i porównać z dane z bazy sklepu internetowego i w zależności od wyniku coś potem gdzieś zaktualizuję, wyłączę lub włączę).

A pierwszą rzeczą, którą zrobimy przed napisaniem scenariusza, będzie nakreślenie naszego planu działania, który będzie składał się z dziewięciu punktów:

  1. Skonfigurujmy pocztę, aby uzyskać dostęp poprzez protokoły pocztowe;
  2. Narysujmy samą konstrukcję Aplikacje PHP i zdecyduj o kodowaniu pliku;
  3. Zapoznajmy się z protokołem pocztowym IMAP i jego możliwościami;
  4. Połączmy się z pocztą Yandex przy użyciu loginu i hasła do konta i śledźmy błędy na tym etapie;
  5. Przetwórzmy nagłówek listu;
  6. Otrzymamy i przetworzymy treść pisma;
  7. Odbieraj i zapisuj załączone pliki;
  8. Wizualizuj wykonaną pracę;
  9. Wyciągnijmy wnioski.

Temat jest dość obszerny, ale postaram się wszystko przedstawić możliwie zwięźle i przejrzyście. Zacznijmy.

Konfiguracja poczty

Przejdź do swojej poczty i przejdź do ustawień, jak pokazano na zrzucie ekranu poniżej:



Teraz jesteśmy w ustawieniach poczty poprzez Protokoły IMAP i POP3:


Tutaj wielu zobaczy obraz jak na powyższym obrazku, ale spotkałem się więcej niż raz, gdy dostęp jest wyłączony. Dlatego jeśli Twoje ustawienia są inne, zaznacz pola jak na zrzucie ekranu; dla nas najważniejsze jest umożliwienie dostępu przez protokół IMAP.

Struktura aplikacji i jej kodowanie

W tym przykładzie nie będziemy wymyślać złożona struktura aplikacji, ponieważ nie jest ona potrzebna, ale dodamy tylko to, co konieczne (pracuję w edytorze Sublime Text):


  • tmp – folder, do którego pobierzemy załączone pliki z listu, jeśli takie istnieją;
  • .htaccess – konfiguracja strony serwera, jeśli posiadasz serwer Apache;
  • funkcje.php – będziemy tu dodawać nasze funkcje;
  • main.css – plik stylu;
  • indeks.php – punkt wejścia aplikacji;

Użyjemy kodowania UTF-8 i dlatego natychmiast wypełnimy plik .htaccess następującymi liniami:

AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8

Protokół IMAP

Wracając do pierwszego punktu, widać, że z pocztą Yandex można także pracować za pośrednictwem protokołu POP3. Dlaczego więc IMAP? Z tych dwóch IMAP jest nowszy i stanowi alternatywę dla POP3, dlatego ma szereg zalet (można je przestudiować korzystając z Wikipedii), ale w naszym przypadku na wybór wpłynął jedynie fakt, że jest nowszy. Osobiście nie widzę dużej różnicy pod co stosować konkretne zadanie otrzymanie listu. Jeśli z jakiegoś powodu musisz skorzystać z protokołu POP3, wszystkie funkcje dotyczące protokołu IMAP będą dla niego działać.

Łączenie się z pocztą Yandex za pomocą protokołu IMAP

Aby połączyć się z pocztą musimy znać trzy parametry: login poczty, jej hasło i adres serwer pocztowy. Jeśli nie ma problemów z dwoma parametrami, drugi można znaleźć w pomocy Yandex. Pisałem o tym (problem, który mi się pojawił) powyżej i pisałem w Internecie wiele przykładów, w których trzeci parametr jest określony niepoprawnie i wyobraź sobie, że błędy pojawiają się już na etapie połączenia - jest to co najmniej nieprzyjemne . Nie będę owijał w bawełnę i natychmiast podam bezpośredni link do strony Yandex - ustawienie programy pocztowe . Oto dokładnie to, czego potrzebujemy do połączenia:


Teraz możesz przejść bezpośrednio do samego kodu:

Header("Typ zawartości: tekst/html; charset=utf-8"); raportowanie_błędów(0); require_once("funkcje.php"); $mail_login = "yandex_mail"; $mail_password = "hasło_poczty"; $mail_imap = "(imap.yandex.ru:993/imap/ssl)"; // Lista uwzględnianych typów plików $mail_filetypes = array("MSWORD"); $połączenie = imap_open($mail_imap, $mail_login, $mail_hasło); if(!$connection)( echo("Błąd łączenia z pocztą - ".$mail_login); exit; )else( $msg_num = imap_num_msg($połączenie); $mails_data = array(); for($i = 1; $ I<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

Przede wszystkim dodatkowo określamy kodowanie UTF-8 za pomocą nagłówka i wyłączamy wyświetlanie błędów. Podłączamy plik funkcje.php i określamy ustawienia omówione powyżej. W tablicy $mail_filetypes określamy potrzebne nam formaty plików. Zdecydowano się to zrobić, aby pozbyć się niepotrzebnych śmieci i otrzymać określone pliki. Połączenie z pocztą jest nawiązywane za pomocą funkcji imap_open(), która jeśli się powiedzie, zwraca strumień IMAP, a jeśli się nie powiedzie, zwraca wartość false (ale jeśli włączysz wyświetlanie błędów, tak się nie stanie). Kończymy pracę ze strumieniami za pomocą funkcji imap_close() przekazując jej wskaźnik połączenia. Pomiędzy tymi dwiema funkcjami znajduje się zwykła instrukcja warunkowa.

Jeśli połączenie się powiedzie, za pomocą imap_num_msg() sprawdzamy liczbę liter w mailu i dodajemy tablicę, w której umieścimy wszystkie niezbędne dane ze strumienia. Następnie następuje cykl, w którym każda litera będzie przetwarzana oddzielnie według swojego numeru (numeracja zaczyna się od 1).

Przetwarzanie nagłówka listu

Aby uzyskać nagłówek litery należy skorzystać z funkcji imap_header(), której drugim parametrem jest numer litery:

// Nagłówek listu $msg_header = imap_header($connection, $i);

Na tym etapie otrzymamy obiekt, z którego wydobędziemy potrzebne nam dane, zapisując je w tablicy $mails_data. Oto przykład jednego z listów:

Ten zrzut ekranu pokazuje, że wszystkie dane są zduplikowane, ale nie odgrywa to specjalnej roli, wyciągamy to, co jest wygodniejsze. Dużo ważniejsze jest kodowanie tematu listu. To może być wszystko i ten moment musi być kontrolowany. Ta sama sytuacja dotyczy treści pisma i załączonych plików.

$mails_data[$i]["time"] = czas($msg_header->MailDate); $mails_data[$i]["date"] = $msg_header->MailDate; foreach($msg_header->to as $data)( $mails_data[$i]["to"] = $data->skrzynka pocztowa."@".$data->host; ) foreach($msg_header->from as $ dane)( $mails_data[$i]["from"] = $data->skrzynka pocztowa."@".$data->host; )

Zapisujemy w naszej tablicy: znacznik czasu, datę otrzymania listu, adres e-mail odbiorcy i nadawcy i przechodzimy do otrzymania tematu listu. Aby to zrobić musimy najpierw dodać trzy funkcje do plikufunctions.php:

Funkcja check_utf8($charset)( if(strtolower($charset) != "utf-8")( return false; ) return true; ) funkcja konwersji_to_utf8($in_charset, $str)( return iconv(strtolower($in_charset), "utf-8", $str); ) funkcja get_imap_title($str)( $mime = imap_mime_header_decode($str); $title = ""; foreach($mime jako $key => $m)( if(!check_utf8 ($m->zestaw znaków))( $tytuł .= konwersja_na_utf8($m->zestaw znaków, $m->tekst); )else( $tytuł .= $m->tekst; ) ) return $tytuł )

Nazwy są oczywiste i myślę, że warto wyjaśnić tylko ostatnią funkcję. Pobiera zakodowany ciąg znaków i używa funkcji imap_mime_header_decode() do jego dekodowania, w wyniku czego powstaje tablica obiektów, każdy z dwiema właściwościami: charset i tekst. Wtedy wszystko jest proste: sprawdź kodowanie w pętli, przekonwertuj je na UTF-8, połącz temat w jeden nagłówek i zwróć.

Wróćmy teraz do pliku Index.php i wyciągnijmy ostatni parametr:

$mails_data[$i]["title"] = get_imap_title($msg_header->temat);

To kończy przetwarzanie nagłówka wiadomości e-mail.

Praca z treścią listu

Kontynuujemy stopniowo tworzenie naszej tablicy z przetworzonych danych litery i teraz, aby uzyskać ciało, musimy skorzystać z dwóch funkcji:

// Treść wiadomości e-mail $msg_structure = imap_fetchstructure($connection, $i); $msg_body = imap_fetchbody($połączenie, $i, 1);

Pierwsza zmienna $msg_structure zawiera strukturę litery - jest to obiekt, w którym można znaleźć masę przydatne informacje, przykładowy fragment tego obiektu przedstawiono poniżej:

Co jest ważne, aby rozwiązać nasz problem:

  • typ – podstawowy typ treści listu, w zależności od tego, co przychodzi do nas pocztą, może przyjmować wartości od 0 do 7 (każda cyfra oznacza własny rodzaj treści, która znajduje się w treści listu);
  • kodowanie – kodowanie transferu treści, waha się od 0 do 5 (0 - 7BIT, 1 - 8BIT, 2 - BINARY, 3 - BASE64, 4 - QUOTED-PRINTABLE, 5 - INNE);
  • części – tablica części literowych odpowiadająca strukturze obiektu na wyższym poziomie.

Przyjrzyjmy się bliżej właściwościom części. Pierwszą rzeczą, którą należy powiedzieć, jest to, że w komórce zerowej tej tablicy znajdują się informacje odpowiadające dokładnie treści listu i zaczynając od pierwszej - aż do załączonych plików. Ponadto w każdym obiekcie wskazany jest typ, a w parametrach kodowanie jest wskazane jawnie i pośrednio.

Struktura litery może być dowolnie zagnieżdżona, przynajmniej miałem przypadki, gdy osiągnęła cztery lub pięć poziomów, więc aby ją rozbić, jak to mówią, będziemy musieli w przyszłości napisać funkcję rekurencyjną.

Druga funkcja imap_fetchbody() pobiera określoną część wiadomości, najczęściej w postaci zakodowanej.

Dodajmy teraz zmienną, w której zapiszemy przetworzoną wersję treści listu:

$ciało = "";

Wróćmy do pliku funkcje.php i napiszmy funkcję rekurencyjną:

Funkcja recursive_search($struktura)( $kodowanie = ""; if($struktura->podtyp == "HTML" || $struktura->typ == 0)( if($struktura->parametry->atrybut == " zestaw znaków")( $charset = $struktura->parametry->wartość; ) return array("encoding" => $struktura->kodowanie, "charset" => strtolower($charset), "podtyp" => $struktura- >podtyp); )else( if(isset($struktura->części))( return recursive_search($struktura->części); )else( if($struktura->parametry->atrybut == "zestaw znaków")( $ charset = $struktura->parametry->wartość; ) return array("kodowanie" => $struktura->kodowanie, "charset" => strtolower($zestaw znaków), "podtyp" => $struktura->podtyp ) ) )

Funkcja recursive_search() przyjmuje jeden parametr - strukturę litery, gdzie sekwencyjnie sprawdza właściwości i pobiera trzy parametry: kodowanie, zestaw znaków, podtyp. Punktem wyjścia z rekurencji jest brak właściwości parts w komórce zero. Myślę, że z kodu jasno wynika, co się dzieje i jak.

Dodajmy jeszcze jedną funkcję konwertującą treść litery, której będziemy potrzebować później:

Funkcja Structure_encoding($encoding, $msg_body)( switch((int) $encoding)( przypadek 4: $body = imap_qprint($msg_body); przerwa; przypadek 3: $body = imap_base64($msg_body); przerwa; przypadek 2: $body = imap_binary($msg_body); przerwa;

$recursive_data = recursive_search($msg_structure); if($recursive_data["kodowanie"] == 0 || $recursive_data["kodowanie"] == 1)( $body = $msg_body; ) if($recursive_data["kodowanie"] == 4)( $ciało = Structure_encoding($recursive_data["kodowanie"], $msg_body); if($recursive_data["kodowanie"] == 3)( $body = Structure_encoding($recursive_data["kodowanie"], $msg_body); ) if($recursive_data ["kodowanie"] == 2)( $body = Structure_encoding($recursive_data["encoding"], $msg_body); ) if(!check_utf8($recursive_data["charset"]))( $body = konwertuj_to_utf8($ recursive_data ["zestaw znaków"], $msg_body )

Po otrzymaniu danych z rekurencji stopniowo sprawdzamy kodowanie transferu i w zależności od tego wywołujemy funkcjęstructure_encoding() z odpowiednimi parametrami. W ostatnim operatora warunkowego Bierzemy pod uwagę, że pracujemy w UTF-8 i jeśli po wszystkich manipulacjach otrzymamy inne kodowanie, zakodujemy je ponownie.

Pozostaje narysować linię:

$mails_data[$i]["body"] = base64_encode($body);

Treść listu może zawierać zarówno zwykły tekst, jak i znaczniki HTML z własnymi stylami. Kodujemy w BASE64, aby podczas wizualizacji nasz układ nie uległ zmianie.

Załączone pliki

Tutaj stopniowo zbliżamy się do końca pisania naszej aplikacji:

// Załączone pliki if(isset($msg_structure->parts))( for($j = 1, $f = 2; $j< count($msg_structure->strony); $j++, $f++)( if(in_array($msg_structure->parts[$j]->subtype, $mail_filetypes))( $mails_data[$i]["attachs"][$j]["type"] = $msg_structure->części[$j]->podtyp; $mails_data[$i]["attachs"][$j]["size"] = $msg_structure->części[$j]->bajty[; ]["attachs"][$j]["name"] = get_imap_title($msg_structure->parts[$j]->parameters->value); $mails_data[$i]["attachs"][$ j] ["plik"] = Structure_encoding($msg_structure->parts[$j]->encoding, imap_fetchbody($connection, $i, $f)); file_put_contents("tmp/".iconv("utf-8" , " cp1251", $mails_data[$i]["attachs"][$j]["name"]), $mails_data[$i]["attachs"][$j]["file"] ) ) )

Część odpowiedzialna za przetwarzanie załączonego pliku jest znacznie mniejsza, a teraz - dlaczego tak jest. Zasada pracy z plikiem jest podobna do pracy z treścią listu, z tą różnicą, że ten etap rozpoczynamy od posiadania go w tablicy właściwości parts. Nie zapomnij odfiltrować niepotrzebnych, sprawdzając listę typów. Korzystając z prostej funkcji file_put_contents() zapisujemy nasz plik na naszym serwerze w folderze tmp.

Chcę zobaczyć wynik!

W trakcie pracy utworzyliśmy tablicę z danymi $mails_data i do wizualizacji będziemy już z nią pracować bezpośrednio. W tym artykule wykorzystałem list testowy, który był w mojej poczcie, zobaczmy, co ostatecznie otrzymaliśmy:


Tak mniej więcej powinna wyglądać Twoja tablica, niestety musiałem ukryć zawartość pliku z powodów osobistych. Przejdźmy teraz do naszych znaczników HTML:

Poczta Yandex |<?php echo($mail_login);?>

Poczta Yandex (skrzynka odbiorcza) |

Liczba liter:

żadnych liter
$poczta):?>
Znacznik czasu:
Data:
Do kogo:
Z:
Temat:
List w base64:
Załączone pliki:
$załącz):?>
Typ:
Rozmiar (w bajtach):
Nazwa:
Ciało:


Stylów nie będę tutaj dodawać, bo ostatecznie nie odgrywają one specjalnej roli:


A na serwerze w folderze tmp będziesz miał plik.

Wniosek

Po wykonaniu wszystkich kroków z artykułu osiągniesz pożądany rezultat, ale wszystko nie jest tak proste, jak mogłoby się wydawać - istnieją pułapki, które należy wziąć pod uwagę. Pisząc skrypt do konkretnego zadania, należy monitorować kodowanie na wszystkich etapach; litery mogą pochodzić z różnych kont e-mail, z których każde może mieć swoje własne niuanse. Ważne jest również, aby wziąć pod uwagę, że poczta Yandex i jej dokumentacja są okresowo aktualizowane, dlatego mogą pojawić się różne podelementy do pracy z programami pocztowymi. To wszystko dla mnie, mam nadzieję, że ten artykuł okaże się przydatny podczas pracy z wersją poczty Yandex niższego poziomu.

Nie można odebrać wiadomości e-mail z załącznikiem (
jeśli poczta zostanie wysłana z plikiem – dowolnym plikiem – wówczas treść listu zniknie

Proszę o pomoc

To jasne… jeśli przeniesiesz pocztę z Yandex do Yandex, wszystko się ułoży…
jakoś to wymyśliłem
ale nie jest jasne, dlaczego ten skrypt nie akceptuje innych plików poza Wordem... obok niego znajduje się linia MSWORD oddzielona przecinkiem, w której umieszcza się pdf, zhpg i png - tylko Word czyta i zapisuje normalnie.... coś takiego

Jednym z możliwych zastosowań funkcji imap jest utworzenie demona poczty, który będzie zarządzał sposobem, w jaki użytkownicy subskrybują i wypisują się z Twojej listy mailingowej. Aby zrealizować to zadanie, w mailingach zwykle stosuje się dwie metody. Pierwsza zakłada, że ​​użytkownik musi wejść na określoną stronę i potwierdzić swoje działania, druga wymaga wysłania listu. Drugie wymaga również, aby skrypt obsługi był regularnie uruchamiany przez demona cron. Z tego powodu nie jest tak popularna jak pierwsza metoda.

Jednak, jak widać, w przypadku najpoważniejszych wysyłek stosuje się drugą metodę. Jeśli więc masz możliwość użycia crona, użyj go.

Właściwie zrozumienie funkcji nie jest trudne. Pewne trudności mogą pojawić się przy analizowaniu nagłówków listów, które skrypt będzie przetwarzał.

Algorytm samego skryptu nie jest trudny do wymyślenia. Demon nawiązuje połączenie z serwerem pocztowym i sprawdza, czy znajdują się na nim wiadomości. Jeśli nie ma liter, skrypt przestaje działać. Jeśli istnieją litery, analizowane są nagłówki pierwszej litery. Sprawdzane są pola od i temat. Jeśli pole tematu zawiera jedną z dwóch prawidłowych opcji nagłówka (subskrybuj lub anuluj subskrypcję), wówczas rekord pasujący do wartości pola od staje się aktywny (potwierdzony) lub zostaje usunięty z tabeli. W obu przypadkach odpowiednie powiadomienie o działaniach skryptu wysyłane jest na adres podany w polu nadawcy. Następnie list zostaje oznaczony do usunięcia. Jeśli temat nie zawiera prawidłowych tematów, zostanie wysłane powiadomienie o błędzie, a list zostanie również oznaczony do usunięcia. Następnie skrypt przechodzi do następnego e-maila. Po przejrzeniu wszystkich listów opróżnia skrzynkę pocztową.

Do otwarcia skrzynki pocztowej służy funkcja imap_open. Ponieważ PHP obsługuje pracę z kilkoma protokołami, konieczne jest jawne wskazanie, który protokół jest używany do pracy ze skrzynką pocztową. W naszym przypadku jest to pop3 na porcie 110 (standard). Wynik wykonania skryptu przypisujemy do zmiennej $my_box.

$my_box = imap_open("(you.pop.host/pop3:110)", "login", "hasło");

Zobaczysz później, że ta zmienna będzie używana praktycznie we wszystkich funkcjach imap. Następnie sprawdzamy, czy w skrzynce pocztowej nie ma listów. Sprawdzanie odbywa się za pomocą funkcji imap_num_msg.

$n = imap_num_msg($my_box);

W rezultacie zmienna $n będzie zawierać liczbę liter w skrzynce pocztowej. Liczba ta może być większa od zera lub jej równa (jeśli pole jest puste). Jeśli są litery, to w pętli while analizujemy litery, sekwencyjnie zwiększając numer litery o jeden. Należy pamiętać, że pierwsza litera w skrzynce pocztowej będzie miała numer 0, podobnie jak pierwszy element tablicy. Aby zwiększyć liczbę liter, przypisz zmiennej $m wartość 0, a następnie zgodnie z warunkami pętli zwiększ ją o jeden $m++.

Do analizy interesujących nas nagłówków wystarczą dwie funkcje: imap_header oraz imap_fetch_overview. Aby wypełnić każdy z nich, oprócz skrzynki pocztowej, należy podać numer listu. W naszym przypadku wewnątrz pętli będzie ona równa zmiennej $m.

imap_header zwraca obiekt zawierający wyczerpujące informacje o nagłówku wiadomości w wyniku wykonania. Obiekt ten zawiera między innymi tablicę from, która zawiera cztery wartości. Są to: osobiste, adl, skrzynka pocztowa i host. Spośród nich interesuje nas tylko skrzynka pocztowa i host. Zastępując je otrzymamy adres, z którego wysłano list.

$h = imap_header($my_box, $m); $h = $h->od; foreach ($h as $k => $v) ( $skrzynka pocztowa = $v->skrzynka pocztowa; $host = $v->host; $personal = $v->osobiste; $email = $skrzynka pocztowa . "@" . $host;

imap_fetch_overview - pozwoli nam poznać temat listu. Do tych samych celów można użyć imap_header, ale z wielu powodów może to czasami nie działać. Z tablicy zwracanej przez tę funkcję potrzebujemy tylko pola tematu

$s = imap_fetch_overview($my_box, $m); foreach ($s jako $k => $v) $subj = $v->temat;

Nasze dalsze działania sprowadzają się do wyciągnięcia maila z bazy i jeśli tam jest, zaznaczenia całej linijki z tym wpisem jako lub usunięcia go. Załóżmy, że po wypełnieniu formularza mailingowego na stronie subskrybentowi zostaje przypisany status 0, a po zatwierdzeniu subskrypcji zmienia się na 1.

If ($subj == "subskrybuj") ( mysql_query("aktualizuj zestaw subskrypcji stat=1 gdzie email=$my_email"); $del = imap_delete($my_box, $m); mail($email, $add_sbj, $add_text , $headers); ) else if ($subj == "unsubscribe") ( mysql_query("usuń z subskrypcji, gdzie e-mail = $my_email"); $del = imap_delete($my_box, $m); mail($email, $ del_sbj, $del_text, $headers); ) else ( $del = imap_delete($my_box, $m); mail($email, $err_sbj, $err_text, $headers); ) po wykonaniu wszystkich akcji skrypt czyści skrzynka pocztowa.

$clear = imap_expunge($my_box);

Ten prosty program jest tylko demonstracją tego, że w PHP można pisać nie tylko dynamicznie zmieniające się strony, ale także usługi, które w ogóle nie są widoczne dla użytkownika.

Lista całego programu poza parametrami połączenia z bazą danych:< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->z; foreach ($h as $k =>$v) ( $skrzynka pocztowa = $v->skrzynka pocztowa; $host = $v->host; $personal = $v->osobiste; $email = $skrzynka pocztowa . "@" . $host; $my_email = mysql_escape_string($email); foreach ($s jako $k =>$v) $subj = $v->temat; if ($subj == "subskrybuj") ( mysql_query("aktualizuj zestaw tabeli stat=1 gdzie email=$mój_email"); //drukuj mysql_error(); $del = imap_delete($my_box, $m); mail($ email, $add_sbj, $add_text, $headers); else if ($subj == "unsubscribe") ( mysql_query("usuń z tabeli, gdzie e-mail = $my_email"); $del = imap_delete($my_box, $m) ; mail($email, $del_sbj, $del_text, $headers); else ( $del = imap_delete($open_box, $m); mail($email, $err_sbj, $err_text, $headers); ) ) $clear = imap_expunge($my_box); )

W aukcji brakuje niektórych szczegółów, takich jak możliwa konwersja z win na koi, ponowne sprawdzenie skrzynki pocztowej nadawcy itp. Są to już funkcjonalne dodatki, które każdy może dodać w razie potrzeby.

Jednym z możliwych zastosowań funkcji imap jest utworzenie demona poczty, który będzie zarządzał sposobem, w jaki użytkownicy subskrybują i wypisują się z Twojej listy mailingowej. Aby zrealizować to zadanie, w mailingach zwykle stosuje się dwie metody. Pierwsza zakłada, że ​​użytkownik musi wejść na określoną stronę i potwierdzić swoje działania, druga wymaga wysłania listu. Drugie wymaga również, aby skrypt obsługi był regularnie uruchamiany przez demona cron. Z tego powodu nie jest tak popularna jak pierwsza metoda.

Jednak, jak widać, w przypadku najpoważniejszych wysyłek stosuje się drugą metodę. Jeśli więc masz możliwość użycia cronda, użyj go.

Właściwie zrozumienie funkcji nie jest takie trudne. Osoba, która pracowała wcześniej w PHP, z łatwością zrozumie, jak z nimi pracować.

Pewne trudności mogą pojawić się przy analizowaniu nagłówków listów, które skrypt będzie przetwarzał.
Jeśli istnieją litery, analizowane są nagłówki pierwszej litery. Sprawdzane są pola od i temat. Jeśli pole tematu zawiera jedną z dwóch prawidłowych opcji nagłówka (subskrybuj lub anuluj subskrypcję), wówczas rekord pasujący do wartości pola od staje się aktywny (potwierdzony) lub zostaje usunięty z tabeli. W obu przypadkach odpowiednie powiadomienie o działaniach skryptu wysyłane jest na adres podany w polu nadawcy.
Następnie list zostaje oznaczony do usunięcia. Jeśli temat nie zawiera prawidłowych tematów, zostanie wysłane powiadomienie o błędzie, a list zostanie również oznaczony do usunięcia. Następnie skrypt przechodzi do następnego e-maila.

Po przejrzeniu wszystkich listów opróżnia skrzynkę pocztową.


Nie będę zanudzać czytelnika schematami blokowymi, więc przejdźmy od razu do rzeczy. Do otwarcia skrzynki pocztowej używana jest funkcja imap_open. Ponieważ PHP obsługuje pracę z kilkoma protokołami, konieczne jest jawne wskazanie, który protokół jest używany do pracy ze skrzynką pocztową.

W naszym przypadku jest to POP3 na porcie 110 (standard). Wynik wykonania skryptu przypisujemy do zmiennej $my_box.

Zobaczysz później, że ta zmienna będzie używana praktycznie we wszystkich funkcjach imap. Następnie sprawdzamy, czy w skrzynce pocztowej nie ma listów.
Sprawdzanie odbywa się za pomocą funkcji imap_num_msg.
$n = imap_num_msg($my_box);

W rezultacie zmienna $n będzie zawierać liczbę liter w skrzynce pocztowej. Liczba ta może być większa od zera lub jej równa (jeśli pole jest puste).

Jeśli są litery, to w pętli while analizujemy litery, sekwencyjnie zwiększając numer litery o jeden.


Należy pamiętać, że pierwsza litera w skrzynce pocztowej będzie miała numer 0, podobnie jak pierwszy element tablicy.
Aby zwiększyć liczbę liter, przypisz zmiennej $m wartość 0, a następnie zgodnie z warunkami pętli zwiększ ją o jeden $m++.
Do analizy interesujących nas nagłówków wystarczą dwie funkcje: imap_header oraz imap_fetch_overview. Aby wypełnić każdy z nich, oprócz skrzynki pocztowej, należy podać numer listu. W naszym przypadku wewnątrz pętli będzie ona równa zmiennej $m.
Imap_header zwraca w wyniku wykonania obiekt zawierający kompleksową informację o nagłówku listu. Obiekt ten zawiera między innymi tablicę from, która zawiera cztery wartości. Są to: osobiste, adl, skrzynka pocztowa i host. Spośród nich interesuje nas tylko skrzynka pocztowa i host.
Zastępując je otrzymamy adres, z którego wysłano list.
$h = $h -> od;
$e-mail = $skrzynka pocztowa. ? @ ¬ . $host;

Imap_fetch_overview - pozwoli nam poznać temat listu. Do tych samych celów można użyć imap_header, ale z wielu powodów może to czasami nie działać. Z tablicy zwracanej przez tę funkcję potrzebujemy tylko pola tematu


foreach ($s jako $k => $v ) (
$subj = $v -> temat;
}

Nasze dalsze działania sprowadzają się do pobrania maila z bazy i jeśli tam się znajduje, zaznaczenia całej linijki z tym wpisem jako „zweryfikowany” lub usunięcia go. Załóżmy, że po wypełnieniu formularza mailingowego na stronie subskrybentowi zostaje przypisany status 0, a po zatwierdzeniu subskrypcji zmienia się na 1.

if ($subj == "SUBSKRYBUJ" ) (
mysql_query( „AKTUALIZUJ subskrypcję SET stat=1 GDZIE email=$my_email”);

}
mysql_query( „USUŃ Z subskrypcji GDZIE e-mail = $my_email”);
$del = imap_delete ($my_box, $m);
}
w przeciwnym razie(
$del = imap_delete ($my_box, $m);
}

jak wspomniano powyżej, po wykonaniu wszystkich czynności skrypt czyści skrzynkę pocztową.


Ten najprostszy program to tylko demonstracja, że ​​w PHP można pisać nie tylko dynamicznie zmieniające się strony, ale także usługi, które w ogóle nie są widoczne dla użytkownika. Oczywiście, jeśli chodzi o pisanie skryptów dla powłoki, PHP nie ma zastosowania, w przeciwieństwie do swojego konkurenta Perla, ale mimo to…

Lista całego programu poza parametrami połączenia z bazą danych (db.php):

dołącz „db.php”;
$my_box = imap_open („(you.pop.host/pop3:110)” , „login” , „hasło” );
$n = imap_num_msg($my_box);
$m = 0;
$dodaj_tekst = "

Dziękujemy za potwierdzenie subskrypcji" ;
$add_sbj = "Dodałeś!" ;
$del_tekst = "

Przepraszamy, ale ta skrzynka pocztowa jest w użyciu
tylko do administracji mailingowej" ;
$err_sbj = "Błąd";
$nagłówki = „Od: Subskrybuj Robot

X-mailer: PHP4

Typ zawartości: tekst/zwykły; zestaw znaków=UTF-8
" ;
if($n != 0 ) (
podczas ($m++< $n ) {
$h = imap_header($my_box, $m);
$s = imap_fetch_overview ($my_box, $m);
Należy pamiętać, że pierwsza litera w skrzynce pocztowej będzie miała numer 0, podobnie jak pierwszy element tablicy.
foreach ($h jako $k => $v ) (
Imap_header zwraca w wyniku wykonania obiekt zawierający kompleksową informację o nagłówku listu. Obiekt ten zawiera między innymi tablicę from, która zawiera cztery wartości. Są to: osobiste, adl, skrzynka pocztowa i host. Spośród nich interesuje nas tylko skrzynka pocztowa i host.
Zastępując je otrzymamy adres, z którego wysłano list.
$h = $h -> od;
$e-mail = $skrzynka pocztowa. „@” . $host;
$mój_email = mysql_escape_string($email);
}
foreach ($s jako $k => $v ) (
$subj = $v -> temat;
}
if ($subj == "SUBSKRYBUJ" ) (
mysql_query( „AKTUALIZUJ tabelę SET stat=1 WHERE email=$my_email”);
//wydrukuj błąd_mysql();
$del = imap_delete ($my_box, $m);
poczta ($email, $add_sbj, $add_text, $headers);
}
elseif ($subj == "ANULUJ SUBSKRYPCJĘ" ) (
mysql_query( „USUŃ Z tabeli GDZIE e-mail = $mój_e-mail”);
$del = imap_delete ($my_box, $m);
poczta ($email, $del_sbj, $del_text, $headers);
}
w przeciwnym razie(
$del = imap_delete ($open_box, $m);
poczta ($email, $err_sbj, $err_text, $headers);
}
}
$clear = imap_expunge($my_box);
}
?>

Któregoś dnia otrzymałem zadanie napisania małego modułu w PHP, który umożliwiłby mi pracę z pocztą przychodzącą. Po krótkim googlowaniu zobaczyłem, że jeden z protokołów odpowiada mi do tego zadania POP3 I IMAP.
Ale wybór był oczywisty: użyłbym protokołu IMAP, ponieważ jest on bardziej funkcjonalny i nowocześniejszy niż protokół POP3.

Teraz musiałem szybko dowiedzieć się, jak pracować z protokołami IMAP i jak odbierać listy z serwera pocztowego Yandex/Google.

Dla wygodniejszej pracy wybrałem bibliotekę PhpImap, ponieważ może szybko i łatwo zrealizować wszystkie potrzebne mi zadania.

Łączenie z serwerem pocztowym.

Teraz, gdy już zdecydowaliśmy się na wybór protokołu i biblioteki, spróbujemy połączyć się z serwerem pocztowym.

Aby PHP w pełni współpracowało z protokołem IMAP, musisz włączyć rozszerzenie php_imap.dll/imap.so w pliku php.ini.

Najpierw spróbujmy połączyć się z pocztą Yandex, ponieważ miałem z nią najmniej problemów.

//Dołącz biblioteki include("/phpImap/Mailbox.php"); include("/phpImap/IncomingMail.php"); //Dla wygody utworzę stałe służące do łączenia się z serwerem pocztowym. zdefiniuj("MAIL_IMAP_SERVER", "imap.yandex.ru"); zdefiniuj("MAIL_IMAP_SERVER_PORT", 993); zdefiniuj("MAIL_IMAP_LOGIN", " "); zdefiniuj("MAIL_IMAP_PASS", "przykład_hasło"); zdefiniuj("MAIL_IMAP_PATH", "(.MAIL_IMAP_SERVER.":.MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX"); $skrzynka pocztowa = nowa PhpImap\Mailbox(MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__); try ( $mailbox->getImapStream(); ) catch (Wyjątek $e) ( die($e->getMessage()); )

Jak widzimy konstruktora klasy Skrzynka pocztowa przyjmuje następujące argumenty:

  • MAIL_IMAP_PATH- Zawiera adres serwera (MAIL_IMAP_SERVER), port połączenia (MAIL_IMAP_SERVER_PORT), typ połączenia (imap) oraz wskazuje, że połączenie będzie szyfrowane (ssl). Po nawiasach klamrowych wskazujemy folder, z którym się połączymy, w tym przypadku z wiadomościami przychodzącymi (INBOX).
  • MAIL_IMAP_LOGIN- Skrzynka pocztowa, z którą się połączymy.
  • MAIL_IMAP_PASS- Hasło (najczęściej jest to hasło ze skrzynki pocztowej).
  • __KIERUNEK__- Jest to ścieżka do folderu, w którym będą zapisywane załączone pliki i wiadomości e-mail.

Następnie sprawdzimy, czy nasze połączenie zostało utworzone tą metodą pobierzImapStream() jeśli z jakiegoś powodu połączenie nie zostanie nawiązane, aplikacja zgłasza wyjątki z przyczyną nieudanego połączenia.

Należy wziąć pod uwagę, że w ustawieniach poczty Yandex mogłaś wyłączyć możliwość łączenia się za pośrednictwem protokołu IMAP.

Porównajmy teraz połączenie z Gmailem.

Zdefiniuj("MAIL_IMAP_SERVER", "imap.gmail.com"); zdefiniuj("MAIL_IMAP_SERVER_PORT", 993); zdefiniuj("MAIL_IMAP_LOGIN", " "); zdefiniuj("MAIL_IMAP_PASS", "przykład_hasło"); zdefiniuj("MAIL_IMAP_PATH", "(.MAIL_IMAP_SERVER.":.MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX");

Jak widzimy, praktycznie nie różni się to od poprzedniego połączenia, ale najprawdopodobniej otrzymasz wyjątek podczas łączenia się z serwerem.
Problem ten wynika z faktu, że Protokół IMAP Gmaila jest domyślnie wyłączony. Można ją włączyć w ustawieniach w zakładce Przekazywanie i POP/IMAP w opcji Dostęp IMAP ⇒ Włącz IMAP.

Po włączeniu pracy poprzez protokół IMAP potrzebujemy utwórz aplikację z hasłami. Aby mógł on zostać utworzony musimy dokonać autoryzacji dwuskładnikowej dla tego profilu. Następnie możesz zacząć go tworzyć. Kiedy będziemy tworzyć nowe hasło do aplikacji, będziemy musieli wpisać je do stałej MAIL_IMAP_PASS, aby połączyć się z serwerem.

Pamiętaj, że podczas tworzenia hasła do aplikacji możesz nie mieć możliwości połączenia się z serwerem; wynika to z faktu, że hasło to nie zostało jeszcze ostatecznie zastosowane w usłudze Gmail, zwykle zajmuje to 5-60 minut;

Próbkowanie danych

Po udanym połączeniu możemy wysłać prośbę o otrzymanie wiadomości potowych z serwera. W tym celu użyjemy metody searchMailBox(string $kryteria) który jest zasadniczo opakowaniem metody imap_search

. Warto tutaj zrozumieć, że argument $criteria jest pewnym kryterium wyszukiwania potrzebnych nam wiadomości, sama metoda zwraca identyfikatory elementów, które później przydadzą nam się do uzyskania szczegółowych informacji o wiadomości pocztowej.

$mailsIds = $skrzynka pocztowa->searchMailBox("ALL");
Jak można się domyślić, tutaj odbieramy wszystkie wiadomości.

//Wszystkie wiadomości przez 3 dni. $mailsIds = $mailbox->searchMailBox("OD ".date("d-M-Y",strtotime("-3 dni"))."""); //Nieprzeczytane wiadomości od 3 dni. $mailsIds = $mailbox->searchMailBox("NIEWIDOCZNE OD ".date("d-M-Y",strtotime("-3 dni"))."""); //Wyszukaj wiadomości z tym dopasowaniem w nagłówku TEKST. $mailsIds = $mailbox->searchMailBox("TEKST "Biuletyn""); //Wyszukaj wiadomości z tym dopasowaniem w nagłówku BODY. $mailsIds = $mailbox->searchMailBox("BODY "Wiadomość informacyjna""); //Wyszukiwanie według adresu e-mail nadawcy. $mailsIds = $mailbox->searchMailBox("FROM " ""); //Odbieraj wiadomości według tytułu SUBJECT $mailsIds = $mailbox->searchMailBox("SUBJECT "Wydano aktualizacje dla Twojego telefonu"");

Ten przykład zapewnia dobry przegląd podstaw korzystania z kryteriów wyszukiwania.

Uzyskiwanie informacji

Teraz, gdy mamy już tablicę identyfikatorów wiadomości, jesteśmy gotowi ją przetworzyć:

//Pobierz identyfikator ostatniej wiadomości z tablicy. $id = koniec($mailsIds); //Pobierz instancję obiektu klasy IncomingMail, która zawiera informacje o wiadomości. $mail = $skrzynka pocztowa->getMail($id); //Pobierz pliki załączone do tej wiadomości, jeśli takie istnieją. $mail->getAttachments(); //Wyjście wiadomości. echo $poczta->tekstHtml;

Zatem wiadomości z naszego listu i jego załączników otrzymaliśmy bez żadnych problemów.

Dodatkowe funkcje.

Biblioteka ta zawiera także szereg przydatnych metod pozwalających na wygodniejszą pracę z wiadomościami e-mail:

Zapisujemy wiadomości według jego identyfikatora.

$skrzynka pocztowa->saveMail($id,$id..eml");

Ustaw wiadomości jako nieprzeczytane według ich identyfikatora.

$skrzynka pocztowa->markMailAsUnread($id);

Ustawiamy wiadomości jako przeczytane według ich identyfikatora.

$skrzynka pocztowa->markMailAsRead($id);

Oznaczamy wiadomość po jej identyfikatorze.

$skrzynka pocztowa->markMailAsImportant($id);

Usuwamy wiadomości według ich identyfikatora.

Niektóre aplikacje internetowe mogą wymagać specjalnego adresu e-mail dla użytkownika. W takim przypadku możemy napisać własny kod e-mail SquirrelMail lub Roundcube. Niezależnie od tego, co wybierzesz, wiedza o tym, jak korzystać z poczty IMAP, będzie pomocna.

Jak pracować z protokołem IMAP w PHP opisano na dwóch stronach. Na pierwszej stronie znajdują się funkcje niezbędne do łączenia się z serwerami pocztowymi i odczytywania wiadomości. Na drugiej stronie porozmawiamy o pracy z pocztą e-mail, na przykład usuwaniu wiadomości, pobieraniu aplikacji itp.

Aby zademonstrować funkcjonalność, zostaną użyte przykłady kodu, które można wykorzystać do uruchomienia własnych skryptów klienta poczty e-mail.

Parametry adresu URL do wywoływania niezbędnych funkcji:

  • func - rodzaj potrzebnej funkcji (np. czytanie wiadomości e-mail, przeglądanie skrzynki pocztowej, usuwanie wiadomości)
  • folder - nazwa folderu skrzynki pocztowej, z którą chcesz się połączyć (np.: Skrzynka odbiorcza, Elementy wysłane, spam)
  • uid - unikalny identyfikator e-mail

Parametry można pobrać za pomocą $_GET, a przełącznika można użyć do wywołania odpowiednich akcji.

Łączenie z serwerem IMAP

Aby nawiązać połączenie z serwerem IMAP, używamy funkcji imap_connect() jak pokazano poniżej:

Ścieżka wiadomości, nazwa użytkownika i hasło to parametry niezbędne do połączenia się z serwerem. O dodatkowych opcjach możesz dowiedzieć się z instrukcji.

Ścieżka skrzynki pocztowej to ciąg znaków identyfikujący serwer, a port w nawiasach klamrowych określa nazwę żądanego folderu poczty.

Oto kilka linii folderu Skrzynka odbiorcza usługi pocztowe:

  • Gmail (imap.gmail.com: 993/imap/ssl) Skrzynka odbiorcza
  • Yahoo (imap.mail.yahoo.com: 993/imap/ssl) Skrzynka odbiorcza
  • AOL (imap.aol.com: 993/imap/ssl) Skrzynka odbiorcza

Niektóre serwery nie mają włączonego protokołu SSL, w takim przypadku należy pominąć w wierszu słowo „SSL”. Inne serwery mogą używać własnych certyfikatów, w których należy podać „NOVALIDATE-CERT”.

Po otwarciu połączenia z serwerem pocztowym możemy teraz przyjrzeć się funkcjom używanym do następujących działań:

  • Wyświetl listę folderów skrzynki pocztowej na swoim koncie e-mail
  • Wyświetl listę wiadomości e-mail w folderze
  • Wyświetl zawartość e-maila autora

Foldery e-mailowe

Skrzynka odbiorcza , Wysłano , Śmieci I Spam- Foldery te są widoczne na prawie każdym koncie e-mail, a użytkownicy często mogą tworzyć własne foldery. Aby wyświetlić wiadomości w tych folderach, musimy zmienić parametry połączenia. Na przykład zastosuj wcześniej „INBOX” w pasku ścieżki. Jeśli chcesz połączyć się z folderem spamu, użyj zamiast tego czegoś takiego jak „Spam”. Ale chociaż może być wymieniony jako Spam na konto e-mail, podczas przeglądania za pośrednictwem klienta poczty rzeczywiste nazwy folderów w tle mogą być inne. Możemy wyświetlić listę wszystkich istniejących folderów na koncie za pomocą imap_list() .

"; foreach (foldery $ jako folder $) ( $folder = str_replace("(imap.gmail..php?folder=" . $folder . "&func=view">" . $folder . ""; ) echo "";

Musimy przekazać uchwyt połączenia uzyskany za pomocą imap_open() jako parametr początkowy do imap_list() . Musimy także podać ścieżkę (bez folderu, np. „INBOX”). Trzeci parametr to żądanie wszystkich dostępnych folderów.

Powiadomienie o wiadomości

Każdy folder zawiera listę dostępnych wiadomości e-mail, więc zobaczmy, jak możemy utworzyć listę wiadomości w naszej skrzynce odbiorczej.

Najpierw musisz uzyskać liczbę dostępnych wiadomości za pomocą imap_num_msg() . Następnie możemy użyć funkcji imap_header(), aby uzyskać informacje o nagłówku każdej wiadomości.

Powiedzmy, że chcemy ostatnich 20 e-maili:

($numWiadomości - 20); $i--) ( $header = imap_header($imap, $i); $fromInfo = $header->from; $replyInfo = $header->reply_to; $details = array("fromAddr" => (isset($ fromInfo->mailbox) && isset($fromInfo->host)) ?$fromInfo->mailbox . "@" $fromInfo->host: "", "fromName" => (isset($fromInfo->personal)) ? $fromInfo->personal: "", "replyAddr" => (isset($replyInfo->mailbox) && isset($replyInfo->host)) ? $replyInfo->mailbox "@" : "", "replyName " => (isset($replyTo->personal)) ? $replyto->personal: "", "temat" => (isset($header->temat)) $header->temat: "", "udate" => (isset($nagłówek->udate)) ? $nagłówek->udate: ""); $uid = imap_uid($imap, $i ");

    "; echo "
  • Z:" . $details ["fromName"]; echo " " . $details ["fromAddr"] . "
  • "; echo "
  • Temat:" . $details["temat"] ..php?folder=" . $folder. "&uid=" . $uid ..php?folder=" . $folder . "&uid=" . $uid . "&func=delete">Usuń
  • "; echo "
"; }

Połączenia $Imap muszą być otwarte w odpowiednim folderze. Możemy następnie przejrzeć ostatnie 20 e-maili, korzystając z liczby e-maili otrzymanych przez imap_num_msg() . Link i numer e-maila są przekazywane funkcji imap_header() w celu uzyskania informacji z nagłówka, które można następnie zinterpretować jako interesujące informacje od nadawcy, adresu e-mail, imienia i nazwiska, tematu itp.

Należy pamiętać, że numer e-mail z całkowitej liczby wiadomości nie jest unikalnym identyfikatorem wiadomości. Jeśli masz w skrzynce pocztowej 100 e-maili, ostatnią liczbą będzie 100, poprzednią będzie 99 i tak dalej. Jeśli usuniesz wiadomość o numerze 100, a następnie otrzymasz nową wiadomość, jej numer będzie wynosić 100.

Aby móc przejść do kolejnych kroków, musisz uzyskać unikalny identyfikator swojego adresu e-mail. Każdy email posiada unikalny identyfikator zwany UID, który możemy uzyskać podając email, funkcję dla imap_uid() number. UID jest unikalny i nie będzie się zmieniać w czasie.

Wyświetl treść wiadomości

Czytanie wiadomości e-mail w rzeczywistości nie jest tak proste, jak poprzednie zadania, dlatego musisz skorzystać z klas pocztowych opracowanych przez Mitul Koradia. Klasa dostosowuje następujące trzy funkcje do naszego przykładu poniżej:

kodowanie) (przypadek 3: zwróć imap_base64($text); przypadek 4: zwróć imap_qprint($text); domyślnie: zwróć $text; ) ) // wieloczęściowy if ($structure->type == 1) ( foreach ($structure ->części jako $index => $subStruct) ( $prefix = ""; if ($partNumber) ( $prefix = $partNumber . "."; ) $data = get_part($imap, $uid, $mimetype, $ subStruct, $przedrostek ($indeks + 1)); if ($dane) (zwróć $dane; ) ) ) return false; ) funkcja get_mime_type($struktura) ( $primaryMimetype = array("TEKST", "WIELOCZĘŚCIOWE", "WIADOMOŚĆ", "APLIKACJA", "AUDIO", "OBRAZ", "WIDEO", "INNE"); if ($struktura ->podtyp) ( return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype; ) return "TEKST/ZWYKŁY" )

Funkcja GetBody() pobiera treść wiadomości e-mail, przekazując jej połączenie UID i IMAP. Wewnątrz funkcji wywołujemy funkcję get_part() z typem zawartości jako tekst/HTML. Zwykły tekst wiadomości e-mail jest znacznie łatwiejszy do odczytania. Dlatego najpierw spróbujemy znaleźć treść HTML w wiadomości e-mail.

Następnie czytamy strukturę wiadomości e-mail za pomocą funkcji imap_fetchstructure(). Zmieniliśmy funkcje biblioteki tak, aby używały UID zamiast ciągłego przekazywania FT_UID.

Następnie otrzymamy typ MIME wiadomości e-mail za pomocą funkcji get_mime_type(). Funkcja ta zwraca osiem typów MIME w postaci liczb całkowitych:

  • 0 – TEKST
  • 1 – WIELOCZĘŚCIOWE
  • 2 – WIADOMOŚĆ
  • 3 – ZASTOSOWANIE
  • 4 – DŹWIĘK
  • 5 – OBRAZ
  • 6 – WIDEO
  • 7 – INNE

Zamieniamy powrót na prawdziwy typ MIME ciągu, używając tablic typów MIME.

Wiadomości wieloczęściowe mogą mieć dużą liczbę podtypów, więc rekurencyjnie przeglądamy wszystkie podtypy, używając części liczb i pobieramy wiadomość e-mail za pomocą imap_fetchBody(), gdy zostanie znaleziony właściwy, używając typu MIME.

Następnie stosujemy odpowiednią funkcję dekodującą zgodnie z kodowaniem typu wiadomości i zwracamy treść. Pełna lista dostępnych typów kodowania:

  • 0 – 7BITÓW
  • 1 – 8BITÓW
  • 2 – BINARNY
  • 3 – BAZA64
  • 4 – WYCENA-DO DRUKU
  • 5 – INNE

Wniosek

Zakończyliśmy przeglądanie podstaw łączenia się z serwerem IMAP, wyświetlanie listy wiadomości w dostępnych folderach i zakończyliśmy czytanie zawartości wiadomości e-mail. Na kolejnej stronie wpisu omówimy funkcje, za pomocą których można zaimplementować dodatkową funkcjonalność klienta pocztowego, np. usuwanie wiadomości i przetwarzanie załączników.



Jeśli zauważysz błąd, zaznacz fragment tekstu i naciśnij Ctrl+Enter
UDZIAŁ: