Windows.  Vírusy.  Prenosné počítače.  internet.  Kancelária.  Verejné služby.  Vodiči


E-mail- je to najdôležitejší nástroj na výmenu informácií a ak ho používate na prácu, pravdepodobne ste sa stretli so situáciou: poštou príde list s údajmi potrebnými na spracovanie skriptom. Budeme hovoriť o pošte Yandex - v tomto článku sa s vami, milí čitatelia, podelím o moje skúsenosti s tým, ako dostať listy z poštovej schránky, pozrieme sa aj na možnosť, keď list obsahuje priložený súbor - ako to zistiť a prípadne si ho stiahnuť pre ďalšie manipulácie s ním.

Ja sám som čelil tomuto problému už dávno a potom, aj keď som mal málo skúseností s prácou s e-mailovými programami Yandex, strávil som veľa času a nervov, aby som dosiahol požadovaný výsledok. Mojou prvou chybou bolo, že ako mnoho webových vývojárov som začal intenzívne hľadať podobné príklady na internete, ale nepoužil som samotnú nápovedu Yandex. Áno, sú tam užitočné informácie, aj keď sú veľmi malé, ale sú dosť dôležité na napísanie tohto druhu skriptu (viac o tom nižšie). V tom čase bolo potrebné napísať skript, ktorého podstatou bolo: zákazníkovi bol raz denne odoslaný list s cenníkom tovaru vo formáte xls na Yandex mail, bolo ho treba spracovať (analyzovať a porovnať s údaje z databázy internetového obchodu a podľa výsledku potom niečo niekde aktualizovať, deaktivovať alebo povoliť).

A prvá vec, ktorú urobíme pred napísaním scenára, je načrtnúť náš akčný plán, ktorý bude pozostávať z deviatich bodov:

  1. Nakonfigurujme poštu na získanie prístupu cez poštové protokoly;
  2. Poďme si načrtnúť samotnú štruktúru PHP aplikácie a rozhodnúť o kódovaní súboru;
  3. Zoznámime sa s poštovým protokolom IMAP a jeho možnosťami;
  4. Pripojme sa k e-mailu Yandex pomocou prihlasovacieho mena a hesla vášho účtu a sledujte chyby v tejto fáze;
  5. Spracujeme hlavičku listu;
  6. Telo listu prijmeme a spracujeme;
  7. Prijímať a ukladať priložené súbory;
  8. Vizualizujte vykonanú prácu;
  9. Urobme závery.

Téma je dosť rozsiahla, ale pokúsim sa všetko podať čo najkompaktnejšie a najzrozumiteľnejšie. Začnime.

Nastavenia pošty

Prejdite do svojej pošty a prejdite na nastavenia, ako je znázornené na obrázku nižšie:



Teraz sme v nastaveniach pošty cez protokoly IMAP a POP3:


Tu mnohí uvidia obrázok ako na obrázku vyššie, ale neraz som sa stretol s zakázaním prístupu. Preto, ak sú vaše nastavenia odlišné, začiarknite políčka ako na obrázku, pre nás je hlavné povoliť prístup cez protokol IMAP.

Štruktúra aplikácie a jej kódovanie

V tomto príklade si nebudeme vymýšľať komplexná štruktúra aplikáciu, keďže nie je potrebná, ale doplníme len to potrebné (pracujem v editore Sublime Text):


  • tmp – priečinok, do ktorého stiahneme priložené súbory z listu, ak nejaké existujú;
  • .htaccess – nastavenie na strane servera, ak máte server apache;
  • function.php – sem pridáme naše funkcie;
  • main.css – súbor štýlu;
  • index.php – vstupný bod aplikácie;

Použijeme kódovanie UTF-8 a preto ihneď naplníme súbor .htaccess 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, môžete vidieť, že s poštou Yandex môžete pracovať aj prostredníctvom protokolu POP3. Prečo teda IMAP? Z týchto dvoch je IMAP novším a alternatívnym k POP3, preto má množstvo výhod (môžete si ich preštudovať pomocou Wikipédie), no v našom prípade výber ovplyvnilo len to, že je novší. Osobne nevidím veľký rozdiel, pod čo použiť konkrétnu úlohu prijímanie listu. Ak z nejakého dôvodu potrebujete použiť protokol POP3, potom budú fungovať všetky funkcie, ktoré sa vzťahujú na IMAP.

Pripojenie k pošte Yandex pomocou protokolu IMAP

Aby sme sa mohli pripojiť k pošte, potrebujeme poznať tri parametre: prihlásenie k pošte, jej heslo a adresu poštový server. Ak nie sú žiadne problémy s dvoma parametrami, potom druhý nájdete v pomocníkovi Yandex. O tomto (problém, ktorý sa mi vyskytol) som napísal vyššie a napísal som veľa príkladov online, kde je tretí parameter zadaný nesprávne a predstavte si, že chyby sa vyskytujú už vo fáze pripojenia - to je prinajmenšom nepríjemné. Nebudem sa obchádzať a okamžite dám priamy odkaz na stránku Yandex - nastavenie poštové programy . Tu je presne to, čo potrebujeme na pripojenie:


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

Hlavička("Typ obsahu: text/html; charset=utf-8"); error_reporting(0); require_once("functions.php"); $mail_login = "yandex_mail"; $mail_password = "heslo_mailu"; $mail_imap = "(imap.yandex.ru:993/imap/ssl)"; // Zoznam typov súborov, ktoré sa berú do úvahy $mail_filetypes = array("MSWORD"); $pripojenie = imap_open($mail_imap, $mail_login, $mail_password); if(!$connection)( echo("Chyba pri pripájaní k pošte - ".$mail_login); exit; )else( $msg_num = imap_num_msg($connection); $mails_data = array(); for($i = 1; $ i<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

V prvom rade dodatočne špecifikujeme kódovanie UTF-8 pomocou hlavičky a zakážeme zobrazovanie chýb. Pripojíme súbor functions.php a špecifikujeme nastavenia diskutované vyššie. V poli $mail_filetypes špecifikujeme formáty súborov, ktoré potrebujeme. Rozhodlo sa to urobiť s cieľom odstrániť nepotrebný odpad a získať konkrétne súbory. Pripojenie k pošte sa uskutočňuje pomocou funkcie imap_open(), ktorá v prípade úspechu vráti prúd IMAP a v prípade neúspešnosti vráti hodnotu false (ak však povolíte zobrazovanie chýb, nie je to tak). Prácu s prúdmi ukončíme pomocou funkcie imap_close() tak, že jej odovzdáme indikátor pripojenia. Medzi týmito dvoma funkciami existuje pravidelný podmienený príkaz.

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 umiestnime všetky potrebné údaje zo streamu. Nasleduje cyklus, v ktorom bude každé písmeno spracované podľa svojho čísla (číslovanie začína od 1) samostatne.

Spracovanie hlavičky listu

Ak chcete získať hlavičku písmena, musíte použiť funkciu imap_header(), ktorej druhým parametrom je číslo písmena:

// Hlavička listu $msg_header = imap_header($spojenie, $i);

V tejto fáze dostaneme objekt, z ktorého vytiahneme 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 nehrá to osobitnú úlohu, používame to, čo je pohodlnejšie. Oveľa dôležitejšie je kódovanie predmetu listu. Môže to byť čokoľvek a tento moment treba ovládať. Rovnaká situácia platí pre telo listu a priložené súbory.

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

Do nášho poľa uložíme: časovú pečiatku, dátum prijatia listu, e-mail príjemcu a odosielateľa a pristúpime k prijatiu predmetu listu. Aby sme to dosiahli, musíme do súboru functions.php najskôr pridať tri funkcie:

Funkcia check_utf8($charset)( if(strtolower($charset) != "utf-8")( return false; ) return true; ) funkcia convert_to_utf8($in_charset, $str)( return iconv(strtolower($in_charset), "utf-8", $str ) funkcia get_imap_title($str)( $mime = imap_mime_header_decode($str); $title = ""; foreach($mime ako $key => $m)( if(!check_utf8); ($m->charset))( $title .= convert_to_utf8($m->charset, $m->text); )else( $title .= $m->text; ) ) return $title )

Názvy sú samovysvetľujúce a myslím, že stojí za to vysvetliť iba poslednú funkciu. Vyžaduje zakódovaný reťazec a na jeho dekódovanie používa imap_mime_header_decode(), výsledkom čoho je pole objektov, z ktorých každý má dve vlastnosti: znakovú sadu a text. Potom je všetko jednoduché: skontrolovať kódovanie v slučke, previesť ho na UTF-8 a zlúčiť tému do jednej hlavičky a vrátiť ju.

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

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

Týmto sa dokončí spracovanie hlavičky e-mailu.

Práca s telom listu

Pokračujeme v postupnom vytváraní nášho poľa zo spracovaných údajov listu a teraz, aby sme získali telo, musíme použiť dve funkcie:

// Telo emailu $msg_structure = imap_fetchstructure($connection, $i); $msg_body = imap_fetchbody($spojenie, $i, 1);

Prvá premenná $msg_structure obsahuje štruktúru písmena - ide o objekt, v ktorom nájdete hmotu užitočné informácie, príklad časti tohto objektu je uvedený nižšie:

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

  • typ – primárny typ tela listu, v závislosti od toho, čo k nám prichádza poštou, sa môže meniť od 0 do 7 (každé číslo označuje svoj vlastný typ obsahu, ktorý sa nachádza v tele listu);
  • kódovanie – kódovanie prenosu tela, mení sa od 0 do 5 (0 - 7 BIT, 1 - 8 BIT, 2 - BINARY, 3 - BASE64, 4 - CUTOVANÉ-PRINTABLE, 5 - INÉ);
  • časti – pole častí písmen, ktoré zodpovedá štruktúre objektu na vyššej úrovni.

Pozrime sa bližšie na vlastnosti dielov. Prvá vec, ktorú je potrebné povedať, je, že v nulovej bunke tohto poľa sú informácie, ktoré presne zodpovedajú textu listu, a počnúc prvým - k pripojeným súborom. V každom objekte je tiež uvedený typ a v parametroch je kódovanie uvedené explicitne a implicitne.

Štruktúra písmena môže byť ľubovoľne vnorená, aspoň som mal prípady, keď dosiahla štyri alebo päť úrovní, takže aby sme to rozdelili, ako sa hovorí, budeme musieť v budúcnosti napísať rekurzívnu funkciu.

Druhá funkcia imap_fetchbody() načíta konkrétnu časť správy, najčastejšie v zakódovanej podobe.

Teraz pridáme premennú, do ktorej uložíme spracovanú verziu tela listu:

$body = "";

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

Funkcia recursive_search($structure)( $kódovanie = ""; if($structure->subtype == "HTML" || $structure->type == 0)( if($structure->parameters->attribute == " charset")( $charset = $structure->parameters->value; ) return array("encoding" => $structure->encoding, "charset" => strtolower($charset), "subtype" => $structure- >subtype )else( if(isset($structure->parts))( return recursive_search($structure->parts); )else( if($structure->parameters->attribute == "charset")( $). charset = $structure->parameters->value ) return array("encoding" => $structure->encoding, "charset" => strtolower($charset), "subtype" => $structure->subtype ) ) )

Funkcia recursive_search() preberá jeden parameter – štruktúru písmena, kde postupne kontroluje vlastnosti a získava tri parametre: kódovanie, znakovú sadu, podtyp. Výstupný bod z rekurzie je absencia vlastnosti súčiastok s bunkou nula. Tu už nie je čo vysvetľovať, myslím, že z kódu je jasné, čo sa deje a ako.

Pridajme ešte jednu funkciu na konverziu tela listu, ktorú budeme potrebovať neskôr:

Funkcia structure_encoding($kódovanie, $msg_body)( switch((int) $kódovanie)( prípad 4: $body = imap_qprint($msg_body); zlom; prípad 3: $body = imap_base64($msg_body); zlom; prípad 2: $body = imap_binary($msg_body 1: $body = imap_8bit ;

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

Po prijatí dát 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 podmienený operátor Berieme do úvahy, že pracujeme v UTF-8 a ak po všetkých manipuláciách dostaneme iné kódovanie, znova ho zakódujeme.

Zostáva nakresliť čiaru:

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

Telo listu môže obsahovať bežný text aj značenie HTML s vlastnými štýlmi. Kódujeme v BASE64, takže počas vizualizácie sa naše rozloženie nezmení.

Priložené súbory

Tu sa postupne blížime ku koncu písania našej prihlášky:

// Pripojené súbory if(isset($msg_structure->parts))( for($j = 1, $f = 2; $j< count($msg_structure->časti); $j++, $f++)( if(in_array($msg_structure->časti[$j]->podtyp, $mail_filetypes))( $mails_data[$i]["attachs"][$j]["type"] = $msg_structure->časti[$j]->podtyp $mails_data[$i]["attachs"][$j]["size"] = $msg_structure->časti[$j]->bajty[; ]["attachs"][$j]["name"] = get_imap_title($msg_structure->časti[$j]->parameters->value[$i]["attachs"][$ j]); ["file"] = structure_encoding($msg_structure->časti[$j]->kódovanie, 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"]) ) )

Časť zodpovedná za spracovanie priloženého súboru je oveľa menšia a teraz - prečo je to tak. Princíp práce so súborom je podobný práci s telom listu, len túto fázu začíname tým, že ho máme v poli vlastností parts. Nezabudnite odfiltrovať nepotrebné skontrolovaním zoznamu typov. Pomocou jednoduchej funkcie file_put_contents() uložíme náš súbor na náš server do priečinka tmp.

Chcem vidieť výsledok!

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


Približne takto by malo vyzerať vaše pole, žiaľ, obsah súboru som musel z osobných dôvodov skryť. Teraz prejdime k nášmu značeniu HTML:

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

Yandex Mail (Doručená pošta) |

Počet písmen:

žiadne písmená
$mail):?>
Časová pečiatka:
dátum:
Komu:
Od:
Predmet:
Písmeno so základom 64:
Priložené súbory:
$attach):?>
Typ:
Veľkosť (v bajtoch):
meno:
Telo:


Štýly sem nebudem pridávať, pretože nakoniec nehrajú špeciálnu ú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ť - existujú úskalia, ktoré je potrebné vziať do úvahy. Pri písaní skriptu pre konkrétnu úlohu musíte sledovať kódovanie vo všetkých fázach, písmená môžu pochádzať z rôznych e-mailových účtov, z ktorých každý môže mať svoje vlastné nuansy. Je tiež dôležité vziať do úvahy, že pošta Yandex a ich dokumentácia sa pravidelne aktualizujú, takže pre prácu s poštovými programami sa môžu objaviť rôzne podpoložky. To je pre mňa všetko, dúfam, že tento článok vám bude užitočný pri práci s nižšou verziou pošty Yandex.

Nedá sa prijať e-mail s prílohou (
ak je pošta odoslaná so súborom - ľubovoľným súborom - potom text listu zmizne

Pomôžte prosím

Je to jasné... ak prenesiete poštu z Yandexu do Yandexu, všetko funguje...
nejako na to prišiel
ale nie je jasné, prečo tento skript neakceptuje iné súbory okrem Wordu... vedľa je riadok MSWORD oddelený čiarkou a dať pdf a zhpg a png - iba Word normálne číta a ukladá.... niečo takéto

Jedným z možných použití funkcií imap je vytvorenie poštového démona, ktorý bude riadiť, ako sa používatelia prihlasujú a odhlasujú z vášho zoznamu adresátov. Na splnenie tejto úlohy sa v korešpondencii 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 obsluhy pravidelne spúšťal cron daemon-om. Z tohto dôvodu nie je taká populárna ako prvá metóda.

Ako však vidíte, najzávažnejšie korešpondencie používajú druhú metódu. Ak teda máte možnosť použiť cron, využite ho.

Pochopenie funkcií v skutočnosti nie je ťažké. Niektoré problémy môžu nastať pri analýze hlavičiek písmen, ktoré skript spracuje.

Algoritmus pre samotný skript nie je ťažké vymyslieť. Démon vytvorí spojenie s poštovým serverom a skontroluje na ňom správy. Ak tam nie sú žiadne písmená, skript prestane fungovať. Ak existujú písmená, analyzujú sa hlavičky prvého písmena. Pozerajú sa polia od a predmet. Ak pole predmetu obsahuje jednu z dvoch platných možností hlavičky (prihlásiť sa alebo zrušiť odber), záznam, ktorý sa zhoduje s hodnotou poľa from, sa buď stane aktívnym (potvrdeným), alebo sa z tabuľky odstráni. V oboch prípadoch sa na adresu zadanú v poli od odošle zodpovedajúce oznámenie o akciách skriptu. Potom je písmeno označené na vymazanie. Ak predmet neobsahuje platné témy, odošle sa upozornenie na chybu a list sa označí aj na vymazanie. Skript potom prejde na ďalší e-mail. Po pretriedení všetkých listov vyčistí poštovú schránku.

Na otvorenie poštovej schránky sa používa funkcia imap_open. Keďže PHP podporuje prácu s viacerými protokolmi, je potrebné výslovne uviesť, ktorý protokol sa používa na prácu so schránkou. V našom prípade ide o pop3 na porte 110 (štandard). Výsledok vykonania skriptu priradíme do premennej $my_box.

$my_box = imap_open("(you.pop.hostiteľ/pop3:110)", "login", "heslo");

Neskôr uvidíte, že táto premenná sa bude používať prakticky vo všetkých funkciách imap. Ďalej skontrolujeme poštovú schránku na listy. Kontrolu vykonáva funkcia imap_num_msg.

$n = imap_num_msg($my_box);

Výsledkom je, že premenná $n bude obsahovať počet písmen v poštovej schránke. Toto číslo môže byť väčšie ako nula alebo sa mu môže rovnať (ak je políčko prázdne). Ak existujú písmená, potom v slučke while analyzujeme písmená a postupne zvyšujeme číslo písmena o jedno. Upozorňujeme, že prvé písmeno v poštovej schránke bude očíslované 0, rovnako ako prvý prvok poľa. Ak chcete zvýšiť číslo písmena, priraďte premennej $m hodnotu 0 a potom ju za podmienok cyklu zvýšte o jeden $m++.

Na analýzu hlavičiek, ktoré nás zaujímajú, stačia dve funkcie: imap_header a imap_fetch_overview. Na dokončenie každého z nich musíte okrem poštovej schránky uviesť aj číslo listu. V našom prípade sa vo vnútri cyklu bude rovnať premennej $m.

imap_header vráti objekt obsahujúci komplexné informácie o hlavičke správy ako výsledok vykonania. Tento objekt okrem iného obsahuje pole from, ktoré obsahuje štyri hodnoty. Sú to osobné, adl, poštová schránka a hostiteľ. Z nich nás zaujíma iba poštová schránka a hostiteľ. Ich nahradením získame adresu, z ktorej bol list odoslaný.

$h = imap_header($my_box, $m); $h = $h->od; foreach ($h ako $k => $v) ( $mailbox = $v->mailbox; $hostiteľ = $v->hostiteľ; $personal = $v->personal; $email = $mailbox . "@" . $hostiteľ;

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

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

Naše ďalšie kroky sa obmedzujú na vytiahnutie e-mailu z databázy, a ak tam je, označte celý riadok s týmto záznamom ako alebo ho odstráňte. Predpokladajme, že po vyplnení poštového formulára na stránke je účastníkovi priradený stav 0 a po potvrdení odberu sa zmení na 1.

If ($subj == "subscribe") ( mysql_query("update subscribe set stat=1 where email=$my_email"); $del = imap_delete($my_box, $m); mail($email, $add_sbj, $add_text , $headers ) else if ($subj == "odhlásiť") ( mysql_query("odstrániť z odberu, kde email = $môj_e-mail"); $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 dokončení všetkých akcií skript vymaže poštová schránka.

$clear = imap_expunge($my_box);

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

Výpis celého programu okrem parametrov na pripojenie k databáze:< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->od; foreach ($h ako $k =>$v) ( $mailbox = $v->mailbox; $hostiteľ = $v->hostiteľ; $personal = $v->personal; $email = $mailbox . "@" . $hostitel; $môj_e-mail = mysql_escape_string($email pre každý ($s ako $k =>$v) $subj = $v->predmet; if ($subj == "prihlásiť sa") ( mysql_query("aktualizovať tabuľku setu stat=1 kde email=$my_email"); //tlač mysql_error(); $del = imap_delete($my_box, $m); mail($ email, $add_sbj, $add_text, $headers ) else if ($subj == "zrušiť odber") ( mysql_query("odstrániť z tabuľky, kde email = $môj_e-mail"); $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); )

Vo výpise chýbajú niektoré detaily, ako prípadná konverzia z win na koi, dvojitá kontrola schránky odosielateľa atď. To sú už funkčné doplnky, ktoré si každý môže doplniť podľa potreby.

Jedným z možných použití funkcií imap je vytvorenie poštového démona, ktorý bude riadiť, ako sa používatelia prihlasujú a odhlasujú z vášho zoznamu adresátov. Na splnenie tejto úlohy sa v korešpondencii 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 obsluhy pravidelne spúšťal démon cron?om. Z tohto dôvodu nie je taká populárna ako prvá metóda.

Ako však vidíte, najzávažnejšie korešpondencie používajú druhú metódu. Ak teda máte možnosť použiť crond, využite ju.

Pochopenie funkcií v skutočnosti nie je také ťažké. Osoba, ktorá predtým pracovala pre PHP, ľahko pochopí, ako s nimi pracovať.

Niektoré problémy môžu nastať pri analýze hlavičiek písmen, ktoré skript spracuje.
Ak existujú písmená, analyzujú sa hlavičky prvého písmena. Pozerajú sa polia od a predmet. Ak pole predmetu obsahuje jednu z dvoch platných možností hlavičky (prihlásiť sa alebo zrušiť odber), záznam, ktorý sa zhoduje s hodnotou poľa from, sa buď stane aktívnym (potvrdeným), alebo sa z tabuľky odstráni. V oboch prípadoch sa na adresu zadanú v poli od odošle zodpovedajúce oznámenie o akciách skriptu.
Potom je písmeno označené na vymazanie. Ak predmet neobsahuje platné témy, odošle sa upozornenie na chybu a list sa označí aj na vymazanie. Skript potom prejde na ďalší e-mail.

Po pretriedení všetkých listov vyčistí poštovú schránku.


Nebudem čitateľa nudiť vývojovými diagramami, takže poďme rovno k veci. Na otvorenie poštovej schránky sa používa funkcia imap_open. Keďže PHP podporuje prácu s viacerými protokolmi, je potrebné výslovne uviesť, ktorý protokol sa používa na prácu so schránkou.

V našom prípade ide o POP3 na porte 110 (štandard). Výsledok vykonania skriptu priradíme do premennej $my_box.

Neskôr uvidíte, že táto premenná sa bude používať prakticky vo všetkých funkciách imap. Ďalej skontrolujeme poštovú schránku na listy.
Kontrolu vykonáva funkcia imap_num_msg.
$n = imap_num_msg($my_box);

Výsledkom je, že premenná $n bude obsahovať počet písmen v poštovej schránke. Toto číslo môže byť väčšie ako nula alebo sa mu môže rovnať (ak je políčko prázdne).

Ak existujú písmená, potom v slučke while analyzujeme písmená a postupne zvyšujeme číslo písmena o jedno.


Upozorňujeme, že prvé písmeno v poštovej schránke bude očíslované 0, rovnako ako prvý prvok poľa.
Ak chcete zvýšiť číslo písmena, priraďte premennej $m hodnotu 0 a potom ju za podmienok cyklu zvýšte o jeden $m++.
Na analýzu hlavičiek, ktoré nás zaujímajú, stačia dve funkcie: imap_header a imap_fetch_overview. Na dokončenie každého z nich musíte okrem poštovej schránky uviesť aj číslo listu. V našom prípade sa vo vnútri cyklu bude rovnať premennej $m.
Imap_header vracia objekt obsahujúci komplexné informácie o hlavičke správy ako výsledok vykonania. Tento objekt okrem iného obsahuje pole from, ktoré obsahuje štyri hodnoty. Sú to osobné, adl, poštová schránka a hostiteľ. Z nich nás zaujíma iba poštová schránka a hostiteľ.
Ich nahradením získame adresu, z ktorej bol list odoslaný.
$h = $h -> od ;
$email = $mailbox . ? @ ¬ . $hostiteľ ;

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


foreach ($s ako $k => $v ) (
$subj = $v -> predmet ;
}

Naše ďalšie kroky sa obmedzujú 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 účastníkovi priradený stav 0 a po potvrdení odberu sa zmení na 1.

if ($subj == "SUBSCRIBE" ) (
mysql_query( "AKTUALIZOVAŤ odber SET stat=1 WHERE email=$my_email");

}
mysql_query( "VYMAZAŤ Z odberu WHERE email = $my_email");
$del = imap_delete ($my_box, $m);
}
inak(
$del = imap_delete ($my_box, $m);
}

ako je uvedené vyššie, po dokončení všetkých akcií skript vymaže poštovú schránku.


Tento najjednoduchší program je len ukážkou toho, že pomocou PHP sa dajú písať nielen dynamicky sa meniace stránky, ale aj služby, ktoré používateľ vôbec nevidí. Samozrejme, pokiaľ ide o písanie skriptov pre shell, PHP nie je použiteľné, na rozdiel od jeho konkurenta Perl, ale napriek tomu...

Výpis celého programu okrem parametrov pripojenia k databáze (db.php):

vrátane "db.php" ;
$my_box = imap_open ("(you.pop.host/pop3:110)" , "login" , "heslo" );
$n = imap_num_msg($my_box);
$m = 0;
$add_text = "

Ďakujeme za potvrdenie vášho odberu“ ;
$add_sbj = "Pridali ste!" ;
$del_text = "

Ľutujeme, ale táto poštová schránka sa používa
len pre administráciu pošty“ ;
$err_sbj = "Chyba" ;
$headers = "Od: Robot na odber

X-mailer: PHP4

Content-type: text/plain; znaková sada=UTF-8
" ;
if($n != 0 ) (
pričom($m++< $n ) {
$h = imap_header($my_box, $m);
$s = imap_fetch_overview ($my_box, $m);
Upozorňujeme, že prvé písmeno v poštovej schránke bude očíslované 0, rovnako ako prvý prvok poľa.
foreach ($h ako $k => $v ) (
Imap_header vracia objekt obsahujúci komplexné informácie o hlavičke správy ako výsledok vykonania. Tento objekt okrem iného obsahuje pole from, ktoré obsahuje štyri hodnoty. Sú to osobné, adl, poštová schránka a hostiteľ. Z nich nás zaujíma iba poštová schránka a hostiteľ.
Ich nahradením získame adresu, z ktorej bol list odoslaný.
$h = $h -> od ;
$email = $mailbox . "@". $hostiteľ ;
$my_email = mysql_escape_string($email);
}
foreach ($s ako $k => $v ) (
$subj = $v -> predmet ;
}
if ($subj == "SUBSCRIBE" ) (
mysql_query( "UPDATE table SET stat=1 WHERE email=$my_email");
//print mysql_error();
$del = imap_delete ($my_box, $m);
mail ($email, $add_sbj, $add_text, $headers);
}
elseif ($subj == "ZRUŠIŤ ODBER" ) (
mysql_query( "DELETE FROM table WHERE email = $my_email");
$del = imap_delete ($my_box, $m);
mail ($email, $del_sbj, $del_text, $headers);
}
inak(
$del = imap_delete ($open_box, $m);
mail ($email, $err_sbj, $err_text, $headers);
}
}
$clear = imap_expunge($my_box);
}
?>

Nedávno som dostal úlohu napísať malý modul v PHP, ktorý by mi umožnil pracovať s prichádzajúcou poštou. Po menšom googlovaní som videl, že mi na túto úlohu vyhovuje jeden z protokolov POP3 A IMAP.
Ale voľba bola jasná: použil by som IMAP, pretože je funkčnejší a modernejší ako protokol POP3.

Teraz som potreboval rýchlo zistiť, ako pracovať s protokolmi IMAP, ako prijímať listy z poštového servera Yandex / Google.

Pre pohodlnejšiu prácu som zvolil knižnicu PhpImap, pretože dokáže rýchlo a jednoducho realizovať všetky úlohy, ktoré potrebujem.

Pripojenie k poštovému serveru.

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

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

Najprv sa pokúsme pripojiť k pošte Yandex, pretože som s tým mal najmenej problémov.

//Include libraries include("/phpImap/Mailbox.php"); include("/phpImap/IncomingMail.php"); //Pre pohodlie vytvorím konštanty na 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)INBOX"); $mailbox = novy PhpImap\Mailbox(MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__); try ( $mailbox->getImapStream(); ) catch (Exception $e) ( die($e->getMessage()); )

Ako vidíme konštruktor triedy Poštová 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 označuje, že pripojenie bude šifrované (ssl). Za zloženými zátvorkami uvádzame priečinok, ku ktorému sa pripojíme, v tomto prípade 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 je to heslo z poštovej schránky).
  • __DIR__- Toto je cesta k priečinku, do ktorého sa budú ukladať priložené súbory a e-mailové správy.

Potom skontrolujeme, či bolo naše spojenie vytvorené prostredníctvom metódy getImapStream() ak sa spojenie z nejakého dôvodu nevytvorí, aplikácia vyvolá výnimky s dôvodom neúspešného spojenia.

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

Teraz porovnajme pripojenie k Gmailu.

Define("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)INBOX");

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

Potom, čo sme povolili prácu cez protokol IMAP, potrebujeme vytvoriť aplikáciu pre heslo. Aby mohol byť vytvorený, musíme pre tento profil vykonať dvojfaktorovú autorizáciu. Potom ho môžete začať vytvárať. Keď vytvoríme nové heslo pre aplikáciu, budeme ho musieť zadať do konštanty MAIL_IMAP_PASS, aby sme sa mohli pripojiť k serveru.

Upozorňujeme, že pri vytváraní hesla aplikácie sa možno nebudete môcť pripojiť k serveru, je to spôsobené tým, že toto heslo ešte nebolo definitívne pridané do služby Gmail, zvyčajne to trvá 5 až 60 minút.

Vzorkovanie údajov

Po úspešnom pripojení môžeme požiadať o príjem správ zo servera. Na to použijeme metódu searchMailBox(reťazec $criteria) čo je v podstate obal metódy imap_search

. Tu je dôležité pochopiť, že argument $criteria je určitým kritériom na vyhľadávanie správ, ktoré potrebujeme, samotná metóda vracia identifikátory prvkov, ktoré sa nám neskôr budú hodiť na získanie podrobných informácií o poštovej správe.

$mailsIds = $mailbox->searchMailBox("VŠETKY");
Ako ste možno uhádli, tu dostávame všetky správy.

//Všetky správy na 3 dni. $mailsIds = $mailbox->searchMailBox("OD ".dátum("d-M-Y",strtotime("-3 dni"))."""); //Neprečítané správy 3 dni. $mailsIds = $mailbox->searchMailBox("NEVIDITE SA OD ".date("d-M-Y",strtotime("-3 dni"))."""); //Vyhľadajte správy s touto zhodou v hlavičke TEXT. $mailsIds = $mailbox->searchMailBox("TEXT "Newsletter""); //Vyhľadajte správy s touto zhodou v hlavičke BODY. $mailsIds = $mailbox->searchMailBox("TELO "Informačná správa""); //Vyhľadávanie podľa e-mailu odosielateľa. $mailsIds = $mailbox->searchMailBox("OD " ""); //Prijímanie správ podľa názvu SUBJECT $mailsIds = $mailbox->searchMailBox("SUBJECT "Pre váš telefón boli vydané aktualizácie"");

Tento príklad poskytuje dobrý prehľad základov používania kritérií vyhľadávania.

Získavanie informácií

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

//Získanie identifikátora poslednej správy z poľa. $id = end($mailsIds); //Získajte inštanciu objektu triedy IncomingMail, ktorý obsahuje informácie o správe. $mail = $mailbox->getMail($id); //Priložte súbory k tejto správe, ak nejaký existuje. $mail->getAttachments(); //Výstup správ. echo $mail->textHtml;

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

Ďalšie funkcie.

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

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

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

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

$mailbox->markMailAsUnread($id);

Nastavíme správy ako čítané podľa ich ID.

$mailbox->markMailAsRead($id);

Správu označíme jej id.

$mailbox->markMailAsImportant($id);

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

Niektoré webové aplikácie môžu od používateľa vyžadovať špeciálny e-mail. V tomto prípade môžeme napísať vlastný emailový kód SquirrelMail alebo Roundcube. Bez ohľadu na to, čo si vyberiete, bude užitočné vedieť, ako používať poštu IMAP.

Ako pracovať s IMAP v PHP je popísané na dvoch stranách. Na prvej stránke sú potrebné funkcie pre pripojenie k poštovým serverom a čítanie správ. Na druhej strane si povieme niečo o práci s emailom, napríklad mazanie správ, sťahovanie aplikácií atď...

Na demonštráciu funkčnosti sa použijú príklady kódu, ktoré možno použiť na spustenie vlastných skriptov e-mailového klienta.

Parametre adresy URL na volanie potrebných funkcií:

  • func – typ potrebnej funkcie (napríklad: čítanie e-mailov, zobrazenie poštovej schránky, odstránenie správy)
  • priečinok - názov priečinka poštovej schránky, ktorý sa má pripojiť (napríklad: Doručená pošta, Odoslaná pošta, spam)
  • uid – jedinečný e-mailový identifikátor

Parametre je možné získať pomocou $_GET a prepínač je možné použiť na volanie príslušných akcií.

Pripojenie k serveru IMAP

Na vytvorenie pripojenia k serveru IMAP používame funkciu imap_connect(), ako je uvedené nižšie:

Cesta k správe, používateľské meno a heslo sú nevyhnutné parametre na pripojenie k serveru. O ďalších možnostiach 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 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 Gmail (imap.gmail.com: 993/imap/ssl).
  • Yahoo (imap.mail.yahoo.com: 993/imap/ssl) INBOX
  • Doručená pošta AOL (imap.aol.com: 993/imap/ssl).

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

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

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

E-mailové priečinky

Doručená pošta , Odoslané , Odpadky A Spam- Tieto priečinky sú viditeľné takmer v každom e-mailovom účte a používatelia si často môžu vytvárať vlastné priečinky. Aby sme mohli zobraziť správy v týchto priečinkoch, musíme zmeniť reťazec pripojenia. Napríklad predtým použite „INBOX“ na paneli cesty. Ak sa potrebujete pripojiť k priečinku nevyžiadanej pošty, použite namiesto toho niečo ako „Spam“. Ale aj keď to môže byť uvedené ako Spam do e-mailového účtu, pri prezeraní cez e-mailového klienta sa skutočné názvy priečinkov na pozadí môžu líšiť. Všetky existujúce priečinky v účte môžeme zobraziť pomocou imap_list() .

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

Rukoväť pripojenia získaná pomocou imap_open() musíme odovzdať ako počiatočný parameter do imap_list() . Musíme tiež odovzdať cestu (bez priečinka, napríklad "INBOX"). Tretím parametrom je požiadavka na všetky dostupné priečinky.

Upozornenie na správu

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.

Najprv musíte získať počet dostupných správ pomocou imap_num_msg() . Potom môžeme použiť funkciu imap_header() na získanie informácií o hlavičke každej správy.

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

($numMessages - 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->personal: "", "replyAddr" => (isset($replyInfo->mailbox) && isset($replyInfo->host)) ? " => (isset($replyTo->personal)) ? $replyto->personal: "", "subject" => (isset($header->subject)) $header->subject : "", "udate" => (isset($header->udate)) ? $header->udate: ""); $uid = imap_uid($imap, $i ");

    "; echo"
  • Od:" . $details["fromName"]; echo " " . $details["fromAddr"] ."
  • "; echo"
  • Predmet:" . $details["predmet"] ..php?folder=" . $folder. "&uid=" . $uid ..php?folder=" . $folder . "&uid=" . $uid . "&func=delete">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 pomocou imap_num_msg() . Odkaz a e-mailové číslo sa pridelia funkcii imap_header() na získanie informácií v hlavičke, ktoré sa potom dajú interpretovať ako zaujímavé informácie od odosielateľa, e-mailovej adresy, mena, predmetu atď.

Upozorňujeme, že e-mailové číslo z celkového počtu správ nie je jedinečným identifikátorom správy. Ak máte v schránke 100 e-mailov, posledné číslo bude 100, predchádzajúce 99 atď. Ak vymažete správu číslo 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, funkcie pre číslo imap_uid() UID je jedinečné a časom sa nezmení.

Zobraziť obsah správy

Čítanie e-mailov v skutočnosti nie je také jednoduché ako predchádzajúce úlohy, takže musíte použiť triedy pošty vyvinuté spoločnosťou Mitul Koradia. Trieda prispôsobuje nasledujúce tri funkcie pre náš príklad nižšie:

kódovanie) ( case 3: return imap_base64($text); case 4: return imap_qprint($text); default: return $text; ) ) // multipart if ($structure->type == 1) ( foreach ($structure ->časti ako $index => $subStruct) ( $prefix = ""; if ($partNumber) ( $prefix = $partNumber . "."; ) $data = get_part($imap, $uid, $mimetype, $ subStruct, $prefix . ($index + 1)); if ($data) ( return $data; ) ) ) return false; ) funkcia get_mime_type($structure) ( $primaryMimetype = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); if ($structure ->podtyp) ( return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype; ) return "TEXT/PLAIN" ;

Funkcia GetBody() načíta obsah e-mailu odovzdaním jeho pripojenia UID a IMAP. Vo vnútri funkcie voláme funkciu get_part() s typom obsahu ako text/HTML. E-mail s obyčajným textom sa číta oveľa ľahšie. Najprv sa teda pokúsime nájsť obsah HTML vo vnútri e-mailu.

Následne si prečítame štruktúru emailu pomocou funkcie imap_fetchstructure(). Zmenili sme funkcie knižnice tak, aby používali UID namiesto neustáleho odovzdávania FT_UID.

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

  • 0 – TEXT
  • 1 – VIACPART
  • 2 – SPRÁVA
  • 3 – APLIKÁCIA
  • 4 – AUDIO
  • 5 – OBRÁZOK
  • 6 – VIDEO
  • 7 – INÉ

Premeníme návrat na skutočný MIME typ reťazca pomocou polí MIME typov.

Viacdielne správy môžu mať veľký počet podtypov, takže rekurzívne prechádzame všetkými podtypmi pomocou časti čísel a e-mail získavame pomocou imap_fetchBody(), keď sa pomocou mime-type 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. Úplný zoznam dostupných typov kódovania:

  • 0 – 7 BIT
  • 1 – 8 BIT
  • 2 – BINÁRNY
  • 3 – ZÁKLAD64
  • 4 – TLAČITEĽNÉ
  • 5 – INÉ

Záver

Dokončili sme preskúmanie základov pripojenia k serveru IMAP, výpis správ v dostupných priečinkoch a dokončili sme čítanie obsahu e-mailovej správy. Na ďalšej strane záznamu si povieme o funkciách, ktoré možno použiť na implementáciu dodatočných funkcií e-mailového klienta, napríklad mazanie správ a spracovanie príloh.



Ak si všimnete chybu, vyberte časť textu a stlačte Ctrl+Enter
ZDIEĽAŤ: