Menu
Jest wolny
Zameldować się
główny  /  Multimedia. / Wyciągnij litery z poczty. Pracujemy z protokołem IMAP

Wyciągnij litery z poczty. Pracujemy z protokołem IMAP

Jednym z możliwych funkcji aplikacji IMAP jest utworzenie demone pocztowego, który zarządza użytkownikami subskrypcji i przejęć z listy mailingowej. Aby wdrożyć to zadanie, dwie metody są zwykle używane w skrzynce pocztowej. Pierwszy sugeruje, że użytkownik powinien przejść do pewnej strony i potwierdzić jego działania, druga wymaga wysłania litery. Drugi również wymaga regularnego regularnego skryptu przetwarzania Daemon? Om. Z tego powodu nie jest tak popularny jako pierwszy sposób.

Ale, jak widać, najpoważniejsze biuletyny używają drugiej metody. Dlatego, jeśli masz możliwość używania Crond, użyj go.

Właściwie to nie jest trudne do zrozumienia funkcji. Osoba, która pracowała na RNR, bez trudności, jak z nimi pracować. Niektóre trudności mogą powstać z analizą nagłówków liter, które przetwarza skrypt.

Algorytm pracy scenariusza jest łatwy. Demon ustanawia połączenie z serwerem poczty i sprawdza na niej obecność liter. W przypadku nie ma liter, praca skryptów zatrzymuje się.
Jeśli są litery, istnieje parsowanie nagłówków pierwszej litery. Możesz oglądać pola z i przedmiotów. Jeśli pole podmiot zawiera jeden z dwóch dopuszczalnych opcji nagłówka (subskrypcja lub nagrywanie), rekord, który odpowiada polu z pola, albo staje się aktywny (potwierdzony) lub usunięty ze stołu. W obu przypadkach adres określony w polu z From jest wysyłany do odpowiedniego powiadomienia o działaniu skryptowym. Po tym list jest oznaczony do usuwania. Jeśli obiekt nie zawiera dopuszczalnych tematów, wysyłany jest powiadomienie o błędzie, a litera jest również oznaczona również do usuwania. Następnie skrypt porusza się do następnego listu.
Po zakończeniu analizy wszystkich liter czyści pudełko.

Nie będę zabierać czytelnika w diagramach blokowych, więc natychmiast przejdziemy do biznesu. Funkcja IMAP_OPEN służy do otwierania pola. Ponieważ PNP obsługuje wiele protokołów, należy wyraźnie określić, który protokół służy do pracy z szufladą. W naszym przypadku jest POP3 do 110 portu (standard). Przypisujemy wynik skryptu do skryptu $ my_BOX.


W przyszłości zobaczysz, że ta zmienna zostanie użyta dokładnie we wszystkich funkcjach IMAP. Następnie zaznacz pole dla liter. Weryfikacja wykonuje funkcję IMAP_NUM_MSG.

$ n \u003d imap_num_msg ($ my_box);

W rezultacie zmienna $ n będzie zawierać liczbę liter w polu. Numer może być albo więcej zero, albo równy (jeśli pudełko jest puste).
Jeśli są listy, a następnie w cyklu, wykonujemy analizę liter, konsekwentnie zwiększając numer literowy na jednostkę. Należy pamiętać, że pierwsza litera w polu będzie miała numer 0, jak i pierwszego elementu tablicy.
Aby zwiększyć liczbę liter, przypisać wartość zmiennej $ M 0, a następnie w warunkach cyklu, zwiększamy go na jednostkę $ M ++.

Aby przeanalizować nasi nagłówki dla nas, dwie funkcje wystarczą: IMAP_HEADER i IMAP_Fetch_overview. Aby wykonać każdy z nich, oprócz szuflady, musisz określić numer literowy. W naszym przypadku będzie równa zmiennej $ M.

IMAP_HECHETER Zwraca obiekt w wyniku wykonania zawierającego wyczerpujące informacje o nagłówku Listu. Między innymi obiekt ten zawiera tablicę z, która zawiera cztery wartości. Jest to osobisty, ADL, skrzynka pocztowa i gospodarz. Jesteśmy zainteresowani tylko skrzynką pocztową i gospodarzem. Zastępuje je, otrzymujemy adres, z którego wysłano list.


$ H \u003d $ h -\u003e z;
zA.
foreach ($ h jako $ k \u003d\u003e $ V) (
$ Mailbox \u003d $ V -\u003e skrzynka pocztowa;
$ Host \u003d $ V -\u003e host;
$ Personal \u003d $ V -\u003e Osobiste;
$ e-mail \u003d $ Mailbox. ? @ ¬. $ Host;

IMAP_Fetch_overview - pozwoli nam poznać tematu listu. Dla tych samych celów możliwe byłoby użycie IMAP_HEHEHEHEHTER, ale dla liczby powodyCzasami może nie działać. Z tablicy zwraca tę funkcję, potrzebujemy tylko pola tematu


Foreach ($ s as $ k \u003d\u003e $ V) (
$ Subj \u003d $ V -\u003e temat;
}

Ponadto nasze działania są zmniejszone, aby wyciągnąć wiadomość e-mail z podstawy, a jeśli go masz, zaznacz cały ciąg z tym wpisem jako "zweryfikowany" lub usuń. Przypuśćmy, że po wypełnieniu formularza pocztowego na miejscu, abonent jest przypisany status 0, a po potwierdzeniu subskrypcji zmienia się na 1.

jeśli ($ Subj \u003d\u003d "Subskrybuj") (
mySQL_QUERY ( "UPDATE SUBSKRYBUJE STAT STAT \u003d 1 WHERE EMAIL \u003d $ MY_EMAIL");

}
mySQL_QUERY ( "Usuń z subskrypcji, gdzie e-mail \u003d $ my_EMail");
$ del \u003d imap_delete ($ my_box, $ m);
}
Inaczej (
$ del \u003d imap_delete ($ my_box, $ m);
}

Jak wspomniano powyżej, po wykonaniu wszystkich działań skrypt czyści pudełko.


To najprostszy program., tylko demonstracja, którą możesz napisać nie tylko dynamicznie zmieniające się witryny, ale usługi, które użytkownik nie są widoczne w ogóle, można napisać. Oczywiście, pod względem pisania skryptów do powłoki, RNR nie ma zastosowania, w przeciwieństwie do jego konkurenta Perl, ale mimo to ...

Listing cały program z wyjątkiem parametrów połączenia z podstawą (DB.PHP):

obejmują "db.php";
$ My_BOX \u003d IMAP_OPEN ("(you.pop.host/pop3:110)", "Login", "Hasło");
$ n \u003d imap_num_msg ($ my_box);
$ m \u003d 0;
$ add_text \u003d "

Dziękujemy za potwierdzenie subskrypcji ";
$ Dodaj_sbj \u003d "Dodałeś!" ;
$ Del_text \u003d "

Przepraszam, ale ta skrzynka pocztowa jest używana
Tylko po to, aby zarządzać wysyłką ";
$ err_sbj \u003d "błąd";
$ Headers \u003d. "Od: Subskrybuj robot

X-Mailer: PHP4

Typ treści: tekst / zwykły; Charset \u003d UTF-8
" ;
Jeśli ($ n! \u003d 0) (
Podczas gdy ($ m ++< $n ) {
$ H \u003d imap_header ($ my_box, $ m);
$ s \u003d imap_fetch_overview ($ my_box, $ m);
$ H \u003d $ h -\u003e z;
Foreach ($ h jako $ k \u003d\u003e $ V) (
$ Mailbox \u003d $ V -\u003e skrzynka pocztowa;
$ Host \u003d $ V -\u003e host;
$ Personal \u003d $ V -\u003e Osobiste;
$ e-mail \u003d $ Mailbox. "@". $ Host;
$ My_EMail \u003d mysql_escape_string ($ e-mail);
}
Foreach ($ s as $ k \u003d\u003e $ V) (
$ Subj \u003d $ V -\u003e temat;
}
Jeśli ($ Subj \u003d\u003d "Subskrybuj") (
mySQL_QUERY ( "Aktualizacja zestaw tabeli Stat \u003d 1 gdzie email \u003d $ my_EMail");
// Drukuj MySQL_Error ();
$ del \u003d imap_delete ($ my_box, $ m);
mail ($ e-mail, $ add_sbj, $ add_text, $ headers);
}
ELSIF ($ SUBJ \u003d\u003d "ANDUBSSKRIJE") (
mySQL_QUERY ( "Usuń z tabeli, gdzie e-mail \u003d $ my_EMail");
$ del \u003d imap_delete ($ my_box, $ m);
mail ($ e-mail, $ del_sbj, $ del_text, $ nagłówki);
}
Inaczej (
$ del \u003d imap_delete ($ open_box, $ m);
mail ($ e-mail, $ er_sbj, $ er_text, $ nagłówki);
}
}
$ Clear \u003d imap_expunge ($ my_box);
}
?>


E-mail - Jest to najważniejsze narzędzie do udostępniania informacji, a jeśli używasz go do pracy, z pewnością spotykają się z sytuacją: list przychodzi do poczty, która zawiera dane niezbędne do przetwarzania. Porozmawiamy o Yandex Mail - w tym artykule będę dzielić się z tobą, Drodzy czytelnicy, doświadczam, jak zdobyć listy z pudełka, będziemy również przeanalizować opcję, gdy istnieje zainwestowany plik w liście - jak go znaleźć i ostatecznie Pobierz go do dalszych manipulacji.

Sam spotkałem to zadanie przez długi czas, a następnie, jeśli istnieje małe doświadczenie z programami pocztowymi Yandex, spędziłem dużo czasu i nerwy, aby osiągnąć pożądany wynik. Moim pierwszym błędem było to, że wielu programistów internetowych zacząłem intensywnie poszukać podobnych przykładów w sieci, ale nie wykorzystał pomocy Yandex. Tak, istnieje przydatne informacje, chociaż jest bardzo mały, ale jest to dość ważne dla pisania tego rodzaju skryptu (będzie poniżej). W tym czasie konieczne było napisanie skryptu, którego istota została zmniejszona: poczta Klienta przyszła do poczty klienta list z ceną towarów w formacie XLS raz dziennie, konieczne było przetworzenie go (do Podziewo i porównuj z danymi z sklepu internetowego DB i, w zależności od wyniku, która aktualizacja gdzieś, wyłączanie lub włączone).

I pierwszą rzeczą, którą zrobimy przed napisaniem skryptu, jest dokonanie naszego planu działania, który będzie składać się z dziewięciu przedmiotów:

  1. Skonfiguruj pocztę, aby uzyskać dostęp do protokołów pocztowych;
  2. Zwróć uwagę na samą strukturę Aplikacje PHP. i określ kodowanie plików;
  3. Zapoznamy się z protokołem pocztowym IMAP i jego możliwościami;
  4. Połączamy się z pocztą Yandex przez login i hasło konta i śledzić błąd na tym etapie;
  5. Przetwarzaj nagłówek litery;
  6. Uzyskujemy i przetwarzamy ciało listu;
  7. Dostajemy i zapisujemy zagnieżdżone pliki;
  8. Wizualizujemy wykonaną pracę;
  9. Dokonywać wniosków.

Temat jest dość obszerny, ale spróbuję wyruszyć wszystko jest najbardziej kompaktowe i zrozumiałe. Być może postępować.

Ustawianie poczty

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



Teraz przyjechaliśmy do Ustawienia pocztą za pośrednictwem protokołów IMAP i POP3:


Tutaj wielu zobaczy zdjęcie jako obraz powyżej, ale natknąłem się i więcej niż raz, gdy dostęp jest wyłączony. Dlatego, jeśli masz inne ustawienia, umieść kleszcze, jak w zrzucie zrzutu ekranu, dla nas najważniejsze, aby umożliwić dostęp za pośrednictwem protokołu IMAP.

Struktura aplikacji i jego kodowanie

W tym przykładzie nie wymyślimy złożoną strukturą aplikacji, ponieważ nie jest to potrzebne i dodaj tylko to, co jest potrzebne (pracuję w wysublimowanym edytorze tekstu):


  • tMP - folder, w którym pobieramy zagnieżdżone pliki z litery, jeśli są;
  • .HTACCESS - konfigurowanie części serwera, jeśli masz serwer Apache;
  • funkcje.php - tutaj dodadzą nasze funkcje;
  • główny plik stylu;
  • index.php - punkt wejścia aplikacji;

Kodowanie użyje UTF-8 i dlatego natychmiast wypełnia plik.Htaccess Następne rzędy:

AdddeFaultCharSet UTF-8 AddCarSet UTF-8 * CharsetsourceCceCT UTF-8 CharsetDefault UTF-8

Protokół IMAP.

Wracając do pierwszego elementu widać, że można również pracować z pocztą Yandex przez protokół POP3. Więc dlaczego dokładnie IMAP? Z tych dwóch kanałów IMAP jest nowszy i alternatywny pop3, dlatego ma wiele zalet (można je studiować za pomocą Wikipedii), ale w naszym przypadku wybór miał wpływać tylko na to, że był nowy. Osobiście nie widzę specjalnej różnicy, która jest używana szczególnym zadaniem otrzymanie listu. Jeśli z jakiegoś powodu musisz użyć protokołu POP3, a następnie wszystkie funkcje mają zastosowanie do IMAP.

Podłącz do poczty Yandex za pomocą protokołu IMAP

Aby połączyć się z pocztą, musimy znać trzy parametry: Login Mail, jego hasło i adres serwer poczty elektronicznej. Jeśli nie ma problemów z dwoma parametrami, drugi można znaleźć w pomocy Yandex. O tym (miałem problem) Byłem wyższy i napisałem masę przykładów, gdzie trzeci parametr jest nieprawidłowy i wyobraź sobie, że przynajmniej na etapie połączenia jest co najmniej nieprzyjemne. Nie będę chodzić i natychmiast i natychmiast podaj bezpośredni link do strony Yandex - oprawa programy pocztowe. . Oto właściwie, aby połączyć:


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

Nagłówek ("Typ treści: Tekst / HTML; Charset \u003d UTF-8"); ERROR_REPORTING (0); Wymagać_once ("funkcje.php"); $ mail_login \u003d "yandex_pot"; $ Mail_password \u003d "Password_text"; $ Mail_imap \u003d "(imap.yandex.ru:993/imap/ssl)"; // Lista rozliczanych typów plików $ mail_filetypes \u003d tablica ("msword"); $ Connection \u003d IMAP_OPEN ($ Mail_imap, $ Mail_login, $ mail_password); Jeśli ("$ Connection) (Echo (" Podłączenie błędów z pocztą - ". $ Mail_login); wyjście;) else ($ msg_num \u003d iMap_num_msg ($ połączenie); $ mail_data \u003d tablica (); dla ($ I \u003d 1; $ JA.<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

Po pierwsze, należy dodatkowo określić kodowanie UTF-8 za pomocą nagłówka i wyłącz mapowanie błędów. Podłącz funkcje pliku.php i określ ustawienia, które zostały adresowane powyżej. W tablicy $ Mail_Filetypes przepisujemy formaty plików, których potrzebujemy. Postanowiono więc dokonać niepotrzebnych śmieci i odbierać określone pliki. Połączenie maila występuje przy użyciu funkcji IMAP_OPEN (), która, z dobrą wykonaniem, zwraca strumień IMAP, a z awarią - false (ale jeśli włączyć wyświetlanie błędu, to nie tak nie jest). Kompletna praca z strumieniami za pomocą funkcji IMAP_Close (), przekazując go wskaźnik połączenia. Pomiędzy tymi dwoma funkcjami jest zwykły operator warunkowy.

Dzięki pomyślnym połączeniu za pomocą IMAP_NUM_MSG (), dowiadujemy liczbę liter w poczcie i dodamy tablicę, do której umieścimy wszystkie niezbędne dane ze strumienia. Następnie następuje cykl, w którym każda litera zostanie przetworzona przez jego numer (numeracja występuje od 1) oddzielnie.

Przetwarzanie nagłówka listu

Aby uzyskać nagłówek Letter, musisz użyć funkcji IMAP_HEHEHEHTER (), drugi parametr jest liczbą litery:

// CAP CAP $ MSG_HEADER \u003d IMAP_HEADER ($ Connection, $ I);

Na tym etapie otrzymamy obiekt, z którego pociągniemy dane, których potrzebujemy, zachowując tablicę $ maili_data. Oto przykład jednej z liter:

Ten zrzut ekranu pokazuje, że wszystkie dane są powielane, ale nie odgrywa specjalnej roli, ciągnąć, co jest wygodniejsze. Znacznie ważniejsza jest kodowanie tematu listu. Może być jakikolwiek lub ten moment musi być kontrolowany. Ta sama sytuacja z korpusem listu i zagnieżdżonych plików.

$ maili_data [$ I] ["Czas"] \u003d czas ($ msg_header-\u003e maildate); $ Maili_data [$ I] ["Data"] \u003d $ msg_header-\u003e pocztą pocztową; Foreach ($ msg_header-\u003e do As $ Data) ($ Mails_data [$ i] ["do"] \u003d $ Data-\u003e Skrzynka pocztowa. "@. $ Data-\u003e Host;) Foreach ($ msg_header-\u003e z As $ MSG ) ($ mails_data [$ I] ["z"] \u003d $ Data-\u003e skrzynka pocztowa. "@. $ Data-\u003e Host;)

Zapiszemy w naszej tablicy: tymczasowa etykieta, data otrzymania litery, e-maila odbiorcy i nadawcy i przejść do tematu listu. Aby to zrobić, najpierw najpierw dodamy trzy funkcje do pliku funkcji.php:

Funkcja Check_UTF8 ($ Charset) (IF (Strtolower ($ CharSet)! \u003d "UTF-8") (zwraca Fałsz;) Zwróć prawdziwe;) Funkcja Convert_to_UTF8 ($ in_charset, $ str), "UTF ICONV ($ in_charset)," UTF -8 ", $ str);) Funkcja Get_imap_title ($ STR) ($ MIME \u003d IMAP_MIME_HEADER_DECODE ($ STR); $ Title \u003d" "; Foreach ($ MIME jako $ Key \u003d\u003e $ M) (jeśli (! Check_utf8) M-\u003e CharSet)) ($ tytuł. \u003d Convert_to_UTF8 ($ M-\u003e Charset, $ M-\u003e Tekst);) ELS ($ TITTLE. \u003d $ M-\u003e Tekst;)) Zwróć $ M-\u003e)

Rozmawiaj imiona i myślę, że warto wyjaśnić tylko ostatnią funkcję. Akceptuje zakodowany ciąg i użycie IMAP_MIME_HEADER_DECODE () Dekoduje go, w wyniku czego zwracana jest tablica obiektów, z których każdy ma dwa właściwości znaków (kodowania) i tekstu (temat tekstowy). Dalsze wszystko jest proste: w pętli sprawdzając kodowanie, klikamy UTF-8 i przyklejamy temat w jednym nagłówku i zwróć go.

Teraz wrócmy do pliku index.php i przedłużyć ostatni parametr:

$ mails_data [$ i] ["tytuł"] \u003d get_imap_title ($ msg_header-\u003e temat);

Na tym przetwarzaniu nagłówka litery zostanie zakończona.

Pracujemy z listem pisania

Nadal stopniowo tworzyliśmy naszą tablicę z przetworzonymi literami, a teraz, dla organizmu, musimy użyć dwóch funkcji:

// litera body $ msg_structure \u003d IMAP_Fetchstructure ($ połączenie, $ I); $ msg_body \u003d imap_fetchbody ($ połączenie, $ I, 1);

W pierwszej zmiennej $ MSG_Structure znajduje się struktura literowa - jest to obiekt, w którym można znaleźć masę przydatna informacjaPrzykład części tego obiektu przedstawiono poniżej:

Co ważne jest rozwiązanie naszego problemu:

  • typ jest głównym typem korpusu listu, w zależności od tego, co dochodzi do poczty, może się zmienić od 0 do 7 (każda cyfra radzi swoim typem treści w treści liter);
  • kodowanie - koder transferu ciała, zmienia się od 0 do 5 (0 - 7bit, 1 - 8bit, 2 - binarny, 3 - Base64, 4 - cytowane do druku, 5 - inne);
  • części są tablicą części listu odpowiadające strukturę poziomu obiektu powyżej.

Zobacz więcej szczegółów. Rozważ nieruchomość części. Pierwszą rzeczą do powiedzenia jest to, że w celi zerowej tej tablicy istnieje informacje odpowiadające tekstowi listu i począwszy od pierwszego zagnieżdżonego plików. Również w każdym obiekcie określonym typu i parametrów kodującym w widocznym i nie wyraźnym formularzu.

Struktura listu może być ukryta zainwestowana, przynajmniej miałem przypadki, gdy osiągnęło cztery - pięć poziomów, tak że, jak powiedzą, odłączyć nas w przyszłości, konieczne będzie napisanie funkcji rekurencyjnej.

Druga funkcja IMAP_Fetchbody () wyciąga określoną część listu, najczęściej w zakodowanej formie.

Teraz dodaj zmienną, w której utrzymamy przetworzoną wersję korpusu listu:

$ body \u003d "";

Wróćmy do funkcji plików.php i napisz funkcję rekurencyjnej:

Funkcja Recursive_Search ($ Structure) ($ kodowania \u003d ""; jeśli ($ Structure-\u003e Subtype \u003d\u003d "HTML" || $ Strucusion-\u003e Type \u003d\u003d 0) (IF (IF ($ Structure-\u003e Parameters) Charset ") ($ Charset \u003d $ Structure-\u003e Parametry-\u003e Wartość;) Array (" kodowanie "\u003d\u003e $ Structure-\u003e Kodowanie," Charset "\u003d\u003e Strtolower ($ Charset)," podtyp "\u003d\u003e $ Struktura \u003e Subtype);) ELS (IF (ISET ($ STRUCTRUCE-\u003e części)) (RETURN RECURSIVE_SEARSECH ($ Structure-\u003e części);) Charset \u003d $ Structure-\u003e Parametry-\u003e Wartość;) Array powrotu ("Kodowanie" \u003d\u003e $ Structure-\u003e Kodowanie, "Charset" \u003d\u003e Strtolower ($ Charet), "Subtype" \u003d\u003e $ Structure-\u003e Subtype);) ))

Funkcja RECURSIVE_SEARCH () bierze jeden parametr - struktura literowa, w której właściwości sekwencyjnie sprawdzają i ciągnie trzy parametry: kodowanie, znak, podtyp. Punkt wyjścia z rekurencji jest brak właściwości części za pomocą zerowej komórki. Więcej do wyjaśnienia tutaj nie ma nic więcej, z kodu Myślę, że jest jasne, co się dzieje.

Dodamy kolejną cechę do sprawności ciała listu, który będzie wymagany w przyszłości:

Funkcja Structor_enCoding ($ kodowanie, $ MSG_Body) (Case 4: $ Body \u003d IMAP_QPRINT ($ MSG_Body); Break; Case 3: $ Body \u003d IMAP_BASE64 ($ MSG_Body); Break; Case 2: $ Body \u003d IMAP_BINARY ($ MSG_Body); przerwa; przypadek 1: $ body \u003d IMAP_8BIT ($ msg_body); break; case 0: $ body \u003d $ msg_body; break; domyślnie: $ body \u003d ""; break;) zwrot $ ciało;)

$ Recoursive_data \u003d rekurencyjne_search ($ msg_structure); Jeśli ($ Recursive_data ["kodowanie"] \u003d\u003d 0 || $ Recursive_data ["kodowanie"] \u003d\u003d 1) ($ body \u003d $ msg_body;), jeśli ($ rescentive_data ["kodowanie"] \u003d\u003d 4) ($ body \u003d Structure_enCoding ($ Recursive_data ["kodowanie"], $ MSG_Body);), jeśli ($ Recursive_data ["Kodowanie"] \u003d\u003d 3) ($ Body \u003d Structure_encing ($ Recursive_data ["kodowanie"] RECURSIVE_DATA ["Kodowanie"] \u003d\u003d 2) ($ Body \u003d Structure_encing ($ Recursive_data ["Kodowanie"], $ msg_body); If (! Check_UTF8 ($ Recursive_data ["Charset"])) ($ Body \u003d Convert_utf8) Recursive_data ["Charset"], $ MSG_Body);)

Po otrzymaniu danych z rekurencji stopniowo sprawdzają kodowanie transferu i, w zależności od tego, wywołaj funkcję konstrukcji () z odpowiednimi parametrami. W ostatnim oświadczeniu warunkowym uznamy, co pracujemy w UTF-8, a jeśli po wszystkich manipulacjach będziemy różni się od kodowania, recoding.

Pozostaje narysowany:

$ maile_data [$ i] ["ciało"] \u003d base64_encode ($ ciało);

W ciele, list może być zarówno zwykły tekst, jak i Markup HTML z ich stylami. Kodujemy w Base64, aby nasz układ nie pójdzie z wizualizacją.

Zagnieżdżone pliki.

Tutaj płynnie dotrzemy do końca pisania naszej aplikacji:

// zagnieżdżone, jeśli pliki (isset ($ msg_structure-\u003e części)) (dla ($ j \u003d 1, $ f \u003d 2; $ j< count($msg_structure->części); $ J ++, $ F ++) (IF (in_array ($ msg_structure-\u003e części [$ J] -\u003e Subtype, $ Mail_Filetypes)) ($ Mails_data [$ I] ["Dołącza"] [$ J] [ Typ "] \u003d $ MSG_Structure-\u003e Części [$ J] -\u003e Subtype; $ Mails_data [$ I] [" Dołącza "[$ J] [" Rozmiar "] \u003d $ msg_structure-\u003e części [$ J] -\u003e bajty ; $ Mails_data [$ I] ["Dołącza"] [$ J] ["Nazwa"] \u003d Get_imap_title ($ msg_structure-\u003e części [$ J] -\u003e Parametry-\u003e wartość); $ mail_data [$ I] ["Dołącza "] [$ J] [" Plik "] \u003d Struktura_ENNODING ($ MSG_Structure-\u003e Części [$ J] -\u003e Kodowanie, IMAP_Fetchbody ($ Connection, $ I, $ f)); file_put_contents (" TMP / ". ICONV (" TMP / ". ICONV (" TMP / ". ICONV (" UTF-8 "," CP1251 ", $ Mails_Data [$ I] [" Dołącza "] [$ J] [" Nazwa "]), $ Mails_Data [$ I] [" Dołącza "] [$ J] [" Plik " ]);))))

Kawałek odpowiedzialny za przetwarzanie pliku wbudowanego jest znacznie mniejszy, a teraz - dlaczego dokładnie. Zasada pracy z plikiem jest podobna do pracy z korpusem litery, tylko ten etap rozpoczyna się od obecności w tablicy właściwości części. Nie zapomnij odciąć niepotrzebne, obracając listę typów. Korzystanie z funkcji Simple File_put_contents () zapisujemy nasz plik na serwerze do folderu TMP.

Chcę zobaczyć wynik!

W procesie pracy utworzyliśmy tablicę z danymi $ maile_data, a do wizualizacji będziemy pracować bezpośrednio z nim. W tym artykule użyłem listu testowego, który miałem pocztę, zobaczmy, co zrobiliśmy na końcu:


Oto, jakiego rodzaju czegoś musisz dostać tablicę, niestety, musiałem ukryć treść pliku z powodów osobistych. Teraz przejdź do naszego znacznika HTML:

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

Yandex Mail (przychodzące) |

Liczba liter:

brak liter
$ Mail) :?
Tag:
Data:
Do kogo:
Z:
Przedmiot:
List w Base64:
Zagnieżdżone pliki:
$ Attach) :?
Typ:
Rozmiar (w bajtach):
Nazwa:
Ciało:

Style, których nie dodam, ponieważ nie odgrywają specjalnej roli, w rezultacie:


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

Wniosek

Po zakończeniu wszystkich etapów z artykułu, osiągasz należne wyniki, ale wszystko nie jest tak łatwe, jak może się wydawać - istnieją pułapki, które należy uwzględnić. Podczas pisania skryptu do konkretnego zadania należy przestrzegać kodowania na wszystkich etapach, litery mogą przejść z różnych poczty, z których każdy może mieć własne niuanse. Ważne jest również, aby wziąć pod uwagę, że pocztą Yandex i ich okresowa dokumentacja jest aktualizowana, więc różne sublausy mogą wydawać się pracować z programami pocztowymi. Mam na tym wszystko, mam nadzieję, że użyjesz tego artykułu podczas pracy z wersją niższej wersji poczty Yandex.

Niemożliwe jest otrzymywanie listu mocującego (
Jeśli poczta jest wysyłana z plikiem - ktoś znika tekstu listu

Pomóż mi proszę

Jest jasne ... Jeśli okaże się wszystko od Yandex na Yandex ...
Wpisz na zewnątrz
Ale dlatego inne pliki oprócz słowa, ten skrypt nie akceptuje, nie jest jasny ... Istnieje linia MSWORD w pobliżu przecinka i PDF i FLG i FG - czyta i oszczędza tylko słowo .... coś takiego

Niektóre aplikacje internetowe mogą wymagać specjalnego e-maila dla użytkownika. W takim przypadku możemy napisać własny kod e-mail squirrelemail lub roundCube. Niezależnie od tego, co wybierzesz, wiedza o poczcie IMAP będzie przydatna.

Jak pracować z IMAP w PHP opisany jest na dwóch stronach. Na pierwszej stronie niezbędne funkcje podłączenia do serwerów poczty i wiadomości czytania. Na drugiej stronie porozmawiajmy o pracy z e-mailem, na przykład usuwanie wiadomości, pobierania aplikacji itp ...

Aby zademonstrować funkcjonalność, przykłady kodu, które można wykorzystać do uruchomienia skryptów własnego klienta poczty.

Parametry URL do wywołania niezbędnych funkcji:

  • fUNC - wymagane typ funkcji (na przykład: Przeczytaj e-mail, wyświetl skrzynkę pocztową, Usuń wiadomość)
  • folder - Nazwa folderu skrzynki pocztowej do połączenia (na przykład: przychodzące, wysłane, spam)
  • uID - unikalny identyfikator e-mail

Parametry można uzyskać za pomocą $ _get i przełącznik można użyć do wywołania odpowiednich działań.

Połącz się 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 niezbędne parametry do podłączenia z serwerem. Możesz dowiedzieć się o dodatkowych parametrach w instrukcji.

Ścieżka do skrzynki pocztowej jest łańcuchem, który identyfikuje serwer i port w nawiasach kręcony definiuje nazwę żądanego folderu poczty.

Oto kilka wierszy do folderu Przychodzący 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

Na niektórych serwerach nie jest włączone SSL, w tym przypadku musisz pominąć "SSL" z ciągu. Inne serwery mogą korzystać z własnych certyfikatów, w których musisz włączyć "Novalidate-Cert".

Dzięki otwartym połączeniu z serwerem pocztowym możemy teraz spojrzeć na funkcje używane dla następujących czynności:

  • Wyświetla listę folderów skrzynek pocztowych na koncie e-mail
  • Wyświetla listę wiadomości e-mail w folderze
  • Wyświetl treść poczty e-mail autora

Foldery e-mail.

Przychodzący , Opublikowany , Śmieci i spam - Te foldery są widoczne na prawie każdym koncie e-mail, a użytkownicy często tworzą własne foldery. Aby wyświetlić wiadomości w tych folderach, musimy zmienić nasz ciąg połączenia. Na przykład zastosuj "Skrzynka odbiorcza" (przychodzące) w wierszu ścieżki wcześniej. Jeśli chcesz połączyć się z folderem SPAM, zamiast tego użyj czegoś takiego jak "spam" (SPAM). Ale chociaż może być wymieniony jako spam Na koncie e-mail, jeśli przeglądasz klienta poczty e-mail, obecna nazwa folderów w tle może być inna. Możemy wybrać wszystkie dostępne foldery na koncie za pomocą IMAP_List ().

"; Foreach ($ foldery jako $ folder) ($ folder \u003d str_replace (" (IMAP.Gmail..php? Folder \u003d ". $ folder." & Func \u003d Widok "\u003e". $ folder. "";) Echo"";

Musimy przenieść deskryptor połączenia uzyskany z IMAP_OPEN () jako oryginalnego parametru IMAP_List (). Musimy również przejść przez ścieżkę (bez folderu, na przykład "skrzynce odbiorczej"). Jako trzeci parametr żądanie wszystkich dostępnych folderów.

Powiadomienie o przesłaniu

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

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

Powiedzmy, jeśli chcemy ostatnie 20 liter:

($ Nummessages - 20); $ I--) ($ Header \u003d IMAP_HECHETER ($ IMAP, $ I); $ FromFo \u003d $ Header-\u003e z; $ ReplyInfo \u003d $ Header-\u003e Odpowiedz_to; $ Szczegóły \u003d Array ("Fromaddr" \u003d\u003e (Isset ($ Frominfo-\u003e skrzynka pocztowa) && isset ($ fromfo-\u003e host))? $ Odfo-\u003e skrzynka pocztowa. "@". $ FromFo-\u003e Host: "", "Fromname" \u003d\u003e (Isset))? $ Odfo-\u003e osobiste : "", "Odpowiedzaddr" \u003d\u003e (Isset ($ Replyfo-\u003e MailBox) && Isset ($ ReplyInfo-\u003e Host))? $ OdpowiedźInfo-\u003e Skrzynka pocztowa. "@". $ ReplyInfo-\u003e Host: "", "Nazwa odpowiedzi "\u003d\u003e (Isset ($ Replyto-\u003e Personal))? $ Replyto-\u003e Personal:" "," Temat "\u003d\u003e (Isset ($ Header-\u003e Temat))? $ Header-\u003e Temat:" "," Udate "\u003d\u003e (Isset ($ Header-\u003e UDATE))? $ Header-\u003e Udate:" "); $ UID \u003d IMAP_UID ($ IMAP, $ I); Echo"

    "; Echo"
  • Z:". $ szczegóły [" fromname "]; echo" ". $ szczegóły [" fromaddr "]."
  • "; Echo"
  • PRZEDMIOT: ". $ Szczegóły [" Temat "] ..php? Folder \u003d". $ Folder. "& Uid \u003d". $ uid ..php? folder \u003d ". $ folder." & Uid \u003d ". $ UID." & FUNC \u003d Usuń "\u003e Usuń
  • "; Echo"
"; }

Związek $ IMAP należy otworzyć w żądanym folderze. Możemy następnie przejść przez ostatnie 20 liter za pomocą liczby wiadomości uzyskanych przez IMAP_NUM_MSG (). Numer komunikacji i e-mail otrzymuje imap_header () w celu uzyskania informacji o tytule, który można włączyć, aby uzyskać interesujące informacje z nadawcy, adresu e-mail, nazwy, 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 100 liter w skrzynce pocztowej, ostatni numer będzie 100, poprzedni będzie 99, i tak dalej. Jeśli usuniesz wiadomość na numerze 100, otrzymasz nową wiadomość, jego numer będzie 100.

Aby kontynuować następujące działania, musisz uzyskać unikalny identyfikator wiadomości e-mail. Każda litera ma unikalny identyfikator o nazwie UID, który możemy uzyskać poprzez dostarczanie wiadomości e-mail, funkcja dla numeru IMAP_UID () jest unikalna i nie zmieni się z czasem.

Wyświetl treść wiadomości

Czytanie e-mail nie jest naprawdę prostą sprawą, co poprzednie zadania, więc musisz użyć klas mailowych opracowanych przez Careadade Mitula. Następujące trzy funkcje naszego przykładu są dostosowane do klasy poniżej:

kodowanie) (Case 3: Return IMAP_BASE64 ($ Tekst); Case 4: Return IMAP_QPrint ($ Tekst); Domyślnie: Zwróć $ tekst -\u003e Części jako $ Indeks \u003d\u003e $ Podstawowe) ($ prefiks \u003d ""; jeśli ($ PartNumber) ($ prefiks \u003d $ PartNumber. "";) $ Data \u003d Get_Part ($ IMAP, $ UID, $ Mimetype, $ Podstruwanie , $ prefiks. ($ indeks + 1)); jeśli ($ DATA) (RETURN $ DATA;))))))) Zwróć fałszywe; ) Funkcja Get_Mime_type ($ Structure) ($ PrimeredMimeType \u003d Array ("Tekst", "MultipArt", "Wiadomość", "Aplikacja", "Audio", "Image", "Video", "Inny"); jeśli ($ Structure -\u003e Subtype) (Return $ PrimaryMimetype [(int) $ Structure-\u003e Typ]. "/"

Funkcja GetBody () odbiera treści e-mail, przekazując UID i połączenie IMAP. Wewnątrz funkcji wyjaśniamy funkcję Get_part () z typem zawartości jako tekst / HTML. Zwykła wiadomość e-mail jest znacznie łatwiejsza do odczytania. W ten sposób najpierw próbujemy znaleźć zawartość HTML w e-mailu.

Następnie czytamy strukturę e-mail za pomocą funkcji IMAP_Fetchstructure (). Zmieniliśmy funkcje biblioteki, aby korzystać z UID, zamiast ciągle przekazywać FT_UID.

Następnie dostajemy typ wiadomości e-mail MIME za pomocą funkcji Get_Mime_type (). Istnieje ośmiu typów MIME zwróconych przez tę funkcję jako liczby całkowite:

  • 0 - Tekst.
  • 1 - wieloczęści.
  • 2 - Wiadomość
  • 3 - Zastosowanie
  • 4 - Audio.
  • 5 - Obraz
  • 6 - Wideo.
  • 7 - Inny

Obracamy powrót do łańcucha MIME typu rzeczywistego za pomocą tablic typu MIME.

Komunikaty kompozytowe mogą mieć dużą liczbę podtypów, więc rekurencyjnie przez wszystkie podtypy za pomocą części numerów i odbierania wiadomości e-mail za pomocą IMAP_Fetchbody () po użyciu typu MIME.

Następnie używamy odpowiedniej funkcji dekodowania zgodnie z kodowaniem typu wiadomości i rozszerzyć zawartość. Pełna lista dostępnych typów kodowania:

  • 0 - 7bit.
  • 1 - 8bit.
  • 2 - binarny.
  • 3 - Base64.
  • 4 - cytowany do druku
  • 5 - Inny

Wniosek

Zakończyliśmy oglądanie podstaw połączenia z serwerem IMAP, listą wiadomości w dostępnych folderach i zakończyliśmy odczyt treści wiadomości e-mail. Na następnej stronie rekordu zostanie opisany o funkcjach, które można wykorzystać do wdrożenia dodatkowej funkcjonalności klienta poczty, na przykład usuwanie wiadomości i załączników przetwarzania.

Pewnego dnia przyszedłem napisać mały moduł na PHP, który pozwoliłby pracować z przychodzącą pocztą. Trochę w Google widziałem, że dla tego zadania jest odpowiednie dla mnie jedną z protokołów Pop3. i IMAP..
Ale wybór był oczywisty, że użyję IMAP, ponieważ jest bardziej funkcjonalny i nowoczesny protokół POP3.

Teraz musiałem szybko dowiedzieć się, jak pracować z protokołami IMAP, jak zdobyć listy z serwera Email Yandexa / Google.

Dla wygodniejszej pracy wybrałem bibliotekę Phpimap. Ponieważ może szybko i łatwo implementuje wszystkie potrzebne zadania.

Połącz się z serwerem pocztowym.

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

W przypadku pełnoprawnej pracy PHP z protokołem IMAP należy podłączyć rozszerzenie php_imap.dll / imap.so. W pliku php.ini.

Na początku spróbujmy połączyć się z pocztą Yandex, ponieważ mam z tym najmniej problemami.

// Podłącz biblioteki dołączone ("/ PHPIMAP / Mailbox.php"); Obejmują ("/ phpimap / incomingmail.php"); // dla wygody, stwórz stałą podłączenie do serwera pocztowego. Definiuj ("Mail_imap_server", "imap.yandex.ru"); Zdefiniuj ("Mail_imap_server_port", 993); Definiować ("mail_imap_login", ""); Zdefiniuj ("Mail_imap_pass", "example_pass"); Zdefiniuj ("Mail_imap_path", "(" .mail_imap_server. ":" Mail_imap_server_port. "/ IMAP / SSL) Skrzynka odbiorcza"); $ Mailbox \u003d Nowa skrzynka pocztowa PHPIMAP (mail_imap_path, mail_imap_login, mail_imap_pass, __dir__); Spróbuj ($ Mailbox-\u003e GetimapsTream ();) Catch (wyjątek $ e) (Die (Die E-\u003e GetMessage ());)

Jak widzimy projektanta klas Skrzynka pocztowa Przyjmuje następujące argumenty:

  • Mail_imap_path. - Razem adresu serwera (mail_imap_server), port połączenia (mail_imap_server_port), typ połączenia (IMAP) i pokazuje, że połączenie zostanie zaszyfrowane (SSL). Po nawiasach kręconymi określysz folder, do którego połączymy się w tym przypadku do wiadomości przychodzących (Skrzynka odbiorcza).
  • Mail_imap_login. - Skrzynka pocztowa, która zostanie podłączona.
  • Mail_imap_pass. - Hasło (najczęściej jest to hasło z skrzynki pocztowej).
  • __Dir__- Jest to ścieżka do folderu, w którym zostaną zapisane zagnieżdżone pliki i wiadomości e-mail.

Następnie sprawdzimy, czy nasze połączenie zostało utworzone przez metodę getimapstream () Jeśli z jakiegoś powodu połączenie nie zostanie utworzone, aplikacja rzuca wyłączenia z przyczyną nie jest dobrym połączeniem.

Ważne jest, aby wziąć pod uwagę fakt, że w ustawieniach poczty Yandex można wyłączyć możliwość podłączenia za pomocą protokołu IMAP.

Porównajmy teraz połączenie z pocztą Gmail.

Definiuj ("Mail_imap_server", "imap.gmail.com"); Zdefiniuj ("Mail_imap_server_port", 993); Definiować ("mail_imap_login", ""); Zdefiniuj ("Mail_imap_pass", "example_pass"); Zdefiniuj ("Mail_imap_path", "(" .mail_imap_server. ":" Mail_imap_server_port. "/ IMAP / SSL) Skrzynka odbiorcza");

Jak widzimy, prawie nie różni się od poprzedniego połączenia, ale najprawdopodobniej będziesz miał wyjątek podczas podłączenia z serwerem.
Ten problem wynika z tego, że Praca protokołu Gmaila IMAP jest domyślnie wyłączona. Możesz włączyć go w ustawieniach w zakładce Przekazywanie i POP / IMAP w opcji dostępu przez protokół IMAP ⇒ Włącz IMAP.

Po tym, jak włączyliśmy pracę na protokole IMAP, potrzebujemy utwórz aplikację Hasło. Aby móc stworzyć, musimy dokonać autoryzacji dwóch czynników dla tego profilu. Po tym możesz przejść do jego stworzenia. Gdy tworzymy nowe hasło do aplikacji, musimy zostać włożone do stałej e-komunikacyjnej, aby połączyć się z serwerem.

Należy pamiętać, że podczas tworzenia aplikacji hasła może nie być w stanie połączyć się z serwerem, jest związany z faktem, że hasło nie zostało jeszcze zastosowane wreszcie do usługi Gmaila zwykle trwa 5-60 minut.

Próbkowanie danych.

Po udanym połączeniu możemy wykonać żądanie, aby uzyskać wiadomości potu z serwera. W tym celu użyjemy metody searchMailBox (String $ Criteria) który jest zasadniczo metodą opakowania imap_search.. Ważne jest, aby zrozumieć, że argument kryteriów $ jest pewnym poszukiwaniem potrzebujemy wyszukiwania, sama metoda zwraca identyfikator elementów, które następnie używają go do szczegółowych informacji o poczcie.

$ MailSIDS \u003d $ Mailbox-\u003e SelfMailBox ("All";

Jak już się domyśliłeś, otrzymujemy wszystkie wiadomości.
A teraz spróbujmy to rozgryźć z innymi równie ważnymi kryteriami wyszukiwania:

// Wszystkie posty na 3 dni. $ MailSIDS \u003d $ Mailbox-\u003e SzafkaMailBox ("Odkąd" .Date ("D-M-Y", Strtotime ("- 3 dni")). "" "); // nieprzeczytane wiadomości przez 3 dni. $ Mailsids \u003d $ Mailbox-\u003e SelfmailBox ("Niewidziany od" .Date ("D-Y", Strtotime ("- 3 dzień")). "" "); // Szukaj wiadomości z taką korespondencją w tytule tekstu. $ MailSIDS \u003d $ Mailbox-\u003e SEARCHMailBox ("Tekst" Newsletter "); // Szukaj wiadomości z taką korespondencją w nagłówku ciała. $ MailSIDS \u003d $ Mailbox-\u003e SEARCHMailBox ("Ciało" wiadomość informacyjna "); // szukaj nadawcy wiadomości e-mail. $ MailSIDS \u003d $ Mailbox-\u003e SelfmailBox ("z" "); // Uzyskaj wiadomości na temat $ Mailsids \u003d $ MailBox-\u003e SEARCHMailBox (aktualizacje "Temat" dla telefonu ");

Ten przykład odzwierciedla podstawy do korzystania z kryteriów wyszukiwania.

Otrzymywanie informacji

Teraz, gdy mamy tablicę identyfikatorów wiadomości, jesteśmy gotowi do przetworzenia:

// Uzyskaj identyfikator ostatniej wiadomości z tablicy. $ Id \u003d koniec ($ mailsids); // Uzyskaj instancję obiektu klasy incomingMail, która zawiera informacje o wiadomości. $ Mail \u003d $ Mailbox-\u003e Getmail ($ ID); // Pobierz pliki osadzone do tej wiadomości, jeśli jest. $ Mail-\u003e getattachments (); // Wyświetlany komunikatów. Echo $ mail-\u003e texthtml;

Dlatego otrzymaliśmy wiadomości z naszego listu i jego inwestycji bez żadnych problemów.

Dodatkowe funkcje.

W tej bibliotece również obecność wielu przydatnych metod wygodniejszej pracy z wiadomościami pocztowymi:

Zapisz wiadomości według swojego identyfikatora.

$ Mailbox-\u003e SaveMail ($ ID, $ ID. "EML");

Tworzymy wiadomości jako nieprzeczytane przez jego identyfikator.

$ Mailbox-\u003e MarkmailasunRead ($ ID);

Tworzymy wiadomości jako czytane przez jego identyfikator.

$ Mailbox-\u003e Markmailasread ($ ID);

Zainstaluj wiadomość na swoim identyfikatorze.

$ Mailbox-\u003e MarkMailAasymportant ($ ID);

Usuń wiadomości według swojego identyfikatora.

Jednym z możliwych funkcji aplikacji IMAP jest utworzenie demone pocztowego, który zarządza użytkownikami subskrypcji i przejęć z listy mailingowej. Aby wdrożyć to zadanie, dwie metody są zwykle używane w skrzynce pocztowej. Pierwszy sugeruje, że użytkownik powinien przejść do pewnej strony i potwierdzić jego działania, druga wymaga wysłania litery. Drugi wymaga również regularnego uruchomienia skryptu przetwarzania Cron Daemon-OM. Z tego powodu nie jest tak popularny jako pierwszy sposób.

Ale, jak widać, najpoważniejsze biuletyny używają drugiej metody. Dlatego, jeśli masz możliwość używania Cron, użyj go.

Właściwie to nie trudno zrozumieć funkcje. Niektóre trudności mogą powstać z analizą nagłówków liter, które przetwarza skrypt.

Algorytm pracy scenariusza jest łatwy. Demon ustanawia połączenie z serwerem poczty i sprawdza na niej obecność liter. W przypadku nie ma liter, praca skryptów zatrzymuje się. Jeśli są litery, istnieje parsowanie nagłówków pierwszej litery. Możesz oglądać pola z i przedmiotów. Jeśli pole podmiot zawiera jeden z dwóch dopuszczalnych opcji nagłówka (subskrypcja lub nagrywanie), rekord, który odpowiada polu z pola, albo staje się aktywny (potwierdzony) lub usunięty ze stołu. W obu przypadkach adres określony w polu z From jest wysyłany do odpowiedniego powiadomienia o działaniu skryptowym. Po tym list jest oznaczony do usuwania. Jeśli obiekt nie zawiera dopuszczalnych tematów, wysyłany jest powiadomienie o błędzie, a litera jest również oznaczona również do usuwania. Następnie skrypt porusza się do następnego listu. Po zakończeniu analizy wszystkich liter czyści pudełko.

Funkcja IMAP_OPEN służy do otwierania pola. Ponieważ PHP obsługuje wiele protokołów, należy wyraźnie określić, który protokół służy do pracy z szufladą. W naszym przypadku jest POP3 do 110 portu (standard). Przypisujemy wynik skryptu do skryptu $ my_BOX.

$ My_BOX \u003d IMAP_OPEN ("(you.pop.host/pop3:110)", "Login", "Hasło");

W przyszłości zobaczysz, że ta zmienna zostanie użyta dokładnie we wszystkich funkcjach IMAP. Następnie zaznacz pole dla liter. Weryfikacja wykonuje funkcję IMAP_NUM_MSG.

$ n \u003d imap_num_msg ($ my_box);

W rezultacie zmienna $ n będzie zawierać liczbę liter w polu. Numer może być albo więcej zero, albo równy (jeśli pudełko jest puste). Jeśli są listy, a następnie w cyklu, wykonujemy analizę liter, konsekwentnie zwiększając numer literowy na jednostkę. Należy pamiętać, że pierwsza litera w polu będzie miała numer 0, jak i pierwszego elementu tablicy. Aby zwiększyć liczbę liter, przypisać wartość zmiennej $ M 0, a następnie w warunkach cyklu, zwiększamy go na jednostkę $ M ++.

Aby przeanalizować nasi nagłówki dla nas, dwie funkcje wystarczą: IMAP_HEADER i IMAP_Fetch_overview. Aby wykonać każdy z nich, oprócz szuflady, musisz określić numer literowy. W naszym przypadku będzie równa zmiennej $ M.

iMAP_HECHETER Zwraca obiekt w wyniku wykonania zawierającego wyczerpujące informacje o nagłówku Listu. Między innymi obiekt ten zawiera tablicę z, która zawiera cztery wartości. Jest to osobisty, ADL, skrzynka pocztowa i gospodarz. Jesteśmy zainteresowani tylko skrzynką pocztową i gospodarzem. Zastępuje je, otrzymujemy adres, z którego wysłano list.

$ H \u003d imap_header ($ my_box, $ m); $ H \u003d $ h-\u003e z; Foreach ($ H jako $ k \u003d\u003e $ V) ($ Mailbox \u003d $ V-\u003e Mailbox; $ Host \u003d $ V-\u003e Host; $ Personal \u003d $ V-\u003e Osobiste; $ Email \u003d $ Mailbox. "@". $ Host;

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

$ s \u003d imap_fetch_overview ($ my_box, $ m); foreach ($ s jako $ k \u003d\u003e $ V) $ Subj \u003d $ V-\u003e temat;

Ponadto nasze działania są zmniejszone, aby wyciągnąć wiadomość e-mail z podstawy, aw przypadku posiadania go, zaznacz cały ciąg z tym wpisem lub usuniętym. Przypuśćmy, że po wypełnieniu formularza pocztowego na miejscu, abonent jest przypisany status 0, a po potwierdzeniu subskrypcji zmienia się na 1.

Jeśli ($ Subj \u003d\u003d "Subskrybuj") (MySQL_QUERY ("UPDATE SUBSKRYBER USTAW STAT \u003d 1 WHERE EMAIL \u003d $ MY_EMAIL"); $ del \u003d IMAP_DELETE ($ My_BOX, $ M); Mail ($ Emax, $ Dodaj_SBJ, $ Add_text , $ Nagłówki);) indziej, jeśli ($ Subj \u003d\u003d "Unubscribe") (MySQL_Query ("Usuń z Subskrybuj, gdzie maila \u003d $ my_EMail"); $ del \u003d iMap_delete ($ my_box, $ m); mail ($ e-mail, $ del_sbj, $ del_text, $ nagłówki);) else ($ del \u003d imap_delete ($ my_box, $ m); mail ($ e-mail, $ er_sbj, $ er_text, $ nagłówki);) Po wykonaniu wszystkich działań skrypt czyści pudełko . $ Clear \u003d imap_expunge ($ my_box);

Ten prosty program jest tylko demonstracją, którą można napisać nie tylko dynamicznie zmieniające się witryny, ale także usługi, które nie są widoczne.

Listing cały program z wyjątkiem parametrów połączenia z bazą danych:

Zawierać "config.php"; // Połączenie z bazy danych $ My_BOX \u003d IMAP_OPEN ("(ty.pop.host/pop3:110)", "Logowanie", "Hasło"); $ n \u003d imap_num_msg ($ my_box); $ m \u003d 0; $ add_text \u003d "Dziękujemy za potwierdzenie subskrypcji"; $ Dodaj_sbj \u003d "Dodałeś!"; $ del_text \u003d "Zostałeś usunięty z listy mailingowej."; $ del_sbj \u003d "Usuń z listy"; $ err_text \u003d "Przepraszamy, ale ta skrzynka pocztowa jest używana tylko do administrowania wysyłką"; $ err_sbj \u003d "błąd"; $ Headers \u003d "Od: Subskrybuj Robot X-Mailer: PHP4 Typ treści: Tekst / Zwykły; Charset \u003d Windows-1251"; Jeśli ($ n! \u003d 0) (while ($ m ++< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->z; Foreach ($ H jako $ k \u003d\u003e $ V) ($ Mailbox \u003d $ V-\u003e Mailbox; $ Host \u003d $ V-\u003e Host; $ Personal \u003d $ V-\u003e Osobiste; $ Email \u003d $ Mailbox. "@". $ host; $ my_EMail \u003d mysql_escape_string ($ e-mail);) foreach ($ s as $ k \u003d\u003e $ V) $ Subj \u003d $ V-\u003e temat; Jeśli ($ Subj \u003d\u003d "Subskrybuj") (MySQL_QUERY ("UPUPEND TABLE STAT STAT \u003d 1 WHERE EMAIL \u003d $ MY_EMAIL"); // Drukuj MySQL_Error (); $ del \u003d IMAP_DELETE ($ my_box, $ m); mail ($ My_Box, $ M); Wyślij e-mail, $ Add_SBJ, $ Dodaj_Text, $ nagłówki);) ELS IF ($ SUBJ \u003d\u003d "ANDUBSSKRIBE") (MySQL_QUERY ("Usuń z tabeli, gdzie e-mail \u003d $ my_EMail"); $ del \u003d iMap_delete ($ my_box, $ m) ; Poczta ($ e-mail, $ del_sbj, $ del_text, $ nagłówki);) else ($ del \u003d iMap_delete ($ open_box, $ m); mail ($ e-mail, $ ER_SBJ, $ ER_Text, $ Headers);)) $ Clear \u003d imap_expunge ($ my_box); )

W Listinge nie ma żadnych szczegółów, takich jak możliwe, konwersja z wygranej w Koi, ponownie sprawdzając skrzynkę pocztową nadawcy itp. Są to już ekscesy funkcjonalne, które każdy może dodać w razie potrzeby.