Posielanie e-mailov php imap. Funkcie PHP imap mail. Štruktúra aplikácie a kódovanie

  • 03.11.2019

Jedným z možných použití funkcie imap je vytvorenie poštového démona, ktorý bude spravovať prihlásenie a odhlásenie používateľov z vášho zoznamu adries. Na splnenie tejto úlohy sa v zoznamoch adries zvyčajne používajú dve metódy. Prvý predpokladá, že používateľ musí prejsť na určitú stránku a potvrdiť svoje akcie, druhý vyžaduje zaslanie listu. Druhá tiež vyžaduje pravidelné fungovanie démona cron? Om. Z tohto dôvodu nie je taký populárny ako prvá metóda.

Ako však vidíte, najvážnejšie poštové zásielky používajú druhú metódu. Takže ak máte schopnosť používať crond, použite ho.

Porozumenie funkciám nie je v skutočnosti také ťažké. Osoba, ktorá predtým pracovala pre PHP, ľahko pochopí, ako s nimi pracovať. Pri analýze hlavičiek písmen, ktoré skript spracuje, môžu nastať určité ťažkosti.

Nie je ťažké prísť s algoritmom fungovania samotného skriptu. Démon nadviaže spojenie s poštovým serverom a skontroluje na ňom správy. Ak neexistujú žiadne písmená, skript prestane fungovať.
Ak existujú písmená, sú analyzované hlavičky prvého písmena. Polia od a predmet sa vyhľadajú. Ak pole predmetu obsahuje jednu z dvoch platných možností hlavičky (prihlásiť sa na odber alebo odhlásiť sa z odberu), potom sa záznam, ktorý zodpovedá hodnote poľa from, stane aktívnym (potvrdeným) alebo sa odstráni z tabuľky. V obidvoch prípadoch sa na adresu uvedenú v poli od odošle príslušné oznámenie o akciách skriptu. Potom je písmeno označené na odstránenie. Ak predmet neobsahuje platné témy, odošle sa chybové hlásenie a e-mail je tiež označený na odstránenie. Potom sa skript presunie na ďalší e-mail.
Po dokončení analýzy všetkých písmen vyprázdni schránku.

Nebudem čitateľa nudiť vývojovými diagramami, takže poďme hneď na to. Na otvorenie schránky sa používa funkcia imap_open. Pretože PHP podporuje niekoľko protokolov, musíte explicitne určiť, ktorý protokol sa použije pri práci s rámčekom. V našom prípade sa jedná o POP3 na porte 110 (štandardne). Výsledok vykonania skriptu priradíme k premennej $ my_box.


Neskôr uvidíte, že táto premenná sa použije takmer vo všetkých funkciách imap. Ďalej skontrolujeme poštovú schránku, či neobsahuje listy. Kontrola sa vykonáva funkciou imap_num_msg.

$ n \u003d imap_num_msg ($ my_box);

Vo výsledku bude premenná $ n obsahovať počet správ v poštovej schránke. Toto číslo môže byť väčšie alebo rovné nule (ak je políčko prázdne).
Ak existujú písmená, potom v slučke while tieto písmená rozoberieme a postupne zvyšujeme počet písmen o jedno. Upozorňujeme, že prvé písmeno v poštovej schránke bude mať číslo 0, rovnako ako prvý prvok v poli.
Na zvýšenie počtu písmen priradíme premennej $ m hodnotu 0 a potom ju v podmienkach vykonania slučky zvýšime o $ m ++.

Na analýzu hlavičiek, ktoré nás zaujímajú, stačia dve funkcie: imap_header a imap_fetch_overview. Na vyplnenie každého z nich musíte okrem políčka uviesť aj písmeno. V našom prípade sa vo vnútri slučky bude rovnať premennej $ m.

Imap_header vráti ako výsledok vykonania objekt obsahujúci komplexné informácie o hlavičke správy. Tento objekt okrem iného obsahuje pole z, ktoré obsahuje štyri hodnoty. Jedná sa o osobné, adl, poštové schránky a hostiteľa. Nás zaujíma iba poštová schránka a hostiteľ. Ak ich nahradíme, dostaneme adresu, z ktorej bol list odoslaný.


$ h \u003d $ h -\u003e z;
a
foreach ($ h ako $ k \u003d\u003e $ v) (
$ poštová schránka \u003d $ v -\u003e poštová schránka;
$ host \u003d $ v -\u003e hostiteľ;
$ personal \u003d $ v -\u003e personal;
$ email \u003d $ poštová schránka. ? @ ¬. $ hostiteľ;

Imap_fetch_overview - umožní nám zistiť predmet listu. Na rovnaké účely je možné použiť aj imap_header, ale z mnohých dôvodov to niekedy nemusí fungovať. Z poľa, ktoré táto funkcia vráti, potrebujeme iba pole predmetu


foreach ($ s ako $ k \u003d\u003e $ v) (
$ subj \u003d $ v -\u003e predmet;
}

Naše ďalšie akcie sa obmedzia na vytiahnutie e-mailu z databázy, a ak tam je, označte celý riadok s týmto záznamom ako „overený“ alebo ho odstráňte. Predpokladajme, že po vyplnení poštového formulára na stránke je predplatiteľovi priradený stav 0 a po potvrdení predplatného sa zmení na 1.

if ($ subj \u003d\u003d "PREDPLATIŤ") (
mysql_query ( „UPDATE prihlásiť sa na odber SET stat \u003d 1 WHERE email \u003d $ my_email“);

}
mysql_query ( „ODSTRÁNIŤ Z ODBERU, KDE sa prihlásiť na odber WHERE email \u003d $ my_email);
$ del \u003d imap_delete ($ my_box, $ m);
}
inak (
$ del \u003d imap_delete ($ my_box, $ m);
}

ako už bolo spomenuté vyššie, po vykonaní všetkých akcií skript políčko vymaže.


Tento jednoduchý program je iba ukážkou toho, že na PHP nemôžete písať iba dynamicky sa meniace stránky, ale aj služby, ktoré pre používateľa nie sú vôbec viditeľné. Samozrejme, pokiaľ ide o skriptovanie pre shell, PHP nie je použiteľné, na rozdiel od jeho konkurenta Perl, ale napriek tomu ...

Zoznam celého programu okrem parametrov pre pripojenie k základni (db.php):

zahrnúť "db.php";
$ my_box \u003d imap_open ("(you.pop.host/pop3:110)", "prihlásenie", "heslo");
$ n \u003d imap_num_msg ($ my_box);
$ m \u003d 0;
$ add_text \u003d "

Ďakujeme vám za potvrdenie prihlásenia na odber. ";
$ add_sbj \u003d "Pridali ste!" ;
$ del_text \u003d "

Je nám ľúto, ale táto poštová schránka sa používa.
iba pre správu mailing listu ";
$ err_sbj \u003d "Chyba";
$ hlavičky \u003d „Od: Prihlásiť sa na odber robota

X-mailer: PHP4

Typ obsahu: text / obyčajný; znaková sada \u003d UTF-8
" ;
if ($ n! \u003d 0) (
while ($ m ++< $n ) {
$ h \u003d imap_header ($ my_box, $ m);
$ s \u003d imap_fetch_overview ($ my_box, $ m);
$ h \u003d $ h -\u003e z;
foreach ($ h ako $ k \u003d\u003e $ v) (
$ poštová schránka \u003d $ v -\u003e poštová schránka;
$ host \u003d $ v -\u003e hostiteľ;
$ personal \u003d $ v -\u003e personal;
$ email \u003d $ poštová schránka. „@“. $ hostiteľ;
$ my_email \u003d mysql_escape_string ($ email);
}
foreach ($ s ako $ k \u003d\u003e $ v) (
$ subj \u003d $ v -\u003e predmet;
}
if ($ subj \u003d\u003d "PREDPLATIŤ") (
mysql_query ( „UPDATE tabuľka SET stat \u003d 1 WHERE email \u003d $ my_email“);
// tlač mysql_error ();
$ del \u003d imap_delete ($ my_box, $ m);
mail ($ email, $ add_sbj, $ add_text, $ headers);
}
elseif ($ subj \u003d\u003d "NEPLATIŤ") (
mysql_query ( „ODSTRÁNIŤ Z tabuľky WHERE email \u003d $ my_email“);
$ del \u003d imap_delete ($ my_box, $ m);
mail ($ email, $ del_sbj, $ del_text, $ hlavičky);
}
inak (
$ del \u003d imap_delete ($ open_box, $ m);
mail ($ email, $ err_sbj, $ err_text, $ hlavičky);
}
}
$ clear \u003d imap_expunge ($ my_box);
}
?>

Jedným z možných použití funkcie imap je vytvorenie poštového démona, ktorý bude spravovať prihlásenie a odhlásenie používateľov z vášho zoznamu adries. Na splnenie tejto úlohy sa v zoznamoch adries zvyčajne používajú dve metódy. Prvý predpokladá, že používateľ musí prejsť na určitú stránku a potvrdiť svoje akcie, druhý vyžaduje zaslanie listu. Druhá tiež vyžaduje, aby skript obslužného programu pravidelne spúšťal cron daemon-om. Z tohto dôvodu nie je taký populárny ako prvá metóda.

Ako však vidíte, najvážnejšie poštové zásielky používajú druhú metódu. Preto, ak máte možnosť použiť cron, použite ho.

V skutočnosti nie je ťažké porozumieť funkciám. Pri analýze hlavičiek písmen, ktoré skript spracuje, môžu nastať určité ťažkosti.

Nie je ťažké prísť s algoritmom fungovania samotného skriptu. Démon nadviaže spojenie s poštovým serverom a skontroluje na ňom správy. Ak neexistujú žiadne písmená, skript prestane fungovať. Ak existujú písmená, sú analyzované hlavičky prvého písmena. Polia od a predmet sa vyhľadajú. Ak pole predmetu obsahuje jednu z dvoch platných možností hlavičky (prihlásiť sa na odber alebo odhlásiť sa z odberu), potom sa záznam, ktorý zodpovedá hodnote poľa from, stane aktívnym (potvrdeným) alebo sa odstráni z tabuľky. V obidvoch prípadoch sa na adresu uvedenú v poli od odošle príslušné oznámenie o akciách skriptu. Potom je písmeno označené na odstránenie. Ak predmet neobsahuje platné témy, odošle sa chybové hlásenie a e-mail je tiež označený na odstránenie. Potom sa skript presunie na ďalší e-mail. Po dokončení analýzy všetkých písmen vyprázdni schránku.

Na otvorenie schránky sa používa funkcia imap_open. Pretože PHP podporuje niekoľko protokolov, musíte explicitne určiť, ktorý protokol sa použije pre prácu so schránkou. V našom prípade sa jedná o pop3 na porte 110 (štandardne). Výsledok vykonania skriptu priradíme k premennej $ my_box.

$ my_box \u003d imap_open ("(you.pop.host/pop3:110)", "prihlásenie", "heslo");

Neskôr uvidíte, že táto premenná sa použije takmer vo všetkých funkciách imap. Ďalej skontrolujeme poštovú schránku, či neobsahuje listy. Kontrola sa vykonáva funkciou imap_num_msg.

$ n \u003d imap_num_msg ($ my_box);

Vo výsledku bude premenná $ n obsahovať počet správ v poštovej schránke. Toto číslo môže byť väčšie alebo rovné nule (ak je políčko prázdne). Ak existujú písmená, potom v slučke while tieto písmená rozoberieme a postupne zvyšujeme počet písmen o jedno. Upozorňujeme, že prvé písmeno v poštovej schránke bude mať číslo 0, rovnako ako prvý prvok v poli. Na zvýšenie počtu písmen priradíme premennej $ m hodnotu 0 a potom ju v podmienkach vykonania slučky zvýšime o jeden $ m ++.

Na analýzu hlavičiek, ktoré nás zaujímajú, stačia dve funkcie: imap_header a imap_fetch_overview. Na vyplnenie každého z nich musíte okrem políčka uviesť aj písmeno. V našom prípade sa vo vnútri slučky bude rovnať premennej $ m.

imap_header vráti ako výsledok vykonania objekt obsahujúci komplexné informácie o hlavičke správy. Tento objekt okrem iného obsahuje pole z, ktoré obsahuje štyri hodnoty. Jedná sa o osobné, adl, poštové schránky a hostiteľa. Nás zaujíma iba poštová schránka a hostiteľ. Ak ich nahradíme, dostaneme adresu, z ktorej bol list odoslaný.

$ h \u003d imap_header ($ my_box, $ m); $ h \u003d $ h-\u003e z; foreach ($ h ako $ k \u003d\u003e $ v) ($ poštová schránka \u003d $ v-\u003e poštová schránka; $ host \u003d $ v-\u003e hostiteľ; $ personal \u003d $ v-\u003e osobný; $ email \u003d $ poštová schránka. "@". $ hostiteľ;

imap_fetch_overview - umožní nám zistiť predmet listu. Na rovnaké účely sa dá použiť aj imap_header, ale z mnohých dôvodov to niekedy nemusí fungovať. Z poľa, ktoré táto funkcia vráti, potrebujeme iba pole predmetu

$ s \u003d imap_fetch_overview ($ my_box, $ m); foreach ($ s ako $ k \u003d\u003e $ v) $ subj \u003d $ v-\u003e predmet;

Naše ďalšie akcie sa obmedzujú na ťahanie e-mailov z databázy, a ak sa tam nachádzajú, označte celý riadok týmto záznamom ako alebo ho odstráňte. Predpokladajme, že po vyplnení poštového formulára na stránke je predplatiteľovi priradený stav 0 a po potvrdení predplatného sa zmení na 1.

If ($ subj \u003d\u003d "subscribe") (mysql_query ("update subscribe set stat \u003d 1 where email \u003d $ my_email"); $ del \u003d imap_delete ($ my_box, $ m); mail ($ email, $ add_sbj, $ add_text , $ headers);) else if ($ subj \u003d\u003d "unsubscribe") (mysql_query ("delete from subscribe where email \u003d $ my_email"); $ del \u003d imap_delete ($ my_box, $ m); mail ($ email, $ del_sbj, $ del_text, $ headers);) else ($ del \u003d imap_delete ($ my_box, $ m); mail ($ email, $ err_sbj, $ err_text, $ headers);) po dokončení všetkých akcií skript poštovú schránku vymaže. $ clear \u003d imap_expunge ($ my_box);

Tento jednoduchý program je iba ukážkou toho, že v PHP nemôžete písať iba dynamicky sa meniace stránky, ale aj služby, ktoré používateľ vôbec nevidí.

Výpis celého programu okrem parametrov pre pripojenie k základni:

Zahrnúť "config.php"; // pripojenie k databáze $ my_box \u003d imap_open ("(you.pop.host/pop3:110)", "prihlásenie", "heslo"); $ n \u003d imap_num_msg ($ my_box); $ m \u003d 0; $ add_text \u003d "Ďakujeme vám za potvrdenie prihlásenia na odber"; $ add_sbj \u003d "pridali ste!"; $ del_text \u003d "Boli ste odstránení zo zoznamu adries."; $ del_sbj \u003d "vymazať zo zoznamu"; $ err_text \u003d "Je nám ľúto, ale táto schránka sa používa iba na správu zoznamu adries"; $ err_sbj \u003d "chyba"; $ headers \u003d "from: subscribe robot x-mailer: php4 content-type: text / plain; charset \u003d windows-1251"; if ($ n! \u003d 0) (while ($ m ++< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->od; foreach ($ h ako $ k \u003d\u003e $ v) ($ poštová schránka \u003d $ v-\u003e poštová schránka; $ host \u003d $ v-\u003e hostiteľ; $ personal \u003d $ v-\u003e osobný; $ email \u003d $ poštová schránka. "@". $ host; $ my_email \u003d mysql_escape_string ($ email);) foreach ($ s ako $ k \u003d\u003e $ v) $ subj \u003d $ v-\u003e predmet; if ($ subj \u003d\u003d "subscribe") (mysql_query ("update table set stat \u003d 1 where email \u003d $ my_email"); // print mysql_error (); $ del \u003d imap_delete ($ my_box, $ m); mail ($ email, $ add_sbj, $ add_text, $ headers);) else if ($ subj \u003d\u003d "unsubscribe") (mysql_query ("delete from table where email \u003d $ my_email"); $ del \u003d imap_delete ($ my_box, $ m) ; mail ($ email, $ del_sbj, $ del_text, $ hlavičky);) else ($ del \u003d imap_delete ($ open_box, $ m); mail ($ email, $ err_sbj, $ err_text, $ hlavičky);)) $ clear \u003d imap_expunge ($ my_box); )

V zozname chýbajú niektoré podrobnosti, napríklad možná konverzia z win na koi, opätovná kontrola poštovej schránky odosielateľa atď. To sú už funkčné excesy, ktoré môže ktokoľvek podľa potreby pridať.

Na druhý deň som dostal úlohu napísať malý modul PHP, ktorý mi umožní pracovať s prichádzajúcou poštou. Trochu som googlil a videl som, že jeden z protokolov mi na túto úlohu vyhovuje POP3 a IMAP.
Ale voľba bola zrejmá, že použijem IMAP, pretože je funkčnejší a modernejší ako protokol POP3.

Teraz som musel rýchlo prísť na to, ako pracovať s protokolmi IMAP, ako získavať listy z poštového servera Yandex / Google.

Pre pohodlnejšiu prácu som si vybral knižnicu PhpImap , pretože dokáže rýchlo a ľahko zrealizovať všetky úlohy, ktoré potrebujem.

Pripojenie k poštovému serveru.

Teraz, keď sme sa rozhodli pre výber protokolu a voľbu knižnice, pokúsime sa pripojiť k poštovému serveru.

Aby PHP mohlo plne pracovať s protokolom IMAP, musíte pripojiť rozšírenie php_imap.dll / imap.so v súbore php.ini.

Na začiatok sa pokúsime pripojiť k pošte Yandex, pretože som s ňou mal najmenšie problémy.

// Zahrnúť knižnice include ("/ phpImap / Mailbox.php"); include ("/ phpImap / IncomingMail.php"); // Pre pohodlie vytvorme konštanty pre pripojenie k poštovému serveru. define ("MAIL_IMAP_SERVER", "imap.yandex.ru"); define ("MAIL_IMAP_SERVER_PORT", 993); define ("MAIL_IMAP_LOGIN", ""); define ("MAIL_IMAP_PASS", "example_pass"); define ("MAIL_IMAP_PATH", "(" .MAIL_IMAP_SERVER. ":". MAIL_IMAP_SERVER_PORT. "/ imap / ssl) DORUČENÉ"); $ mailbox \u003d nová PhpImap \\ Mailbox (MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__); try ($ mailbox-\u003e getImapStream ();) catch (Exception $ e) (die ($ e-\u003e getMessage ());)

Ako vidíme konštruktor triedy Schránka má nasledujúce argumenty:

  • MAIL_IMAP_PATH - Obsahuje adresu servera (MAIL_IMAP_SERVER), port pripojenia (MAIL_IMAP_SERVER_PORT), typ pripojenia (imap) a ukazuje, že pripojenie bude šifrované (ssl). Po zložených zátvorkách označíme priečinok, do ktorého sa v tomto prípade pripojíme k prichádzajúcim správam (INBOX).
  • MAIL_IMAP_LOGIN - Poštová schránka, ku ktorej sa pripojíme.
  • MAIL_IMAP_PASS - Heslo (najčastejšie sa jedná o heslo k poštovej schránke).
  • __DIR__- Toto je cesta k priečinku, do ktorého sa budú ukladať prílohy a poštové správy.

Potom skontrolujeme, či bolo naše spojenie vytvorené pomocou metódy getImapStream () ak z nejakého dôvodu spojenie nie je vytvorené, potom aplikácia vyvolá výnimky z dôvodu neúspešného pripojenia.

Je dôležité vziať do úvahy skutočnosť, že v nastaveniach pošty Yandex ste mohli zakázať možnosť pripojenia pomocou protokolu IMAP.

Teraz si porovnajme pripojenie k Gmailu.

Definovať ("MAIL_IMAP_SERVER", "imap.gmail.com"); define ("MAIL_IMAP_SERVER_PORT", 993); define ("MAIL_IMAP_LOGIN", ""); define ("MAIL_IMAP_PASS", "example_pass"); define ("MAIL_IMAP_PATH", "(" .MAIL_IMAP_SERVER. ":". MAIL_IMAP_SERVER_PORT. "/ imap / ssl) DOPRAVA");

Ako vidíme, prakticky sa nelíši od predchádzajúceho pripojenia, ale s najväčšou pravdepodobnosťou pri pripojení k serveru dostanete výnimku.
Tento problém je spôsobený tým, že v Gmail IMAP je predvolene zakázaný... Môžete to povoliť v nastaveniach na karte Preposielanie a POP / IMAP v prístupe IMAP ⇒ Povoliť možnosť IMAP.

Po povolení protokolu IMAP potrebujeme vytvoriť heslo aplikácie... Aby sme ho vytvorili, musíme pre tento profil vykonať dvojfaktorovú autentizáciu. Potom ho môžete začať vytvárať. Keď vytvoríme nové heslo pre aplikáciu, budeme sa musieť pripojiť k serveru a zadať ho do konštanty MAIL_IMAP_PASS.

Upozorňujeme, že pri vytváraní hesla aplikácie sa pravdepodobne nebudete môcť pripojiť k serveru. Je to spôsobené tým, že toto heslo ešte nebolo úplne použité v službe Gmail, čo zvyčajne trvá 5 - 60 minút.

Načítavajú sa údaje

Po úspešnom pripojení môžeme vykonať požiadavku na príjem potných správ zo servera. Na to použijeme metódu searchMailBox (reťazec $ kritériá) čo je v podstate obal metódy imap_search... Tu je dôležité pochopiť, že argument $ kritéria je určitým kritériom pri hľadaní správ, ktoré potrebujeme, samotná metóda vracia identifikátory prvkov, ktoré nám budú neskôr užitočné pri získavaní podrobných informácií o poštovej správe.

$ mailsIds \u003d $ mailbox-\u003e searchMailBox ("ALL");

Ako ste už asi uhádli, tu dostávame všetky správy.
Teraz to skúsime zistiť pomocou ďalších rovnako dôležitých kritérií vyhľadávania:

// Všetky správy po dobu 3 dní. $ mailsIds \u003d $ mailbox-\u003e searchMailBox ("SINCE" ".date (" d-M-Y ", strtotime (" - 3 dni "))." ""); // Neprečítané správy za 3 dni. $ mailsIds \u003d $ mailbox-\u003e searchMailBox ("UNSEEN SINCE" ".date (" d-M-Y ", strtotime (" - 3 dni "))." ""); // Vyhľadajte správy s touto zhodou v hlavičke TEXT. $ mailsIds \u003d $ mailbox-\u003e searchMailBox ("TEXT" Newsletter ""); // Vyhľadajte správy s touto zhodou v hlavičke BODY. $ mailsIds \u003d $ mailbox-\u003e searchMailBox ("BODY" Informačná správa ""); // Vyhľadávanie podľa e-mailu odosielateľa. $ mailsIds \u003d $ mailbox-\u003e searchMailBox ("FROM" ""); // Prijímajte správy podľa HLAVY SUBJECT $ mailsIds \u003d $ mailbox-\u003e searchMailBox ("SUBJECT" Aktualizované pre váš telefón "");

Tento príklad poskytuje základné informácie o správnom používaní kritérií vyhľadávania.

Prijímanie informácií

Teraz, keď máme množstvo ID správ, sme pripravení ich spracovať:

// Získajte ID poslednej správy z poľa. $ id \u003d koniec ($ mailsIds); // Získajte inštanciu objektu triedy IncomingMail, ktorá obsahuje informácie o správe. $ mail \u003d $ mailbox-\u003e getMail ($ id); // Získajte súbory pripojené k tejto správe, ak nejaké sú. $ mail-\u003e getAttachments (); // Zobrazenie správ. echo $ mail-\u003e textHtml;

Bez problémov sme teda dostali správy z nášho listu a jeho príloh.

Pridané vlastnosti.

Táto knižnica obsahuje aj množstvo užitočných metód na pohodlnejšiu prácu s poštovými správami:

Správy ukladáme podľa jej ID.

$ poštová schránka-\u003e saveMail ($ id, $ id. ". eml");

Nastaviť správy ako neprečítané podľa ich ID.

$ poštová schránka-\u003e markMailAsUnread ($ id);

Nastaviť správy ako prečítané podľa ich ID.

$ poštová schránka-\u003e markMailAsRead ($ id);

Správu označíme jej id.

$ poštová schránka-\u003e markMailAsImportant ($ id);

Správy odstraňujeme podľa ich ID.


E-mail je najdôležitejším nástrojom na výmenu informácií a ak ho využívate na prácu, pravdepodobne ste narazili na situáciu: do pošty príde list, ktorý obsahuje údaje potrebné na spracovanie skriptom. Budeme hovoriť o pošte Yandex - v tomto článku sa s vami, milí čitatelia, podelím o moje skúsenosti so získavaním listov zo schránky, analyzujeme tiež možnosť, keď je v liste príloha - ako ju nájsť a prípadne stiahnuť pre ďalšie manipulácie ...

Sám som sa s týmto problémom stretol už dávno, a potom som s malými skúsenosťami s poštovými programami Yandex strávil veľa času a nervov na dosiahnutie požadovaného výsledku. Mojou prvou chybou bolo, že som ako mnoho vývojárov webu začal intenzívne hľadať podobné príklady v sieti, ale sám som nevyužil pomocníka (nápovedu) Yandex. Áno, sú tam užitočné informácie, aj keď ich je veľmi málo, ale sú dosť dôležité na napísanie tohto druhu skriptu (viac o tomto nižšie). V tom čase sa vyžadovalo napísanie scenára, ktorého podstatou bolo: list s cenníkom tovaru vo formáte xls prišiel zákazníkovi na poštu Yandex raz denne, bolo ho potrebné spracovať (rozobrať a porovnať s údajmi z databázy internetového obchodu a podľa výsledku čo - potom niekde aktualizovať, zakázať alebo povoliť).

Prvá vec, ktorú urobíme pred napísaním scenára, je načrtnutie nášho akčného plánu, ktorý bude pozostávať z deviatich bodov:

  1. Nakonfigurujme poštu tak, aby získala prístup prostredníctvom poštových protokolov;
  2. Poďme načrtnúť samotnú štruktúru aplikácie PHP a definovať kódovanie súborov;
  3. Zoznámime sa s poštovým protokolom IMAP a jeho možnosťami;
  4. Pripojme sa k pošte Yandex pomocou prihlasovacieho mena a hesla účtu a v tejto fáze sledujme chyby;
  5. Spracujeme hlavičku listu;
  6. Prijať a spracovať text listu;
  7. Získajte a uložte priložené súbory;
  8. Vizualizujeme si vykonanú prácu;
  9. Urobme závery.

Téma je dosť objemná, ale pokúsim sa podať všetko čo najkompaktnejšie a najrozumnejšie. Začnime.

Nastavenie pošty

Prejdite na svoju poštu a prejdite do nastavení, ako je to znázornené na snímke obrazovky nižšie:



Teraz sme v nastavení pošty prostredníctvom protokolov IMAP a POP3:


Tu mnohí uvidia obrázok ako na obrázku vyššie, ale narazil som na to a viackrát, keď bol prístup zakázaný. Preto, ak sú vaše nastavenia odlišné, začiarknite políčko ako na snímke obrazovky, hlavnou vecou pre nás je povolenie prístupu cez protokol IMAP.

Štruktúra aplikácie a kódovanie

V tomto príklade neprídeme so zložitou štruktúrou aplikácie, pretože to nie je potrebné, ale pridáme iba to, čo je potrebné (pracujem v editore Sublime Text):


  • tmp - priečinok, do ktorého nahráme prílohy z listu, ak existujú;
  • .htaccess - nastavenie na strane servera, ak máte server apache;
  • functions.php - tu pridáme naše funkcie;
  • main.css - súbor v štýle;
  • index.php - vstupný bod aplikácie;

Použijeme kódovanie UTF-8, a preto súbor .htaccess okamžite naplníme nasledujúcimi riadkami:

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

Protokol IMAP

Keď sa vrátime k prvému bodu, uvidíte, že s poštou Yandex môžete pracovať aj prostredníctvom protokolu POP3. Prečo teda práve IMAP? Z týchto dvoch protokolov je IMAP novší a alternatívny k POP3, preto má množstvo výhod (dajú sa študovať pomocou Wikipédie), v našom prípade však výber ovplyvnil iba fakt, že je novší. Osobne nevidím veľký rozdiel v tom, čo použiť na konkrétnu úlohu prijatia listu. Ak z nejakého dôvodu potrebujete použiť protokol POP3, potom pre neho budú fungovať aj všetky funkcie vzťahujúce sa na IMAP.

K pošte Yandex sa pripájame pomocou protokolu IMAP

Aby sme sa mohli pripojiť k pošte, musíme poznať tri parametre: prihlásenie do pošty, jej heslo a adresu poštového servera. Ak nie sú problémy s dvoma parametrami, potom druhý nájdete v Yandexe. O tomto (probléme, ktorý som mal) som písal vyššie a napísal som veľa príkladov v sieti, kde tretí parameter nie je správne zadaný, a predstavte si, že chyby sa vyskytujú už vo fáze pripojenia - to je prinajmenšom nepríjemné. Nebudem mlátiť okolo kríkov a okamžite poskytnem priamy odkaz na stránku Yandex - nastavenie poštových programov... Tu je skutočne potrebné sa pripojiť:


Teraz môžete prejsť priamo na samotný kód:

Hlavička ("Typ obsahu: text / html; charset \u003d utf-8"); error_reporting (0); require_once ("functions.php"); $ mail_login \u003d "yandex_mail"; $ mail_password \u003d "mail_password"; $ mail_imap \u003d "(imap.yandex.ru:993/imap/ssl)"; // Zoznam uvažovaných typov súborov $ mail_filetypes \u003d array ("MSWORD"); $ connection \u003d imap_open ($ mail_imap, $ mail_login, $ mail_password); if (! $ connection) (echo ("Chyba pri pripojení k e-mailu -". \u200b\u200b$ mail_login); ukončenie;) else ($ msg_num \u003d imap_num_msg ($ pripojenie); $ mails_data \u003d pole (); pre ($ i \u003d 1; $ i<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

V prvom rade dodatočne špecifikujeme kódovanie UTF-8 pomocou hlavičky a deaktivujeme zobrazovanie chýb. Zahŕňame súbor functions.php a špecifikujeme nastavenia, o ktorých sme hovorili vyššie. Do poľa $ mail_filetypes napíšeme formáty súborov, ktoré potrebujeme. Takže bolo rozhodnuté tak urobiť, aby sme odstránili nepotrebné odpadky a získali konkrétne súbory. Pripojenie k pošte sa vykonáva pomocou funkcie imap_open (), ktorá, ak je úspešná, vráti stream IMAP a ak zlyhá, vráti false (ale ak povolíte zobrazovanie chýb, nie je to tak). Prácu s vláknami ukončíme pomocou funkcie imap_close () odovzdaním indikátora spojenia. Medzi týmito dvoma funkciami je obvyklý podmienený operátor.

Ak je spojenie úspešné, pomocou imap_num_msg () zistíme počet písmen v pošte a pridáme pole, do ktorého vložíme všetky potrebné údaje zo streamu. Nasleduje cyklus, v ktorom bude každé písmeno osobitne spracované podľa jeho čísla (číslovanie pochádza od 1).

Spracovanie hlavičiek listov

Na získanie hlavičky správy použite funkciu imap_header (), ktorej druhým parametrom je číslo správy:

// Hlavička písmena $ msg_header \u003d imap_header ($ pripojenie, $ i);

V tejto fáze dostaneme objekt, z ktorého extrahujeme potrebné údaje a uložíme ich do poľa $ mails_data. Tu je príklad jedného z písmen:

Táto snímka obrazovky ukazuje, že všetky údaje sú duplikované, ale to nehrá špeciálnu úlohu, vytiahneme to, čo je pohodlnejšie. Oveľa dôležitejšie je kódovanie predmetného riadku. Môže to byť čokoľvek a tento okamih musí byť kontrolovaný. Rovnaká situácia je s telom listu a s priloženými súbormi.

$ mails_data [$ i] ["time"] \u003d čas ($ msg_header-\u003e MailDate); $ mails_data [$ i] ["date"] \u003d $ msg_header-\u003e MailDate; foreach ($ msg_header-\u003e až ako $ dáta) ($ mails_data [$ i] ["to"] \u003d $ data-\u003e poštová schránka. "@". $ data-\u003e hostiteľ;) foreach ($ msg_header-\u003e od ako $ data) ($ mails_data [$ i] ["from"] \u003d $ data-\u003e mailbox. "@". $ data-\u003e host;)

Do nášho poľa ukladáme: časovú pečiatku, dátum prijatia listu, e-mail príjemcu a odosielateľa a pokračujeme v prijímaní predmetu listu. Aby sme to dosiahli, musíme do nášho súboru functions.php najskôr pridať tri funkcie:

Funkcia check_utf8 ($ charset) (if (strtolower ($ charset)! \u003d "Utf-8") (return false;) return true;) funkcia convert_to_utf8 ($ in_charset, $ str) (návrat iconv (strtolower ($ in_charset), "utf-8", $ str);) funkcia get_imap_title ($ str) ($ mime \u003d imap_mime_header_decode ($ str); $ title \u003d ""; foreach ($ mime ako $ key \u003d\u003e $ m) (if (! check_utf8) ($ m-\u003e charset)) ($ title. \u003d convert_to_utf8 ($ m-\u003e charset, $ m-\u003e text);) else ($ title. \u003d $ m-\u003e text;)) vrátiť $ title;)

Názvy sú samy osebe a myslím si, že stojí za to vysvetliť iba poslednú funkciu. Vezme kódovaný reťazec a dekóduje ho pomocou imap_mime_header_decode (), ktorý vráti pole objektov, z ktorých každý má dve vlastnosti charset (kódovanie) a text (predmetový text). Potom je všetko jednoduché: kontrola kódovania v slučke, prevedieme ho na UTF-8 a lepíme tému do jednej hlavičky a vrátime ju.

Teraz sa vráťme k súboru index.php a vytiahnime posledný parameter:

$ mails_data [$ i] ["title"] \u003d get_imap_title ($ msg_header-\u003e predmet);

Týmto je dokončené spracovanie hlavičky listu.

Práca s telom listu

Pokračujeme v postupnom formovaní nášho poľa so spracovanými údajmi správy a teraz musíme na získanie tela použiť dve funkcie:

// Telo e-mailu $ msg_structure \u003d imap_fetchstructure ($ connection, $ i); $ msg_body \u003d imap_fetchbody ($ pripojenie, $ i, 1);

Prvá premenná $ msg_structure obsahuje štruktúru písmena - jedná sa o objekt, v ktorom nájdete veľa užitočných informácií, príklad časti tohto objektu je uvedený nižšie:

Čo je dôležité pre riešenie nášho problému:

  • typ - primárny typ tela listu, v závislosti od toho, čo nám príde poštou, sa môže pohybovať od 0 do 7 (každé číslo radí vlastný typ obsahu, ktorý je v tele listu);
  • encoding - kódovanie prenosu tela, pohybuje sa od 0 do 5 (0 - 7BIT, 1 - 8BIT, 2 - BINÁRNY, 3 - BASE64, 4 - KVÓTOVANÝ-TLAČ, 5 - INÝ);
  • parts - pole písmen, ktoré zodpovedá štruktúre objektu o jednu úroveň vyššie

Pozrime sa podrobnejšie na vlastnosť dielov. Prvá vec, ktorú treba povedať, je, že nulová bunka tohto poľa obsahuje informácie zodpovedajúce textu písmena a počnúc prvou - po priložené súbory. Typ je tiež špecifikovaný v každom objekte a v parametroch kódovania, a to explicitne aj implicitne.

Štruktúra písmena môže byť vnorená tak, ako sa vám páči, aspoň som mal prípady, keď dosiahol štyri alebo päť úrovní, takže aby sme ju otravovali, ako sa hovorí, v budúcnosti musíme napísať rekurzívnu funkciu.

Druhá funkcia imap_fetchbody () načíta konkrétnu časť e-mailu, najčastejšie v kódovanej podobe.

Teraz pridajme premennú, do ktorej uložíme spracovanú verziu tela správy:

$ body \u003d "";

Vráťme sa k nášmu súboru functions.php a napíšme rekurzívnu funkciu:

Funkcia recursive_search ($ structure) ($ encoding \u003d ""; if ($ structure-\u003e subtype \u003d\u003d "HTML" || $ structure-\u003e type \u003d\u003d 0) (if ($ structure-\u003e parameters-\u003e attribute \u003d\u003d " charset ") ($ charset \u003d $ structure-\u003e parameters-\u003e value;) return array (" encoding "\u003d\u003e $ structure-\u003e encoding," charset "\u003d\u003e strtolower ($ charset)," subtype "\u003d\u003e $ structure- \u003e podtyp);) else (if (isset ($ structure-\u003e parts)) (return recursive_search ($ structure-\u003e parts);) else (if ($ structure-\u003e parameters-\u003e attribute \u003d\u003d "charset") ($ charset \u003d $ structure-\u003e parameters-\u003e value;) return array ("encoding" \u003d\u003e $ structure-\u003e encoding, "charset" \u003d\u003e strtolower ($ charset), "subtype" \u003d\u003e $ structure-\u003e subtype);) ))

Funkcia recursive_search () berie jeden parameter - štruktúru písmena, kde postupne kontroluje vlastnosti a vyberá tri parametre: kódovanie, znaková sada, podtyp. Výstupným bodom z rekurzie je absencia vlastnosti častí nulovej bunky. Nie je tu nič zvláštne, čo by sa dalo vysvetliť, z kódu je podľa mňa zrejmé, čo sa deje a ako.

Pridajme ešte jednu funkciu na prevod tela písmena, ktorú budeme v budúcnosti potrebovať:

Funkcia structure_encoding ($ encoding, $ msg_body) (switch ((int) $ encoding) (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); break; prípad 1: $ body \u003d imap_8bit ($ msg_body); break; case 0: $ body \u003d $ msg_body; break; default: $ body \u003d ""; break;) vrátiť $ body ;)

$ recursive_data \u003d recursive_search ($ msg_structure); if ($ recursive_data ["encoding"] \u003d\u003d 0 || $ recursive_data ["encoding"] \u003d\u003d 1) ($ body \u003d $ msg_body;) if ($ recursive_data ["encoding"] \u003d\u003d 4) ($ body \u003d structure_encoding ($ recursive_data ["encoding"], $ msg_body);) if ($ recursive_data ["encoding"] \u003d\u003d 3) ($ body \u003d structure_encoding ($ recursive_data ["encoding"], $ msg_body);) if ($ recursive_data ["encoding"] \u003d\u003d 2) ($ body \u003d structure_encoding ($ recursive_data ["encoding"], $ msg_body);) if (! check_utf8 ($ recursive_data ["charset"]))) ($ body \u003d convert_to_utf8 ($ recursive_data ["charset"], $ msg_body);)

Po tom, čo sme dostali údaje z rekurzie, postupne skontrolujeme kódovanie prenosu a v závislosti od toho zavoláme funkciu structure_encoding () s príslušnými parametrami. V poslednom podmienenom operátore berieme do úvahy, že pracujeme v UTF-8 a ak po všetkých manipuláciách dostaneme niečo iné ako kódovanie, prekódujeme to.

Zostáva nakresliť čiaru:

$ mails_data [$ i] ["body"] \u003d base64_encode ($ body);

Telo listu môže obsahovať ako obyčajný text, tak aj značky HTML s vlastnými štýlmi. Kódujeme v BASE64, aby sa naše rozloženie nepokračovalo v vykresľovaní.

Priložené súbory

Tu sa plynulo dostávame na koniec písania našej žiadosti:

// Priložené súbory if (isset ($ msg_structure-\u003e parts)) (pre ($ j \u003d 1, $ f \u003d 2; $ j< count($msg_structure->časti); $ j ++, $ f ++) (if (in_array ($ msg_structure-\u003e parts [$ j] -\u003e subtype, $ mail_filetypes)) ($ mails_data [$ i] ["attachments"] [$ j] ["type"] \u003d $ msg_structure-\u003e parts [$ j] -\u003e subtype; $ mails_data [$ i] ["attachs"] [$ j] ["size"] \u003d $ msg_structure-\u003e parts [$ j] -\u003e bytes; $ mails_data [ $ i] ["prílohy"] [$ j] ["meno"] \u003d get_imap_title ($ msg_structure-\u003e diely [$ j] -\u003e parametre-\u003e hodnota); $ mails_data [$ i] ["prílohy"] [$ j] ["súbor"] \u003d structure_encoding ($ msg_structure-\u003e parts [$ j] -\u003e encoding, imap_fetchbody ($ connection, $ i, $ f)); file_put_contents ("tmp /". iconv ("utf-8" , "cp1251", $ mails_data [$ i] ["prílohy"] [$ j] ["meno"]), $ mails_data [$ i] ["prílohy"] [$ j] ["súbor"]))) ))

Kus zodpovedný za spracovanie priloženého súboru je oveľa menší a teraz - prečo tak. Princíp práce so súborom je podobný ako pri práci s telom e-mailu, len táto fáza začína jeho prítomnosťou v poli vlastnosti parts. Nezabudnite odfiltrovať nepotrebné a skontrolovať zoznam typov. Pomocou jednoduchej funkcie file_put_contents () uložíme náš súbor na náš server v priečinku tmp.

Chcem vidieť výsledok!

V priebehu práce sme vytvorili pole s údajmi $ mails_data a pre vizualizáciu s nimi už budeme priamo pracovať. V tomto článku som použil testovací list, ktorý som mal vo svojej pošte, pozrime sa, čo sme nakoniec dostali:


Takto by malo pole vyzerať, bohužiaľ, musel som obsah súboru z osobných dôvodov skryť. Prejdime teraz k nášmu označeniu HTML:

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

Yandex Mail (Doručené) |

Počet písmen:

žiadne písmená
$ mail):?\u003e
Časová značka:
Dátum:
Komu:
Od:
Téma:
Písmeno Base64:
Priložené súbory:
$ attach):?\u003e
Typ:
Veľkosť (bajty):
Názov:
Telo:


Nebudem sem pridávať štýly, pretože nakoniec nehrajú osobitnú úlohu:


A na serveri v priečinku tmp budete mať súbor.

Záver

Po dokončení všetkých krokov z článku dosiahnete požadovaný výsledok, ale všetko nie je také jednoduché, ako by sa mohlo zdať - sú tu úskalia, ktoré treba brať do úvahy. Pri písaní skriptu pre konkrétnu úlohu je potrebné sledovať kódovanie vo všetkých fázach, písmená môžu pochádzať z rôznych e-mailov, z ktorých každá môže mať svoje vlastné nuansy. Bude tiež dôležité vziať do úvahy, že pošta Yandex a ich dokumentácia sú pravidelne aktualizované, takže sa môžu objaviť rôzne podpoložky pre prácu s poštovými programami. To je pre mňa všetko, dúfam, že sa tento článok bude hodiť pri práci s verziou pošty Yandex nižšej úrovne.

Nemôžem dostať list s prílohou (
ak sa pošta posiela so súborom - ľubovoľným - text listu zmizne

pomôž mi prosím

Chápem ... ak prevádzate poštu z Yandexu do Yandexu, potom všetko funguje ...
ako na to prišiel
ale preto tento skript neprijíma okrem Wordu ani iné súbory, nie je to jasné ... je pri ňom riadok MSWORD, oddelený čiarkou, a vložte pdf a zhpg a png - číta a ukladá sa normálne iba slovo ... niečo také

Niektoré webové aplikácie môžu vyžadovať od používateľa konkrétny e-mail. V takom prípade môžeme napísať vlastný e-mailový kód SquirrelMail alebo Roundcube. Bez ohľadu na to, ktoré si vyberiete, bude užitočné vedieť, ako pracovať s poštou IMAP.

Ako pracovať s IMAP v PHP je popísané na dvoch stránkach. Prvá stránka obsahuje funkcie potrebné na pripojenie k poštovým serverom a na čítanie správ. Na druhej stránke si povieme niečo o práci s e-mailom, napríklad o mazaní správ, sťahovaní aplikácií atď.

Na demonštráciu funkčnosti sa použijú príklady kódu, ktoré možno použiť na spustenie skriptov natívneho poštového klienta.

Parametre URL pre volanie požadovaných funkcií:

  • func - typ požadovanej funkcie (napr .: čítanie e-mailov, prezeranie poštových schránok, mazanie správ)
  • priečinok - názov priečinka poštovej schránky, ktorý sa má pripojiť (napríklad: Doručená pošta, Odoslané položky, spam)
  • uid - jedinečný e-mailový identifikátor

K parametrom je možné pristupovať pomocou $ _GET a prepínačom je možné vyvolať príslušné akcie.

Pripojenie k serveru IMAP

Na nadviazanie spojenia so serverom IMAP používame funkciu imap_connect (), ako je uvedené nižšie:

Cesta správy, používateľské meno a heslo sú požadované parametre na pripojenie k serveru. O ďalších parametroch sa dozviete v príručke.

Cesta k poštovej schránke je reťazec, ktorý identifikuje server a port v zložených zátvorkách a určuje názov požadovaného poštového priečinka.

Tu je niekoľko riadkov pre priečinok Doručená pošta poštové služby:

  • Doručená pošta v Gmaile (imap.gmail.com: 993 / imap / ssl)
  • Yahoo (imap.mail.yahoo.com: 993 / imap / ssl) DORUČENÉ
  • AOL (imap.aol.com: 993 / imap / ssl) Doručená pošta

Niektoré servery nemajú povolené SSL. V takom prípade budete musieť reťazec „SSL“ vynechať. Ostatné servery môžu používať svoje vlastné certifikáty, v ktorých musíte povoliť „NOVALIDATE-CERT“.

Vďaka otvorenému pripojeniu k poštovému serveru sa teraz môžeme pozrieť na funkcie používané pri nasledujúcich činnostiach:

  • Zobrazenie zoznamu priečinkov poštovej schránky vo vašom e-mailovom účte
  • Zobraziť zoznam e-mailových správ v priečinku
  • Zobraziť obsah e-mailu autora

Priečinky e-mailov

Doručená pošta , Odoslané , Odpadky a Nevyžiadaná pošta - tieto priečinky sú viditeľné takmer v každom e-mailovom účte a používatelia si môžu často vytvárať svoje vlastné priečinky. Aby sme mohli prezerať správy v týchto priečinkoch, musíme zmeniť náš pripojovací reťazec. Napríklad skôr použite príkaz „INBOX“ v riadku cesty. Ak sa potrebujete pripojiť k priečinku so spamom, použite namiesto toho niečo ako „Spam“. Ale aj keď to môže byť uvedené ako Nevyžiadaná pošta na e-mailový účet, pri prezeraní cez e-mailového klienta sa skutočný názov priečinkov na pozadí môže líšiť. Pomocou nástroja imap_list () môžeme uviesť všetky dostupné priečinky v účte.

"; foreach ($ priečinky ako $ priečinok) ($ priečinok \u003d str_replace (" (imap.gmail..php? priečinok \u003d ". $ priečinok." & func \u003d pohľad "\u003e". $ priečinok. "„;) ozvena“";

Musíme odovzdať popisovač pripojenia získaný z imap_open () ako počiatočného parametra imap_list (). Musíme tiež prejsť cestou (bez priečinka, napr. „Doručená pošta“). Ako tretí parameter požadujte všetky dostupné priečinky.

Oznámenie o správe

Každý priečinok obsahuje zoznam dostupných e-mailových správ, takže sa pozrime, ako môžeme vytvoriť zoznam správ v našej doručenej pošte.

Najskôr musíte získať počet dostupných správ pomocou imap_num_msg (). Potom môžeme pomocou funkcie imap_header () získať informácie pre hlavičku každého príspevku.

Povedzme, že ak chceme posledných 20 e-mailov:

($ numMessages - 20); $ i--) ($ header \u003d imap_header ($ imap, $ i); $ fromInfo \u003d $ header-\u003e from; $ responseInfo \u003d $ header-\u003e response_to; $ details \u003d array ("fromAddr" \u003d\u003e (isset ($ fromInfo-\u003e mailbox) && isset ($ fromInfo-\u003e host))? $ fromInfo-\u003e mailbox. "@". $ fromInfo-\u003e host: "", "fromName" \u003d\u003e (isset ($ fromInfo-\u003e personal)) ? $ fromInfo-\u003e personal: "", "responseAddr" \u003d\u003e (isset ($ responseInfo-\u003e mailbox) && isset ($ responseInfo-\u003e host))? $ replyInfo-\u003e mailbox. "@". $ responseInfo-\u003e host : "", "responseName" \u003d\u003e (isset ($ responseTo-\u003e personal))? $ replyto-\u003e personal: "", "subject" \u003d\u003e (isset ($ header-\u003e subject))? $ header-\u003e subject : "", "udate" \u003d\u003e (isset ($ header-\u003e udate))? $ header-\u003e udate: ""); $ uid \u003d imap_uid ($ imap, $ i); echo "

    „; echo“
  • Od:". $ podrobnosti [" fromName "]; echo" ". $ details [" fromAddr "]."
  • „; echo“
  • Predmet: ". $ podrobnosti [" predmet "] ..php? priečinok \u003d". $ priečinok. „& uid \u003d“. $ uid ..php? priečinok \u003d ". $ priečinok." & uid \u003d ". $ uid." & func \u003d odstrániť "\u003e Odstrániť
  • „; echo“
"; }

$ Pripojenia Imap musia byť otvorené v správnom priečinku. Potom môžeme prejsť posledných 20 e-mailov pomocou počtu e-mailov prijatých imap_num_msg (). Odkaz a e-mailové číslo sa dostanú na adresu imap_header (), aby sa získali informácie o hlavičke, ktoré sa potom dajú prečítať ako zaujímavé informácie od odosielateľa, e-mailovej adresy, mena, subjektu atď.

Upozorňujeme, že e-mailové číslo celkového počtu správ nie je jedinečným identifikátorom správy. Ak máte vo svojej schránke 100 písmen, posledné číslo bude 100, predchádzajúce 99 a tak ďalej. Ak odstránite správu s číslom 100 a potom dostanete novú správu, jej číslo bude 100.

Ak chcete pokračovať v ďalších krokoch, musíte pre svoj e-mail získať jedinečný identifikátor. Každý e-mail má jedinečný identifikátor nazývaný UID, ktorý môžeme získať poskytnutím e-mailu. Funkcia čísla imap_uid () je jedinečná pre UID a časom sa nezmení.

Prezeranie obsahu správy

Čítanie e-mailov nie je v skutočnosti také ľahké ako predchádzajúce úlohy, takže musíte používať triedy pošty vyvinuté spoločnosťou Metul Coradia. Trieda pre náš príklad prispôsobila nasledujúce tri funkcie:

kódovanie) (prípad 3: návrat imap_base64 ($ text); prípad 4: návrat imap_qprint ($ text); predvolené nastavenie: návrat $ text;)) // viacdielne if ($ structure-\u003e type \u003d\u003d 1) (foreach ($ structure) -\u003e parts as $ index \u003d\u003e $ subStruct) ($ prefix \u003d ""; if ($ partNumber) ($ prefix \u003d $ partNumber. ".";) $ data \u003d get_part ($ imap, $ uid, $ mimetype, $ subStruct, $ prefix. ($ index + 1)); if ($ data) (return $ data;)))) return false; ) funkcia get_mime_type ($ structure) ($ primaryMimetype \u003d array ("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); if ($ structure -\u003e podtyp) (návrat $ primaryMimetype [(int) $ structure-\u003e type]. "/". $ structure-\u003e subtype;) návrat "TEXT / PLAIN";)

Funkcia GetBody () získava obsah e-mailu odovzdaním jeho identifikátora UID a IMAP. Vo vnútri funkcie voláme funkciu get_part () s typom obsahu ako text / HTML. Text obyčajného e-mailu sa číta oveľa ľahšie. Najprv sa teda pokúsime nájsť obsah HTML vo vnútri e-mailu.

Potom sme si prečítali e-mailovú štruktúru pomocou funkcie imap_fetchstructure (). Zmenili sme funkcie knižnice tak, aby používali UID namiesto neustáleho odovzdávania FT_UID.

Potom dostaneme typ MIME e-mailovej správy pomocou funkcie get_mime_type (). Existuje osem typov MIME vrátených touto funkciou ako celé čísla:

  • 0 - TEXT
  • 1 - VIACČASŤ
  • 2 - SPRÁVA
  • 3 - APLIKÁCIA
  • 4 - AUDIO
  • 5 - OBRÁZOK
  • 6 - VIDEO
  • 7 - INÉ

Návrat konvertujeme na skutočný typ MIME reťazca pomocou polí typu MIME.

Kompozitné správy môžu mať veľké množstvo podtypov, takže rekurzívne prechádzame všetky podtypy pomocou časti čísel a e-mail získame pomocou imap_fetchBody (), keď sa pomocou mime typu nájde ten správny.

Potom použijeme príslušnú dekódovaciu funkciu podľa kódovania typu správy a vrátime obsah. Kompletný zoznam dostupných typov kódovania:

  • 0 - 7 BIT
  • 1 - 8 BIT
  • 2 - BINÁRNY
  • 3 - ZÁKLAD64
  • 4 - KVÓTOVANÉ-TLAČIVÉ
  • 5 - INÉ

Záver

Dokončili sme kontrolu základných informácií o pripojení k serveru IMAP, zaradení správ do dostupných priečinkov a prečítaní obsahu e-mailovej správy. Na nasledujúcej stránke príspevku budem hovoriť o funkciách, ktoré je možné použiť na implementáciu ďalších funkcií poštového klienta, napríklad mazanie správ a manipulácia s prílohami.