Php kupokea barua pepe. kazi za barua pepe ya imap katika PHP. Kufanya kazi na mwili wa barua


Barua pepe ni chombo muhimu zaidi cha kubadilishana habari, na ikiwa unatumia kwa kazi, labda umekutana na hali: barua inakuja kwa barua, ambayo ina data muhimu kwa usindikaji kwa mwanzo. Tutazungumza juu ya barua ya Yandex - katika nakala hii nitashiriki nanyi, wasomaji wapendwa, uzoefu wangu wa jinsi ya kupata barua kutoka kwa sanduku la barua, tutaangalia pia chaguo wakati barua ina faili iliyoambatanishwa - jinsi ya kuigundua. na mwishowe uipakue kwa udanganyifu zaidi nayo.

Mimi mwenyewe nilikabiliwa na tatizo hili muda mrefu uliopita, na kisha, ingawa nilikuwa na uzoefu mdogo wa kufanya kazi na programu za barua pepe za Yandex, nilitumia muda mwingi na mishipa kufikia matokeo yaliyohitajika. Kosa langu la kwanza lilikuwa kwamba, kama watengenezaji wengi wa wavuti, nilianza kutafuta sana mifano kama hiyo kwenye mtandao, lakini sikutumia msaada wa Yandex yenyewe. Ndio, kuna habari muhimu huko, ingawa ni ndogo sana, lakini ni muhimu kutosha kuandika aina hii ya maandishi (zaidi juu ya hii hapa chini). Wakati huo, ilikuwa ni lazima kuandika hati, kiini chake ambacho kilikuwa: barua iliyo na orodha ya bei ya bidhaa katika muundo wa xls ilitumwa kwa barua ya mteja ya Yandex mara moja kwa siku, ilibidi kusindika (kuchanganuliwa na kulinganishwa na). data kutoka kwa hifadhidata ya duka la mtandaoni na, kulingana na matokeo, kitu kisha sasisha mahali fulani, zima au kuwezesha).

Na jambo la kwanza tutakalofanya kabla ya kuandika hati ni kuelezea mpango wetu wa utekelezaji, ambao utakuwa na pointi tisa:

  1. Wacha tusanidi barua ili kupata ufikiaji kupitia itifaki za barua;
  2. Wacha tuonyeshe muundo wa programu ya PHP na tuamue juu ya usimbuaji wa faili;
  3. Wacha tufahamiane na itifaki ya barua ya IMAP na uwezo wake;
  4. Hebu tuunganishe barua ya Yandex kwa kutumia kuingia kwa akaunti yako na nenosiri na kufuatilia makosa katika hatua hii;
  5. Wacha tuchakate kichwa cha barua;
  6. Tutapokea na kushughulikia mwili wa barua;
  7. Pokea na uhifadhi faili zilizoambatishwa;
  8. Taswira ya kazi iliyofanywa;
  9. Hebu tufanye hitimisho.

Mada ni nyepesi sana, lakini nitajaribu kuwasilisha kila kitu kwa uwazi na kwa uwazi iwezekanavyo. Tuanze.

Mipangilio ya barua

Nenda kwa barua yako na uende kwa mipangilio, kama inavyoonyeshwa kwenye picha ya skrini hapa chini:



Sasa tuko kwenye mipangilio ya barua kupitia itifaki za IMAP na POP3:


Hapa, wengi wataona picha kama kwenye picha hapo juu, lakini nimekutana, zaidi ya mara moja, wakati ufikiaji umezimwa. Kwa hivyo, ikiwa mipangilio yako ni tofauti, angalia visanduku kama kwenye picha ya skrini; kwetu, jambo kuu ni kuruhusu ufikiaji kupitia itifaki ya IMAP.

Muundo wa maombi na usimbuaji wake

Katika mfano huu, hatutakuja na muundo tata wa programu, kwani hauhitajiki, lakini tutaongeza tu kile kinachohitajika (Ninafanya kazi katika hariri ya maandishi ya Sublime):


  • tmp - folda ambayo tutapakua faili zilizounganishwa kutoka kwa barua, ikiwa ipo;
  • .htaccess - kuanzisha sehemu ya seva, ikiwa una seva ya apache;
  • function.php - tutaongeza kazi zetu hapa;
  • main.css - faili ya mtindo;
  • index.php - mahali pa kuingilia maombi;

Tutatumia usimbaji wa UTF-8 na kwa hivyo kujaza faili ya .htaccess mara moja na mistari ifuatayo:

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

Itifaki ya IMAP

Kurudi kwenye hatua ya kwanza, unaweza kuona kwamba unaweza pia kufanya kazi na barua ya Yandex kupitia itifaki ya POP3. Kwa hivyo kwa nini IMAP? Kati ya hizo mbili, IMAP ni mpya na mbadala kwa POP3, kwa hivyo ina faida kadhaa (unaweza kuzisoma kwa kutumia Wikipedia), lakini kwa upande wetu uchaguzi uliathiriwa tu na ukweli kwamba ni mpya zaidi. Binafsi, sioni tofauti kubwa katika kile cha kutumia kwa kazi maalum ya kupokea barua. Ikiwa kwa sababu fulani unahitaji kutumia itifaki ya POP3, basi kazi zote zinazotumika kwa IMAP zitaifanyia kazi.

Kuunganisha kwa barua ya Yandex kwa kutumia itifaki ya IMAP

Ili kuunganisha kwa barua, tunahitaji kujua vigezo vitatu: kuingia kwa barua, nenosiri lake na anwani ya seva ya barua. Ikiwa hakuna matatizo na vigezo viwili, basi ya pili inaweza kupatikana kwa msaada wa Yandex. Niliandika juu ya hili (shida iliyotokea kwangu) hapo juu na kuandika kwenye mtandao mifano mingi ambapo paramu ya tatu imeainishwa vibaya na, fikiria, kwamba makosa yanatokea tayari kwenye hatua ya unganisho - hii ni, kwa kiwango cha chini, haifurahishi. . Sitapiga kichaka na mara moja nitatoa kiunga cha moja kwa moja kwa ukurasa wa Yandex - kuanzisha programu za barua pepe. Hapa ndivyo tunahitaji kuunganisha:


Sasa unaweza kwenda moja kwa moja kwa nambari yenyewe:

Kichwa("Aina ya Maudhui: maandishi/html; charset=utf-8"); kuripoti_kosa(0); need_once("functions.php"); $mail_login = "yandex_mail"; $mail_password = "mail_password"; $mail_imap = "(imap.yandex.ru:993/imap/ssl)"; // Orodha ya aina za faili zilizozingatiwa $mail_filetypes = safu("MSWORD"); muunganisho wa $ = imap_open($mail_imap, $mail_login, $mail_password); if(!$connection)( echo("Hitilafu ya kuunganisha kwa barua - ".$mail_login); toka; ) vinginevyo( $msg_num = imap_num_msg($connection); $mails_data = safu(); kwa($i = 1; $ i<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

Kwanza kabisa, tunataja kwa kuongeza usimbuaji wa UTF-8 kwa kutumia kichwa na kuzima onyesho la makosa. Tunaunganisha faili ya function.php na kutaja mipangilio iliyojadiliwa hapo juu. Katika safu ya $mail_filetypes tunabainisha fomati za faili tunazohitaji. Iliamuliwa kufanya hivyo ili kuondoa takataka zisizohitajika na kupokea faili maalum. Muunganisho kwa barua unafanywa kwa kutumia imap_open() chaguo za kukokotoa, ambazo, ikifaulu, hurejesha mkondo wa IMAP, na isipofaulu, hurejesha uwongo (lakini ukiwezesha onyesho la hitilafu, sivyo ilivyo). Tunamaliza kufanya kazi na mito kwa kutumia imap_close() kazi kwa kuipitisha kiashiria cha uunganisho. Kati ya kazi hizi mbili kuna taarifa ya kawaida ya masharti.

Ikiwa muunganisho umefanikiwa, kwa kutumia imap_num_msg() tunapata idadi ya barua kwenye barua na kuongeza safu ambayo tutaweka data zote muhimu kutoka kwa mkondo. Inayofuata inakuja mzunguko ambao kila herufi itachakatwa na nambari yake (idadi inaanza kutoka 1) kando.

Inachakata kichwa cha barua

Ili kupata kichwa cha barua, unahitaji kutumia imap_header() kazi, parameta ya pili ambayo ni nambari ya barua:

// Kijajuu cha barua $msg_header = imap_header(muunganisho wa $, $i);

Katika hatua hii, tutapokea kitu ambacho tutatoa data tunayohitaji, na kuihifadhi katika safu ya data ya $mails. Hapa kuna mfano wa moja ya barua:

Picha hii ya skrini inaonyesha kuwa data zote zimerudiwa, lakini hii haina jukumu maalum, tunatumia kile ambacho ni rahisi zaidi. Muhimu zaidi ni usimbaji wa mstari wa somo la barua. Inaweza kuwa chochote na wakati huu lazima udhibitiwe. Hali hiyo inatumika kwa mwili wa barua na faili zilizounganishwa.

$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->boxbox."@".$data->host; )

Tunahifadhi katika safu yetu: muhuri wa muda, tarehe ya kupokea barua, barua pepe ya mpokeaji na mtumaji na kuendelea kupokea mada ya barua. Ili kufanya hivyo, tunahitaji kwanza kuongeza vitendaji vitatu kwenye faili ya function.php:

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

Majina yanajieleza na nadhani inafaa kuelezea kazi ya mwisho tu. Inachukua mfuatano uliosimbwa na hutumia imap_mime_header_decode() ili kusimbua, na kusababisha safu ya vitu, kila moja ikiwa na sifa mbili: charset na maandishi. Kisha kila kitu ni rahisi: kuangalia encoding katika kitanzi, kubadilisha kwa UTF-8 na kuunganisha mada kwenye kichwa kimoja na kuirejesha.

Sasa hebu turejee kwenye faili ya index.php na tutoe kigezo cha mwisho:

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

Hii inakamilisha uchakataji wa kichwa cha barua pepe.

Kufanya kazi na mwili wa barua

Tunaendelea kuunda safu yetu hatua kwa hatua na data iliyochakatwa ya barua na sasa ili kupata mwili tunahitaji kutumia kazi mbili:

// Mwili wa barua pepe $msg_structure = imap_fetchstructure($connection, $i); $msg_body = imap_fetchbody(muunganisho wa $, $i, 1);

Tofauti ya kwanza $msg_structure ina muundo wa herufi - hii ni kitu ambacho unaweza kupata habari nyingi muhimu, mfano wa sehemu ya kitu hiki umewasilishwa hapa chini:

Ni nini muhimu kutatua shida yetu:

  • aina - aina ya msingi ya mwili wa barua, kulingana na kile kinachokuja kwetu kwa barua, inaweza kutofautiana kutoka 0 hadi 7 (kila namba inaonyesha aina yake ya maudhui ambayo iko katika mwili wa barua);
  • usimbaji - usimbaji wa kuhamisha mwili, hutofautiana kutoka 0 hadi 5 (0 - 7BIT, 1 - 8BIT, 2 - BINARY, 3 - BASE64, 4 - QUOTED-PRINTABLE, 5 - OTHER);
  • sehemu - safu ya sehemu za barua zinazofanana na muundo wa kitu katika ngazi ya juu.

Wacha tuangalie kwa karibu mali ya sehemu. Jambo la kwanza ambalo linahitaji kusema ni kwamba katika seli ya sifuri ya safu hii kuna habari inayofanana hasa na maandishi ya barua, na kuanzia ya kwanza - kwa faili zilizounganishwa. Pia, katika kila kitu aina imeonyeshwa na katika vigezo encoding inaonyeshwa kwa uwazi na kwa uwazi.

Muundo wa barua unaweza kuwekwa kama unavyotaka, angalau nilikuwa na kesi wakati ilifikia viwango vinne au tano, kwa hivyo ili kuivunja, kama wanasema, tutahitaji kuandika kazi ya kujirudia katika siku zijazo.

Chaguo za kukokotoa za pili imap_fetchbody() huchota sehemu mahususi ya ujumbe, mara nyingi katika fomu iliyosimbwa.

Sasa hebu tuongeze kigezo ambacho tutahifadhi toleo lililochakatwa la mwili wa barua:

$mwili = "";

Wacha turudi kwenye faili ya function.php na tuandike kazi ya kujirudia:

Function recursive_search($structure)( $encoding = ""; if($structure->subtype == "HTML" || $structure->aina == 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); ) ))

Kazi ya recursive_search() inachukua kigezo kimoja - muundo wa herufi, ambapo inakagua mali kwa mpangilio na kupata vigezo vitatu: encoding, charset, subtype. Njia ya kutoka kutoka kwa urejeshaji ni kutokuwepo kwa mali ya sehemu na sifuri ya seli. Hakuna zaidi ya kuelezea hapa; nadhani ni wazi kutoka kwa kanuni kile kinachotokea na jinsi gani.

Wacha tuongeze kazi moja zaidi ili kubadilisha mwili wa barua, ambayo tutahitaji baadaye:

Usimbaji wa muundo_wa kazi($usimbaji, $msg_body)( switch((int) $encoding)( kesi ya 4: $body = imap_qprint($msg_body); break; kesi ya 3: $body = imap_base64($msg_body); break; kesi 2: $body = imap_binary($msg_body); break; case 1: $body = imap_8bit($msg_body); break; case 0: $body = $msg_body; break; default: $body = ""; break; ) rudisha $body ;)

$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);)

Baada ya kupokea data kutoka kwa urejeshaji, tunaangalia hatua kwa hatua usimbaji wa uhamishaji na, kulingana na hili, piga kazi ya muundo_encoding() na vigezo vinavyofaa. Katika mwendeshaji wa mwisho wa masharti, tunazingatia kuwa tunafanya kazi katika UTF-8 na ikiwa baada ya upotovu wote tunapata usimbaji tofauti, tutausimba tena.

Inabakia kuchora mstari:

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

Mwili wa herufi unaweza kuwa na maandishi ya kawaida na alama za HTML zenye mitindo yake. Tunasimba katika BASE64 ili wakati wa taswira mpangilio wetu hautabadilika.

Faili zilizoambatishwa

Hapa tunakaribia mwisho wa kuandika maombi yetu hatua kwa hatua:

// Faili zilizoambatishwa if(isset($msg_structure->parts))( for($j = 1, $f = 2; $j< count($msg_structure->sehemu); $j++, $f++)( ikiwa(katika_array($msg_structure->sehemu[$j]->aina ndogo, $mail_filetypes))( $mails_data[$i]["attachs"][$j]["type"] = $msg_structure->sehemu[$j]->aina ndogo; $mails_data[$i]["attachs"][$j]["size"] = $msg_structure->sehemu[$j]->baiti; $mails_data[ $i]["attachs"][$j]["name"] = get_imap_title($msg_structure->sehemu[$j]->vigezo->thamani); $mails_data[$i]["attachs"][$ j]["faili"] = structure_encoding($msg_structure->parts[$j]->encoding, imap_fetchbody($connection, $i, $f)); file_put_contents("tmp/".iconv("utf-8" , "cp1251", $mails_data[$i]["attachs"][$j]["name"]), $mails_data[$i]["attachs"][$j]["file"]);) ))

Kipande kinachohusika na usindikaji faili iliyoambatanishwa ni ndogo zaidi, na sasa - kwa nini hii ni hivyo. Kanuni ya kufanya kazi na faili ni sawa na kufanya kazi na mwili wa barua, tu tunaanza hatua hii kwa kuwa nayo katika sehemu za safu ya mali. Usisahau kuchuja zisizo za lazima kwa kuangalia orodha ya aina. Kwa kutumia kazi rahisi ya file_put_contents(), tunahifadhi faili yetu kwenye seva yetu kwenye folda ya tmp.

Nataka kuona matokeo!

Katika mchakato wa kazi, tumeunda safu na data ya $mails_data, na kwa taswira tayari tutafanya kazi nayo moja kwa moja. Katika nakala hii nilitumia barua ya jaribio ambayo ilikuwa kwenye barua yangu, wacha tuone tulipata nini mwishoni:


Hivi ndivyo safu yako inavyopaswa kuonekana, kwa bahati mbaya, ilibidi nifiche yaliyomo kwenye faili kwa sababu za kibinafsi. Sasa hebu tuendelee kwenye lebo yetu ya HTML:

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

Barua ya Yandex (Kikasha) |

Idadi ya barua:

hakuna barua
$mail):?>
Muhuri wa saa:
Tarehe ya:
Kwa nani:
Kutoka:
Mada:
Barua katika msingi64:
Faili zilizoambatishwa:
$ ambatisha):?>
Aina:
Ukubwa (katika baiti):
Jina:
Mwili:


Sitaongeza mitindo hapa, kwani hawana jukumu maalum, mwishowe:


Na kwenye seva kwenye folda ya tmp utakuwa na faili.

Hitimisho

Baada ya kukamilisha hatua zote kutoka kwa kifungu, utafikia matokeo unayotaka, lakini kila kitu sio rahisi kama inavyoweza kuonekana - kuna mitego ambayo inahitaji kuzingatiwa. Wakati wa kuandika maandishi kwa kazi maalum, unahitaji kufuatilia usimbuaji katika hatua zote; barua zinaweza kutoka kwa akaunti tofauti za barua pepe, ambayo kila moja inaweza kuwa na nuances yake mwenyewe. Pia ni muhimu kuzingatia kwamba barua ya Yandex na nyaraka zao zinasasishwa mara kwa mara, hivyo vitu vidogo mbalimbali vya kufanya kazi na programu za barua vinaweza kuonekana. Hiyo yote ni kwangu, natumaini utapata makala hii muhimu wakati wa kufanya kazi na toleo la chini la barua ya Yandex.

Haiwezi kupokea barua pepe iliyo na kiambatisho(
ikiwa barua imetumwa na faili - faili yoyote - basi maandishi ya barua hupotea

nisaidie tafadhali

Ni wazi ... ukihamisha barua kutoka kwa Yandex hadi Yandex, basi kila kitu kitafanya kazi ...
aina ya figured it nje
lakini haijulikani ni kwa nini hati hii haikubali faili zingine kando na Neno... kuna mstari MSWORD karibu nayo, ikitenganishwa na koma, na kuweka pdf na zhpg na png - Neno pekee husoma na kuhifadhi kawaida.... kitu kama hiki

Utumizi mmoja unaowezekana wa vitendaji vya imap ni kuunda daemoni ya barua ambayo itadhibiti jinsi watumiaji wanavyojisajili na kujiondoa kutoka kwa orodha yako ya barua. Ili kukamilisha kazi hii, njia mbili kawaida hutumiwa katika utumaji barua. Wa kwanza anadhani kwamba mtumiaji lazima aende kwenye ukurasa fulani na kuthibitisha matendo yake, pili inahitaji kutuma barua. Ya pili pia inahitaji hati ya kidhibiti iendeshwe mara kwa mara na cron daemon?om. Kwa sababu ya hii, sio maarufu kama njia ya kwanza.

Lakini, kama unaweza kuona, barua kubwa zaidi hutumia njia ya pili. Kwa hivyo ikiwa unayo chaguo la kutumia crond, itumie.

Kwa kweli, kuelewa kazi sio ngumu sana. Mtu ambaye amewahi kufanya kazi kwa PHP ataelewa kwa urahisi jinsi ya kufanya kazi nao. Baadhi ya matatizo yanaweza kutokea kwa kuchanganua vichwa vya herufi ambazo hati itachakata.

Algorithm ya hati yenyewe sio ngumu kuja nayo. Daemon huanzisha muunganisho kwa seva ya barua na hukagua ujumbe juu yake. Ikiwa hakuna barua, hati itaacha kufanya kazi.
Ikiwa kuna barua, basi vichwa vya barua ya kwanza vinachanganuliwa. Sehemu za kutoka na somo zinaangaliwa. Ikiwa sehemu ya mada ina mojawapo ya chaguo mbili halali za vichwa (jiandikishe au ujiondoe), basi rekodi inayolingana na thamani kutoka sehemu hiyo itatumika (imethibitishwa) au itafutwa kwenye jedwali. Katika visa vyote viwili, arifa inayolingana juu ya vitendo vya hati hutumwa kwa anwani iliyoainishwa kwenye uwanja. Baada ya hayo, barua imewekwa alama ya kufutwa. Ikiwa somo halina mada halali, arifa ya hitilafu inatumwa na barua pia imewekwa alama ya kufutwa. Hati hiyo inakwenda kwenye barua pepe inayofuata.
Baada ya kumaliza kupanga barua zote, anasafisha sanduku la barua.

Sitamchosha msomaji na chati za mtiririko, kwa hivyo wacha tuende moja kwa moja kwenye uhakika. Ili kufungua kisanduku cha barua, kitendakazi cha imap_open kinatumika. Kwa kuwa PHP inasaidia kufanya kazi na itifaki kadhaa, ni muhimu kuonyesha wazi ni itifaki gani inayotumika kufanya kazi na sanduku la barua. Kwa upande wetu, hii ni POP3 kwenye bandari 110 (kiwango). Tunapeana matokeo ya utekelezaji wa hati kwa utofauti wa $my_box.


Utaona baadaye kwamba utaftaji huu utatumika katika takriban vitendaji vyote vya imap. Ifuatayo, tunaangalia kisanduku cha barua kwa barua. Ukaguzi unafanywa na kitendakazi cha imap_num_msg.

$n = imap_num_msg($my_box);

Kwa hivyo, kigezo cha $n kitakuwa na idadi ya herufi kwenye kisanduku cha barua. Nambari hii inaweza kuwa kubwa kuliko sifuri au sawa nayo (ikiwa kisanduku ni tupu).
Ikiwa kuna herufi, basi kwa kitanzi cha wakati tunachanganua herufi, kwa mlolongo kuongeza nambari ya barua kwa moja. Tafadhali kumbuka kuwa herufi ya kwanza kwenye kisanduku cha barua itakuwa na nambari 0, kama vile kipengele cha kwanza cha safu.
Ili kuongeza nambari ya barua, toa tofauti $m thamani ya 0, na kisha, chini ya masharti ya kitanzi, uongeze kwa $ m ++ moja.

Ili kuchanganua vichwa ambavyo tunavutiwa navyo, vipengele viwili vinatosha: imap_header na imap_fetch_overview. Ili kukamilisha kila mmoja wao, pamoja na sanduku la barua, unahitaji kuonyesha nambari ya barua. Kwa upande wetu, ndani ya kitanzi itakuwa sawa na kutofautiana $m.

Imap_header hurejesha kitu kilicho na maelezo ya kina kuhusu kichwa cha ujumbe kama matokeo ya utekelezaji. Miongoni mwa mambo mengine, kitu hiki kina safu kutoka, ambayo ina maadili manne. Hizi ni za kibinafsi, adl, kisanduku cha barua na mwenyeji. Kati ya hizi, tunavutiwa tu na kisanduku cha barua na mwenyeji. Kuzibadilisha, tutapata anwani ambayo barua hiyo ilitumwa.


$h = $h -> kutoka;
a
foreach ($h as $k => $v ) (
$mailbox = $v -> kisanduku cha barua;
$host = $v -> mwenyeji ;
$personal = $v -> binafsi ;
$email = $mailbox . ? @¬ . $mwenyeji ;

Muhtasari wa Imap_fetch - utaturuhusu kujua mada ya barua. Kwa madhumuni sawa, imap_header inaweza kutumika, lakini kwa sababu kadhaa hii inaweza wakati mwingine isifanye kazi. Kutoka kwa safu ambayo chaguo hili la kukokotoa linarudi, tunahitaji tu uwanja wa somo


foreach ($s as $k => $v ) (
$subj = $v -> somo;
}

Matendo yetu zaidi yanahusiana na kuvuta barua pepe kutoka kwa hifadhidata, na ikiwa iko, weka alama kwenye mstari mzima na ingizo hili kama "imethibitishwa", au uifute. Wacha tufikirie kuwa baada ya kujaza fomu ya barua kwenye wavuti, msajili amepewa hali 0, na baada ya kudhibitisha usajili hubadilika kuwa 1.

ikiwa ($subj == "SUBSCRIBE" ) (
mysql_query( "SASISHA jisajili SET stat=1 WAPI email=$my_email");

}
mysql_query( "FUTA KUTOKA KUJIsajili WAPI barua pepe = $my_email");
$del = imap_delete ($my_box, $m);
}
mwingine (
$del = imap_delete ($my_box, $m);
}

kama ilivyotajwa hapo juu, baada ya kukamilisha vitendo vyote, hati husafisha sanduku la barua.


Mpango huu rahisi ni onyesho tu kwamba PHP inaweza kutumika kuandika sio tu tovuti zinazobadilika kwa nguvu, lakini pia huduma ambazo hazionekani kwa mtumiaji kabisa. Kwa kweli, kwa upande wa maandishi ya ganda, PHP haitumiki, tofauti na mshindani wake Perl, lakini hata hivyo ...

Kuorodhesha programu nzima isipokuwa kwa vigezo vya muunganisho wa hifadhidata (db.php):

ni pamoja na "db.php" ;
$my_box = imap_open ("(you.pop.host/pop3:110)" , "ingia" , "nenosiri" );
$n = imap_num_msg($my_box);
$m = 0;
$add_text = "

Asante kwa kuthibitisha usajili wako" ;
$add_sbj = "Umeongeza!" ;
$del_text = "

Samahani lakini kisanduku hiki cha barua kinatumika
tu kwa usimamizi wa barua";
$err_sbj = "Hitilafu" ;
$ vichwa = "Kutoka: Jiandikishe kwa Robot

X-mailer: PHP4

Aina ya maudhui: maandishi / wazi; charset=UTF-8
" ;
ikiwa($n != 0 ) (
wakati($m++< $n ) {
$h = imap_header($my_box, $m);
$s = muhtasari wa imap_fetch_($my_box, $m);
$h = $h -> kutoka;
foreach ($h as $k => $v ) (
$mailbox = $v -> kisanduku cha barua;
$host = $v -> mwenyeji ;
$personal = $v -> binafsi ;
$email = $mailbox . "@". $mwenyeji ;
$my_email = mysql_escape_string (barua pepe ya $);
}
foreach ($s as $k => $v ) (
$subj = $v -> somo;
}
ikiwa ($subj == "SUBSCRIBE" ) (
mysql_query( "SASISHA jedwali WEKA takwimu=1 WAPI barua pepe=$my_email");
//print mysql_error();
$del = imap_delete ($my_box, $m);
barua pepe ($email, $add_sbj, $add_text, $headers);
}
elseif ($subj == "UNISUBSCRIBE" ) (
mysql_query( "FUTA KUTOKA kwa jedwali AMBAPO barua pepe = $my_email");
$del = imap_delete ($my_box, $m);
barua pepe ($ del_sbj, $del_text, $headers);
}
mwingine (
$del = imap_delete ($open_box, $m);
barua pepe ($err_sbj, $err_text, $headers);
}
}
$clear = imap_expunge($my_box);
}
?>

Baadhi ya programu za wavuti zinaweza kuhitaji barua pepe maalum kwa mtumiaji. Katika kesi hii, tunaweza kuandika nambari yetu ya barua pepe ya SquirrelMail au Roundcube. Bila kujali unachochagua, kujua jinsi ya kutumia barua pepe ya IMAP kutakusaidia.

Jinsi ya kufanya kazi na IMAP katika PHP imefunikwa katika kurasa mbili. Kwenye ukurasa wa kwanza kuna kazi muhimu za kuunganisha kwa seva za barua na kusoma ujumbe. Kwenye ukurasa wa pili tutazungumza juu ya kufanya kazi na barua pepe, kwa mfano, kufuta ujumbe, kupakua programu, nk ...

Ili kuonyesha utendakazi, mifano ya msimbo itatumika ambayo inaweza kutumika kuendesha hati zako za mteja wa barua pepe.

Vigezo vya URL vya kupiga kazi zinazohitajika:

  • func - aina ya kazi inayohitajika (kwa mfano: soma barua pepe, angalia sanduku la barua, futa ujumbe)
  • folda - jina la folda ya kisanduku cha barua cha kuunganisha (kwa mfano: Kikasha, Vipengee Vilivyotumwa, barua taka)
  • uid - kitambulisho cha kipekee cha barua pepe

Vigezo vinaweza kurejeshwa kwa kutumia $_GET na swichi inaweza kutumika kupiga hatua zinazofaa.

Inaunganisha kwa seva ya IMAP

Ili kuanzisha muunganisho kwenye seva ya IMAP, tunatumia kitendakazi cha imap_connect() kama inavyoonyeshwa hapa chini:

Njia ya ujumbe, jina la mtumiaji na nenosiri ni vigezo muhimu ili kuunganisha kwenye seva. Unaweza kujifunza kuhusu chaguzi za ziada katika mwongozo.

Njia ya kisanduku cha barua ni mfuatano unaotambulisha seva na mlango katika viunga vilivyopinda hubainisha jina la folda ya barua inayohitajika.

Hapa kuna baadhi ya mistari ya folda Kikasha huduma za posta:

  • Gmail (imap.gmail.com: 993/imap/ssl) INBOX
  • Yahoo (imap.mail.yahoo.com: 993/imap/ssl) kikasha
  • AOL (imap.aol.com: 993/imap/ssl) KISASI

Seva zingine hazina SSL iliyowezeshwa, kwa hali ambayo utahitaji kuacha "SSL" kutoka kwa mstari. Seva zingine zinaweza kutumia vyeti vyao wenyewe, ambapo lazima ujumuishe "NOVALIDATE-CERT".

Muunganisho wa seva ya barua ukiwa wazi, sasa tunaweza kuangalia vitendaji vinavyotumika kwa shughuli zifuatazo:

  • Onyesha orodha ya folda za kisanduku cha barua katika akaunti yako ya barua pepe
  • Onyesha orodha ya barua pepe kwenye folda
  • Tazama yaliyomo kwenye barua pepe ya mwandishi

Folda za barua pepe

Kikasha , Imetumwa , Takataka Na Barua taka- Folda hizi zinaonekana katika karibu kila akaunti ya barua pepe, na mara nyingi watumiaji wanaweza kuunda folda zao wenyewe. Ili kutazama ujumbe katika folda hizi, lazima tubadilishe kamba yetu ya unganisho. Kwa mfano, weka "INBOX" kwenye upau wa njia mapema. Ikiwa unahitaji kuunganisha kwenye folda yako ya barua taka, tumia kitu kama "Taka" badala yake. Lakini ingawa inaweza kuorodheshwa kama Barua taka kwa akaunti ya barua pepe, inapotazamwa kupitia mteja wa barua pepe, majina halisi ya folda zilizo nyuma inaweza kuwa tofauti. Tunaweza kuorodhesha folda zote zilizopo kwenye akaunti kwa kutumia imap_list() .

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

Ni lazima tupitishe kishikio cha muunganisho kilichopatikana kwa imap_open() kama kigezo cha awali hadi imap_list() . Pia tunapaswa kupitisha njia (bila folda, kwa mfano "INBOX"). Kigezo cha tatu ni ombi la folda zote zinazopatikana.

Arifa ya Ujumbe

Kila folda ina orodha ya barua pepe zinazopatikana, kwa hivyo, hebu tuone jinsi tunavyoweza kuunda orodha ya ujumbe katika kikasha chetu.

Kwanza unahitaji kupata idadi ya ujumbe unaopatikana kwa kutumia imap_num_msg() . Kisha tunaweza kutumia imap_header() kazi kupata habari ya kichwa kwa kila ujumbe.

Wacha tuseme ikiwa tunataka barua pepe 20 za mwisho:

($numMessages - 20); $i--) ( $header = imap_header($imap, $i); $fromInfo = $header->kutoka; $replyInfo = $header->reply_to; $details = array("fromAddr" => (isset($ fromInfo->mailbox) && isset($fromInfo->host)) ? $fromInfo->boxbox . "@" . $fromInfo->mwenyeshi: "", "fromName" => (isset($fromInfo->binafsi)) ?$fromInfo->personal: "", "replyAddr" => (isset($replyInfo->boxbox) && isset($replyInfo->host)) ? $replyInfo->boxbox . "@" . $replyInfo->mwenyeji : "", "replyName" => (isset($replyTo->personal)) ? $replyto->binafsi: "", "subject" => (isset($header->somo)) ? $header->somo : "", "date" => (isset($header->date)) ? $header->date: ""); $uid = imap_uid($imap, $i); echo "

    "; mwangwi"
  • Kutoka:" . $details["fromName"]; echo " " . $details["fromAddr"] . "
  • "; mwangwi"
  • Mada:" . $details["subject"] ..php?folder=" . $folda. "&uid=" . $uid ..php?folder=" . $folder . "&uid=" . $uid . "&func=delete">Futa
  • "; mwangwi"
"; }

Miunganisho ya $Imap lazima ifunguliwe katika folda sahihi. Kisha tunaweza kupitia barua pepe 20 za mwisho kwa kutumia idadi ya barua pepe zilizopokelewa na imap_num_msg() . Kiungo na nambari ya barua pepe hupewa imap_header() ili kupata habari ya kichwa, ambayo inaweza kufasiriwa kama habari ya kupendeza kutoka kwa mtumaji, anwani ya barua pepe, jina, somo, n.k.

Tafadhali kumbuka kuwa nambari ya barua pepe kutoka kwa jumla ya idadi ya ujumbe sio kitambulisho cha kipekee cha ujumbe. Ikiwa una barua pepe 100 kwenye sanduku lako la barua, basi nambari ya mwisho itakuwa 100, ya awali itakuwa 99, na kadhalika. Ukifuta ujumbe nambari 100 na kisha kupokea ujumbe mpya, nambari yake itakuwa 100.

Ili kuendelea na hatua zinazofuata, unahitaji kupata kitambulisho cha kipekee cha barua pepe yako. Kila barua pepe ina kitambulisho cha kipekee kiitwacho UID, ambacho tunaweza kupata kwa kutoa barua pepe, chaguo la kukokotoa kwa nambari imap_uid() UID ni ya kipekee na haitabadilika baada ya muda.

Tazama yaliyomo kwenye ujumbe

Kusoma barua pepe kwa kweli si rahisi kama kazi za awali, kwa hivyo unahitaji kutumia Madarasa ya Barua yaliyotengenezwa na Mitul Kordia. Darasa hurekebisha kazi tatu zifuatazo kwa mfano wetu hapa chini:

usimbaji) ( kesi ya 3: rudisha imap_base64($text); kesi ya 4: rudisha imap_qprint($text); chaguo-msingi: rudisha $text; ) ) // zidisha ikiwa ($structure->aina == 1) ( foreach ($structure ->sehemu kama $index => $subStruct) ( $prefix = ""; ikiwa ($partNumber) ( $prefix = $partNumber . "."; ) $data = get_part($imap, $uid, $mimetype, $ subStruct, $prefix .($index + 1)); ikiwa ($data) ( return $data; ) ) ) rudisha sivyo; ) kitendakazi get_mime_type($structure) ( $primaryMimetype = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); ikiwa ($structure ->subtype) ( return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype; ) rudisha "TEXT/PLAIN"; )

Kitendakazi cha GetBody() hupata maudhui ya barua pepe kwa kupitisha muunganisho wake wa UID na IMAP. Ndani ya kitendakazi tunaita kazi ya get_part() na aina ya yaliyomo kama maandishi/HTML. Barua pepe ya maandishi wazi ni rahisi kusoma. Kwa hivyo tutajaribu kwanza kupata yaliyomo kwenye HTML ndani ya barua pepe.

Kisha tunasoma muundo wa barua pepe kwa kutumia imap_fetchstructure() kazi. Tulibadilisha vitendakazi vya maktaba ili kutumia UID badala ya kupitisha FT_UID kila wakati.

Kisha tutapata aina ya MIME ya barua pepe kwa kutumia get_mime_type() kitendakazi. Kuna aina nane za MIME zilizorejeshwa na chaguo hili la kukokotoa kama nambari kamili:

  • 0 - MAANDIKO
  • 1 - KUZIDISHA
  • 2 – UJUMBE
  • 3 – MAOMBI
  • 4 - AUDIO
  • 5 - PICHA
  • 6 - VIDEO
  • 7 - MENGINEYO

Tunageuza mrejesho kuwa aina halisi ya MIME ya mfuatano kwa kutumia safu za aina za MIME.

Ujumbe wa sehemu nyingi unaweza kuwa na idadi kubwa ya aina ndogo, kwa hivyo tunapitia aina zote ndogo kwa kutumia sehemu ya nambari na kuleta barua pepe kwa kutumia imap_fetchBody() sahihi inapopatikana kwa kutumia aina ya mime.

Kisha, tunatumia kazi inayofaa ya kusimbua kulingana na usimbaji wa aina ya ujumbe na kurudisha yaliyomo. Orodha kamili ya aina zinazopatikana za usimbaji:

  • 0 - 7BIT
  • 1 - 8BIT
  • 2 – BINARY
  • 3 – BASE64
  • 4 – IMENUKUU-KUCHAPA
  • 5 - MENGINEYO

Hitimisho

Tumemaliza kukagua misingi ya kuunganisha kwa seva ya IMAP, kuorodhesha ujumbe ndani ya folda zinazopatikana, na kumaliza kusoma yaliyomo kwenye barua pepe. Kwenye ukurasa unaofuata wa kiingilio, tutazungumza juu ya kazi ambazo zinaweza kutumika kutekeleza utendaji wa ziada wa mteja wa barua pepe, kwa mfano, kufuta ujumbe na viambatisho vya usindikaji.

Utumizi mmoja unaowezekana wa vitendaji vya imap ni kuunda daemoni ya barua ambayo itadhibiti jinsi watumiaji wanavyojisajili na kujiondoa kutoka kwa orodha yako ya barua. Ili kukamilisha kazi hii, njia mbili kawaida hutumiwa katika utumaji barua. Wa kwanza anadhani kwamba mtumiaji lazima aende kwenye ukurasa fulani na kuthibitisha matendo yake, pili inahitaji kutuma barua. Ya pili pia inahitaji hati ya kidhibiti iendeshwe mara kwa mara na cron daemon-om. Kwa sababu ya hii, sio maarufu kama njia ya kwanza.

Lakini, kama unaweza kuona, barua kubwa zaidi hutumia njia ya pili. Kwa hivyo ikiwa unayo chaguo la kutumia cron, itumie.

Kwa kweli, kuelewa kazi sio ngumu. Baadhi ya matatizo yanaweza kutokea kwa kuchanganua vichwa vya herufi ambazo hati itachakata.

Algorithm ya hati yenyewe sio ngumu kuja nayo. Daemon huanzisha muunganisho kwa seva ya barua na hukagua ujumbe juu yake. Ikiwa hakuna barua, hati itaacha kufanya kazi. Ikiwa kuna barua, basi vichwa vya barua ya kwanza vinachanganuliwa. Sehemu za kutoka na somo zinaangaliwa. Ikiwa sehemu ya mada ina mojawapo ya chaguo mbili halali za vichwa (jiandikishe au ujiondoe), basi rekodi inayolingana na thamani kutoka sehemu hiyo itatumika (imethibitishwa) au itafutwa kwenye jedwali. Katika visa vyote viwili, arifa inayolingana juu ya vitendo vya hati hutumwa kwa anwani iliyoainishwa kwenye uwanja. Baada ya hayo, barua imewekwa alama ya kufutwa. Ikiwa somo halina mada halali, arifa ya hitilafu inatumwa na barua pia imewekwa alama ya kufutwa. Hati hiyo inakwenda kwenye barua pepe inayofuata. Baada ya kumaliza kupanga barua zote, anasafisha sanduku la barua.

Kitendaji cha imap_open kinatumika kufungua kisanduku cha barua. Kwa kuwa PHP inasaidia kufanya kazi na itifaki kadhaa, ni muhimu kuonyesha wazi ni itifaki gani inayotumika kufanya kazi na sanduku la barua. Kwa upande wetu, hii ni pop3 kwenye bandari 110 (kiwango). Tunapeana matokeo ya utekelezaji wa hati kwa utofauti wa $my_box.

$my_box = imap_open("(you.pop.host/pop3:110)", "ingia", "nenosiri");

Utaona baadaye kwamba utaftaji huu utatumika katika takriban vitendaji vyote vya imap. Ifuatayo, tunaangalia kisanduku cha barua kwa barua. Ukaguzi unafanywa na kitendakazi cha imap_num_msg.

$n = imap_num_msg($my_box);

Kwa hivyo, kigezo cha $n kitakuwa na idadi ya herufi kwenye kisanduku cha barua. Nambari hii inaweza kuwa kubwa kuliko sifuri au sawa nayo (ikiwa kisanduku ni tupu). Ikiwa kuna herufi, basi kwa kitanzi cha wakati tunachanganua herufi, kwa mlolongo kuongeza nambari ya barua kwa moja. Tafadhali kumbuka kuwa herufi ya kwanza kwenye kisanduku cha barua itakuwa na nambari 0, kama vile kipengele cha kwanza cha safu. Ili kuongeza nambari ya barua, toa tofauti $m thamani ya 0, na kisha, chini ya masharti ya kitanzi, uongeze kwa $ m ++ moja.

Ili kuchanganua vichwa ambavyo tunavutiwa navyo, vipengele viwili vinatosha: imap_header na imap_fetch_overview. Ili kukamilisha kila mmoja wao, pamoja na sanduku la barua, unahitaji kuonyesha nambari ya barua. Kwa upande wetu, ndani ya kitanzi itakuwa sawa na kutofautiana $m.

imap_header hurejesha kitu kilicho na maelezo ya kina kuhusu kichwa cha ujumbe kama matokeo ya utekelezaji. Miongoni mwa mambo mengine, kitu hiki kina safu kutoka, ambayo ina maadili manne. Hizi ni za kibinafsi, adl, kisanduku cha barua na mwenyeji. Kati ya hizi, tunavutiwa tu na kisanduku cha barua na mwenyeji. Kuzibadilisha, tutapata anwani ambayo barua hiyo ilitumwa.

$h = imap_header($my_box, $m); $h = $h->kutoka; foreach ($h as $k => $v) ( $mailbox = $v->mailbox; $host = $v->host; $personal = $v->binafsi; $email = $mailbox . "@" . $mwenyeji;

imap_fetch_overview - itaturuhusu kujua mada ya barua. Kwa madhumuni sawa, imap_header inaweza kutumika, lakini kwa sababu kadhaa hii inaweza wakati mwingine isifanye kazi. Kutoka kwa safu ambayo chaguo hili la kukokotoa linarudi, tunahitaji tu uwanja wa somo

$s = muhtasari wa imap_fetch_($my_box, $m); foreach ($s as $k => $v) $subj = $v->somo;

Matendo yetu zaidi yanahusiana na kuvuta barua pepe kutoka kwa hifadhidata, na ikiwa iko, weka alama kwenye mstari mzima na ingizo hili kama, au uifute. Wacha tufikirie kuwa baada ya kujaza fomu ya barua kwenye wavuti, msajili amepewa hali 0, na baada ya kudhibitisha usajili hubadilika kuwa 1.

Ikiwa ($subj == "jiandikishe") ( mysql_query("sasisha jisajili seti stat=1 ambapo barua pepe=$my_email"); $del = imap_delete($my_box, $m); barua pepe($email, $add_sbj, $add_text , $headers); ) vinginevyo ikiwa ($subj == "jiondoe") ( mysql_query("futa kutoka kwa kujisajili ambapo barua pepe = $my_email"); $del = imap_delete($my_box, $m); barua pepe($email, $ del_sbj, $del_text, $headers); ) vinginevyo ( $del = imap_delete($my_box, $m); mail($email, $err_sbj, $err_text, $headers); ) baada ya kukamilisha vitendo vyote, hati husafisha sanduku la barua. $clear = imap_expunge($my_box);

Mpango huu rahisi ni maonyesho tu ya ukweli kwamba katika PHP unaweza kuandika sio tu tovuti zinazobadilika kwa nguvu, lakini pia huduma ambazo hazionekani kwa mtumiaji kabisa.

Kuorodhesha programu nzima isipokuwa kwa vigezo vya kuunganisha kwenye hifadhidata:

Jumuisha "config.php"; // muunganisho kwenye hifadhidata $my_box = imap_open("(you.pop.host/pop3:110)", "ingia", "nenosiri"); $n = imap_num_msg($my_box); $m = 0; $add_text = "Asante kwa kuthibitisha usajili wako"; $add_sbj = "umeongeza!"; $del_text = "Umeondolewa kwenye orodha ya wanaopokea barua pepe."; $del_sbj = "futa kutoka kwenye orodha"; $err_text = "Samahani, lakini kisanduku hiki cha barua kinatumika tu kwa usimamizi wa utumaji barua"; $err_sbj = "kosa"; $headers = "kutoka: jisajili roboti x-mailer: php4 content-aina: text/plain; charset=windows-1251 "; if($n != 0) ( while($m++< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->kutoka; foreach ($h as $k =>$v) ( $mailbox = $v->mailbox; $host = $v->host; $personal = $v->binafsi; $email = $mailbox . "@" . $host; $my_email = mysql_escape_string($email); ) foreach ($s as $k =>$v) $subj = $v->somo; ikiwa ($subj == "jiandikishe") ( mysql_query("sasisha jedwali limewekwa stat=1 ambapo barua pepe=$my_email"); //print mysql_error(); $del = imap_delete($my_box, $m); barua pepe($ barua pepe, $add_sbj, $add_text, $headers); ) vinginevyo ikiwa ($subj == "jiondoe") ( mysql_query("futa kutoka kwa jedwali ambapo barua pepe = $my_email"); $del = imap_delete($my_box, $m) ; barua pepe($email, $del_sbj, $del_text, $headers); ) nyingine ($del = imap_delete($open_box, $m); barua pepe($email, $err_sbj, $err_text, $headers); ) ) $clear = imap_expunge($my_box); )

Orodha haina maelezo fulani, kama vile uwezekano wa kugeuza kutoka win hadi koi, kuangalia mara mbili kisanduku cha barua cha mtumaji, n.k. Hizi tayari ni nyongeza za kazi ambazo mtu yeyote anaweza kuongeza inapohitajika.

Siku nyingine nilipokea mgawo wa kuandika moduli ndogo katika PHP ambayo ingeniruhusu kufanya kazi na barua zinazoingia. Baada ya googling kidogo, niliona kuwa moja ya itifaki inafaa kwangu kwa kazi hii POP3 Na IMAP.
Lakini chaguo lilikuwa dhahiri: Ningetumia IMAP kwani inafanya kazi zaidi na ya kisasa zaidi kuliko itifaki ya POP3.

Sasa nilihitaji kujua haraka jinsi ya kufanya kazi na itifaki za IMAP, jinsi ya kupokea barua kutoka kwa seva ya barua ya Yandex/Google.

Kwa kazi rahisi zaidi, nilichagua maktaba PhpImap, kwani inaweza kutekeleza kwa haraka na kwa urahisi kazi zote ninazohitaji.

Inaunganisha kwa seva ya barua.

Sasa kwa kuwa tumeamua juu ya uchaguzi wa itifaki na uchaguzi wa maktaba, tutajaribu kuunganisha kwenye seva ya barua.

Ili PHP ifanye kazi kikamilifu na itifaki ya IMAP, unahitaji kuwezesha kiendelezi php_imap.dll/imap.so katika faili ya php.ini.

Kwanza, hebu jaribu kuunganisha kwa barua ya Yandex kwani nilikuwa na shida kidogo nayo.

//Jumuisha maktaba ni pamoja na("/phpImap/Mailbox.php"); ni pamoja na("/phpImap/IncomingMail.php"); // Kwa urahisi, nitaunda viunga vya kuunganisha kwenye seva ya barua. fafanua ("MAIL_IMAP_SERVER", "imap.yandex.ru"); fafanua("MAIL_IMAP_SERVER_PORT", 993); fafanua("MAIL_IMAP_LOGIN", " "); fafanua("MAIL_IMAP_PASS", "mfano_kupita"); fafanua("MAIL_IMAP_PATH", "(".MAIL_IMAP_SERVER.":".MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX"); $mailbox = PhpImap\mailbox mpya(MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__); jaribu ( $mailbox->getImapStream();) catch (Ila $e) ( die($e->getMessage()); )

Jinsi tunavyomwona mjenzi wa darasa Sanduku la barua inachukua hoja zifuatazo:

  • MAIL_IMAP_PATH- Ina anwani ya seva (MAIL_IMAP_SERVER), mlango wa unganisho (MAIL_IMAP_SERVER_PORT), aina ya muunganisho (map) na inaonyesha kuwa muunganisho utasimbwa kwa njia fiche (ssl). Baada ya braces curly tunaonyesha folda ambayo tutaunganisha, katika kesi hii kwa ujumbe unaoingia (INBOX).
  • MAIL_IMAP_LOGIN- Sanduku la barua ambalo tutaunganisha.
  • MAIL_IMAP_PASS- Nenosiri (mara nyingi hii ni nenosiri kutoka kwa sanduku la barua).
  • __DIR__- Hii ndio njia ya folda ambayo faili zilizoambatishwa na ujumbe wa barua pepe zitahifadhiwa.

Baada ya hii tutaangalia ikiwa uunganisho wetu umeundwa kupitia njia getImapStream() ikiwa kwa sababu fulani muunganisho haujaundwa, programu hutupa tofauti na sababu ya muunganisho usiofanikiwa.

Ni muhimu kuzingatia kwamba katika mipangilio ya barua ya Yandex unaweza kuwa umezima uwezo wa kuunganisha kupitia itifaki ya IMAP.

Sasa hebu tulinganishe kuunganisha kwenye Gmail.

Fafanua("MAIL_IMAP_SERVER", "imap.gmail.com"); fafanua("MAIL_IMAP_SERVER_PORT", 993); fafanua("MAIL_IMAP_LOGIN", " "); fafanua("MAIL_IMAP_PASS", "mfano_kupita"); fafanua("MAIL_IMAP_PATH", "(".MAIL_IMAP_SERVER.":".MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX");

Kama tunavyoona, sio tofauti na unganisho la hapo awali, lakini uwezekano mkubwa utapata ubaguzi wakati wa kuunganisha kwenye seva.
Tatizo hili linatokana na ukweli kwamba Itifaki ya IMAP ya Gmail imezimwa kwa chaguomsingi. Unaweza kuiwezesha katika mipangilio katika kichupo cha Usambazaji na POP/IMAP kwenye ufikiaji wa IMAP ⇒ Washa chaguo la IMAP.

Baada ya kuwezesha kazi kupitia itifaki ya IMAP, tunahitaji tengeneza programu ya nenosiri. Ili iundwe, tunahitaji kufanya uidhinishaji wa vipengele viwili kwa wasifu huu. Baada ya hapo unaweza kuanza kuunda. Tunapounda nenosiri jipya la programu, tutahitaji kuliingiza kwenye MAIL_IMAP_PASS mara kwa mara ili kuunganisha kwenye seva.

Tafadhali kumbuka kuwa wakati wa kuunda nenosiri la programu, huenda usiweze kuunganisha kwenye seva; hii ni kwa sababu ya ukweli kwamba nenosiri hili bado halijatumiwa kwa huduma ya Gmail; kawaida huchukua dakika 5-60.

Sampuli za data

Baada ya muunganisho uliofanikiwa, tunaweza kufanya ombi la kupokea ujumbe wa jasho kutoka kwa seva. Kwa hili tutatumia njia tafutaMailBox(string $criteria) ambayo kimsingi ni mpangilio wa njia tafuta_imap. Ni muhimu kuelewa hapa kwamba hoja ya vigezo vya $ ni kigezo fulani cha kutafuta ujumbe tunaohitaji, njia yenyewe hurejesha vitambulishi vya vipengele ambavyo vitakuwa na manufaa kwetu kupata maelezo ya kina kuhusu ujumbe wa barua.

$mailsIds = $mailbox->searchMailBox("ALL");

Kama unavyoweza kukisia, hapa tunapokea ujumbe wote.
Sasa hebu tujaribu kutafuta vigezo vingine muhimu vya utafutaji:

// Ujumbe wote kwa siku 3. $mailsIds = $mailbox->searchMailBox("SINCE "".date("d-M-Y",strtotime("-3 siku")).""); // Ujumbe ambao haujasomwa kwa siku 3. $mailsIds = $mailbox->searchMailBox("HAIJAONEKANA TANGU "".date("d-M-Y",strtotime("-3 siku"))"""); //Tafuta jumbe zenye mechi hii kwenye kijajuu cha TEXT. $mailsIds = $mailbox->searchMailBox("TEXT "Jarida""); //Tafuta jumbe zenye mechi hii kwenye kichwa cha BODY. $mailsIds = $mailbox->searchMailBox("BODY "Ujumbe wa Taarifa""); // Tafuta kwa barua pepe ya mtumaji. $mailsIds = $mailbox->searchMailBox("KUTOKA " ""); //Pokea ujumbe kwa kichwa SUBJECT $mailsIds = $mailbox->searchMailBox("SUBJECT "Masasisho yametolewa kwa ajili ya simu yako"");

Mfano huu unatoa muhtasari mzuri wa misingi ya kutumia vigezo vya utafutaji.

Kupokea taarifa

Kwa kuwa sasa tuna safu ya vitambulisho vya ujumbe, tuko tayari kuichakata:

//Pata kitambulisho cha ujumbe wa mwisho kutoka kwa safu. $id = end($mailsIds); //Pata mfano wa kitu cha darasa cha IncomingMail ambacho kina habari kuhusu ujumbe. $mail = $mailbox->getMail($id); // Pata faili zilizoambatishwa kwa ujumbe huu ikiwa kuna moja. $mail->getAttachments(); //Pato ujumbe. echo $mail->textHtml;

Kwa hiyo tulipokea ujumbe kutoka kwa barua yetu na viambatisho vyake bila matatizo yoyote.

Vipengele vya ziada.

Maktaba hii pia ina idadi ya mbinu muhimu kwa kazi rahisi zaidi na ujumbe wa barua pepe:

Tunahifadhi ujumbe kupitia kitambulisho chake.

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

Weka jumbe kama ambazo hazijasomwa na kitambulisho chao.

$mailbox->markMailAsUnread($id);

Tunaweka ujumbe kama ulivyosomwa na kitambulisho chao.

$mailbox->markMailAsRead($id);

Tunatia alama ujumbe kwa kitambulisho chake.

$mailbox->markMailAsImportant($id);

Tunafuta ujumbe kwa kitambulisho chao.