Php imap qo'llaniladi.

Kontaktlar / Korisne PZ

topshirish

Golovna

Mumkin bo'lgan imap funktsiyalaridan biri bu sizning pochta rozetkangizga obuna bo'lish va mijozlarga obuna bo'lish uchun foydalaniladigan pochta demonini yaratishdir.

Ushbu maqsadni amalga oshirish uchun tarqatish tizimlarida ikkita usul qo'llaniladi.

Birinchisi, xaridor har tomonga borib, o'z harakatlarini tasdiqlashi kerakligini taxmin qiladi, ikkinchisi varaqni mustahkamlashni talab qiladi.

Yana bir g'oya to'plam skriptini cron daemon-om tomonidan muntazam ravishda ishga tushirishdir.

Biroq, bu birinchi usul kabi mashhur emas.

Biroq, siz ta'kidlaganingizdek, ko'pchilik jiddiy savdo nuqtalari boshqa usuldan foydalanadi.

Natijada, biz qutidagi varaqlar sonini o'zgartirishimiz mumkin.

Ce soni noldan katta yoki yomadan katta bo'lishi mumkin (bo'sh quti kabi).

Agar varaqlar mavjud bo'lsa, while tsikli varaqlarni tanlaydi va ketma-ket varaq raqamini bittaga oshiradi.

Esda tutingki, qutidagi birinchi varaq massivning birinchi elementi kabi 0 raqami bo'ladi.

Varaq raqamini oshirish uchun $m qiymatini 0 ga o'zgartiring va keyin uni bir $m++ ga oshirish uchun tsikldan foydalaning.

Sarlavhalarimizni tahlil qilish uchun ikkita funktsiya etarli: imap_header va imap_fetch_overview.

Ularning terisini ko'rsatish uchun skrinshotga qo'shimcha ravishda varaq raqamini ko'rsatish kerak.

Bizning epizodda, tsiklning o'rtasida, $ m da sezilarli o'zgarishlar mavjud.

imap_header varaq sarlavhasi haqida qo'shimcha ma'lumotlarni o'z ichiga olishi uchun natijada olingan chiqish ob'ektini aylantiradi. Boshqa narsalar qatorida, bu ob'ekt turli qiymatlar massivni o'z ichiga oladi., PHP-da nafaqat dinamik ravishda o'zgarib turadigan saytlar yozilishi mumkinligi, balki sahna ortida turganlar kabi xizmatlar ko'rinmasligining namoyishi.

Ma'lumotlar bazasiga ulanish parametrlari ro'yxati bilan barcha dasturlarning ro'yxati:

"config.php" ni qo'shing;< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->// ma'lumotlar bazasiga ulanish $my_box = imap_open("(you.pop.host/pop3:110)", "login", "parol");

$n = imap_num_msg($mening_box); $m = 0;$add_text = "Obunangizni tasdiqlaganingiz uchun tashakkur";

$add_sbj = "siz qo'shdingiz!";

$del_text = "Siz savdo nuqtalari ro'yxatidan o'chirildingiz."; $del_sbj = "ro'yxatdan o'chirish";$err_text = "Vibachte, lekin bu pochta skrinshoti faqat pochta qutisini boshqarish uchun ishlatiladi";

$err_sbj = "xato"; $headers = "dan: obuna robot x-mailer: php4 kontent turi: matn/plain; charset=windows-1251"; if($n != 0) ( while($m++

dan;

  • foreach ($h sifatida $k =>$v) ( $pochta qutisi = $v->pochta qutisi; $host = $v->xost; $shaxsiy = $v->shaxsiy; $email = $pochta qutisi. "@" . $host, $my_email = mysql_escape_string($email) if ($subj == "obuna") ( mysql_query("jadval to'plamini yangilash stat=1, bu erda email=$my_email"); //mysql_error(); $del = imap_delete($my_box, $m mail($email, $add_sbj, $add_text, $headers else if ($subj == "obunani bekor qilish") ( mysql_query("elektron pochta = $my_email"); pochta ($email, $del_sbj, $del_text, $headers) boshqa ($del = imap_delete($open_box, $m); mail ($email, $err_sbj, $err_text, $headers); ) ) $clear = imap_expunge); ($my_box); ) Ro'yxatda turli xil tafsilotlar mavjud, masalan, koi-da yutuqdan konvertatsiya qilish mumkin
  • papka - ulanish uchun elektron pochta skrinshoti jildining nomi (masalan: loginlar, elektron pochta xabarlari, spam)
  • uid - noyob elektron pochta identifikatori

Parametrlarni qo'shimcha $_GET va o'tish buyruqlari yordamida olish mumkin va ular muayyan harakatlarni bosish uchun ishlatilishi mumkin.

IMAP serveriga ulanish

IMAP serveri bilan aloqa o'rnatish uchun biz quyida ko'rsatilgandek imap_connect() funksiyasidan foydalanamiz:

Iltimos, bizga login nomi va parolingiz serverga ulanish uchun zarur parametr ekanligini maʼlum qiling.

Qo'shimcha parametrlar haqida qo'llanmada bilib olishingiz mumkin.

Pochta ekraniga marshrut qatorda joylashgan bo'lib, u kerakli pochta papkasining nomini ko'rsatadigan jingalak qo'llardagi server va portni aniqlaydi. Papka uchun qatorlar o'qi Chiqish

  • pochta xizmatlari:
  • Gmail (imap.gmail.com: 993/imap/ssl) INBOX
  • Yahoo (imap.mail.yahoo.com: 993/imap/ssl) INBOX

AOL (imap.aol.com: 993/imap/ssl) INBOX

Ba'zi serverlarda SSL yoqilmagan, bu holda siz SSL zaryadlashni o'tkazib yuborishingiz kerak bo'ladi.

  • Boshqa serverlar NOVALIDATE-CERTni buzish uchun mas'ul bo'lgan xorijiy sertifikatlardan foydalanishi mumkin.
  • Pochta serveriga ulanishlar ochiq bo'lsa, endi biz ushbu turdagi faoliyat uchun ishlatiladigan funktsiyalarni ko'rib chiqishimiz mumkin:
  • Elektron pochta qayd yozuvingizdagi elektron pochta papkalari ro'yxatini ko'ring

Dadamning elektron varaqlari ro'yxatini ko'rish

Papka uchun qatorlar o'qi , Muallifning elektron pochtasi o'rniga sharh , Elektron pochta papkalariі Nadislani Smitty Nadislani Spam

- Ushbu papkalarni elektron pochta qayd yozuvingiz terisida osongina ko'rish mumkin va foydalanuvchilar ko'pincha turli xil papkalarni yaratishi mumkin. Ushbu papkalardagi ma'lumotlarni ko'rish uchun biz ulanish qatorimizni o'zgartirishimiz kerak.";

Masalan, avvalroq yo'llar qatoriga "INBOX" (Vkhidni) ni qo'ying.

Agar siz spam jildiga ulanishingiz kerak bo'lsa, uning o'rniga Spam belgisidan foydalaning.

Har bir jild mavjud elektron pochta xabarnomalari ro'yxatini o'z ichiga oladi, shuning uchun biz elektron pochta ekranimizda elektron pochta xabarnomalari ro'yxatini qanday yaratishimiz mumkinligini ko'rib chiqamiz.

Avval imap_num_msg() yordamida mavjud bildirishnomalar sonini olib tashlashingiz kerak.

Keyin teri bildirishnomasi sarlavhasi uchun ma'lumot olish uchun imap_header() funksiyasidan foydalanishimiz mumkin.

Aytaylik, biz qolgan 20 varaqni xohlaymiz:

    ($numMessages - 20);
  • $i--) ( $header = imap_header($imap, $i); $fromInfo = $header->dan; $replyInfo = $header->reply_to; $details = array("fromAddr" => (isset($) ) fromInfo->mailbox) && isset($fromInfo->xost)) $fromInfo->xost: "", "fromName" => $fromInfo->shaxsiy: "", "replyAddr" => (isset($replyInfo->pochta qutisi) && isset($replyInfo->host)) $replyInfo->xost : "", "replyName" => (. isset($replyTo->shaxsiy)) $replyto->shaxsiy: "", "subject" => (isset($header->subject)) $header->subject: "", "udate" => (? isset($header->udate)) ? $header->udate: ""); $uid = imap_uid ($imap, $i);"; aks-sado"
  • ($numMessages - 20);
  • Ko‘rish:$details["fromName"]; echo "". $details["fromAddr"] .
  • Mavzu:
"; }

" . $details["subject"] ..php?folder=" .

$papka.

"&uid=".

$uid ..php?folder=" . $papkasi . "&uid=" . $uid . "&func=delete">Oʻchirish

"; aks-sado"

kodlash) (3-holat: imap_base64($text); 4-holat: imap_qprint($matn); sukut boʻyicha: $textni qaytarish; ) ) // koʻp qismli if ($structure->type == 1) ( foreach ($structure) -> $index kabi qismlar => $subStruct) ( $prefiks = ""; agar ($partNumber) ( $prefiks = $partNumber. "."; ) $data = get_part($imap, $uid, $mimetype, $ subStruct, $prefiks .($index + 1)), agar ($data) ( return $data; ) ) ) false qaytaradi;

) funksiya get_mime_type($structure) ( $primaryMimetype = massiv("TEXT", "MULTIPART", "XABAR", "APPLICATION", "AUDIO", "TASIR", "VIDEO", "BOShQA"); agar ($structure) ->subtype) ( return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype; ) "TEXT/PLAIN" ni qaytaring;

GetBody() funktsiyasi UID va IMAP ulanishini o'tkazish o'rniga elektron pochtani oladi.

Funktsiyaning o'rtasida biz get_part() funksiyasini matn/HTML sifatida kontent turi bilan chaqiramiz.

  • Elektron pochta xabarnomasining dastlabki matnini o'qish ancha oson.
  • Shunday qilib, biz darhol elektron pochta o'rtasida HTMLni topishga harakat qilamiz.
  • Keyin imap_fetchstructure() qo'shimcha funktsiyasidan foydalanib, elektron pochta tuzilishini o'qiymiz.
  • Biz FT_UID-larni doimiy ravishda o'tkazish o'rniga UID-larni tiklash uchun kutubxona funksiyalarini o'zgartirdik.
  • Keyin qo'shimcha get_mime_type() funktsiyasidan foydalanib, elektron pochtaning MIME turini olamiz.
  • Bu funksiya yordamida butun sonlar ko‘rinishida aylantirilishi mumkin bo‘lgan barcha MIME turlari uchun:
  • 0 – MATN
  • 1 - KO'P QISM

2 – XABAR

3 – ILOVA

4 - AUDIO

  • 5 - TASVIR
  • 6 - VIDEO
  • 7 - BOSHQA
  • Biz MIME turlarining qo'shimcha massivlari ortidagi qatorlarni haqiqiy MIME turiga aylantiramiz.
  • Ombor ma'lumotlari juda ko'p sonli kichik turlarni o'z ichiga olishi mumkin, shuning uchun biz barcha kichik tiplar, raqamlarning zafarli qismi va imap_fetchBody() wiki-dan elektron pochta xabarlarini olib tashlash orqali rekursiv o'tamiz, agar to'g'ri m mime-turi topilsa.
  • Keyin biz ma'lumot turini kodlash va joyni aylantirish uchun dekodlashning ikkilamchi funktsiyasidan foydalanamiz.

Mavjud kodlash turlarining to'liq ro'yxati:

0 - 7BIT

Boshqa kuni men PHP-da kirish pochtasi bilan ishlashga imkon beradigan kichik modul yozishga qaror qildim. Bir nechta Google qidiruvlaridan so'ng, men ushbu vazifa uchun protokollardan biriga muhtoj ekanligimga aminman.і POP3.
IMAP

Men IMAP-ni tanlashim aniq, chunki u yanada funktsional va zamonaviy, POP3 protokoli.

Endi men IMAP protokollari bilan qanday ishlashni, Yandex/Google pochta serveridan varaqlarni qanday chiqarishni tezda aniqlashim kerak edi. Qo'lda ishlash uchun men kutubxonani tanladim PhpImap

Natijada siz barcha kerakli vazifalarni tez va oson amalga oshirishingiz mumkin.

Pochta serveriga ulanish.

Endi biz protokolni tanlash va kutubxonani tanlashga qaror qildik, biz pochta serveriga ulanishga harakat qilishimiz mumkin. IMAP protokoli bilan to'liq PHP ishlashi uchun siz kengaytmalarni yoqishingiz kerak php_imap.dll/imap.so

php.ini faylida.

Yangi boshlanuvchilar uchun, keling, Yandex-ga pochta orqali ulanishga harakat qilaylik, chunki men u bilan eng kam muammolarga duch keldim.

//Kutubxonalarni o'z ichiga oladi ("/phpImap/Mailbox.php"); o'z ichiga oladi ("/phpImap/IncomingMail.php");// Aniqlik uchun biz pochta serveriga ulanish uchun konstantalar yaratamiz.

  • define("MAIL_IMAP_SERVER", "imap.yandex.ru"); define("MAIL_IMAP_SERVER_PORT", 993);
  • define("MAIL_IMAP_LOGIN", " "); aniqlash("MAIL_IMAP_PASS", "misol_pas");
  • define("MAIL_IMAP_PATH", "(".MAIL_IMAP_SERVER.":".MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX");$mailbox = yangi PhpImap\Mailbox(MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__);
  • harakat qilib ko'ring ( $mailbox->getImapStream(); ) catch (Istisno $e) ( die($e->getMessage()); ) Yak mi bachimo dizaynerlar sinfi

Pochta qutisi quyidagi argumentlarni qabul qiladi: MAIL_IMAP_PATH

- Server manzilini (MAIL_IMAP_SERVER), ulanish portini (MAIL_IMAP_SERVER_PORT), ulanish turini (imap) o'rnating va ulanish shifrlanganligini bildiring (ssl).

Jingalak qo'llardan keyin siz ulanmoqchi bo'lgan papka ko'rsatiladi, bu maydonda kirish ma'lumotlari (INBOX) ko'rsatiladi.

Aniqlash("MAIL_IMAP_SERVER", "imap.gmail.com");

define("MAIL_IMAP_SERVER_PORT", 993);
define("MAIL_IMAP_LOGIN", " "); aniqlash("MAIL_IMAP_PASS", "misol_pas"); define("MAIL_IMAP_PATH", "(".MAIL_IMAP_SERVER.":".MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX");

Aslida, avval serverga ulanish deyarli shart emas, aks holda serverga ulanishda hamma narsa uchun aybdor bo'lishingiz kerak bo'ladi. Bu muammo nima borligi bilan bog'liq umovchannyam uchun IMAP protokoli vimknena uchun Gmail robot

.

Siz uni “IMAP protokoliga kirish” opsiyasidagi “POP/IMAP ortiqcha yuk” yorlig‘i ostidagi sozlamalarda o‘chirib qo‘yishingiz mumkin ⇒ IMAPni o‘chirish.

IMAP protokoli yordamida robotni yoqganimizdan so'ng, bizga kerak parol qo'shimchasini yarating. Buning imkoni bo'lishi uchun biz ushbu profil uchun ikki faktorli avtorizatsiyani yaratishimiz kerak. Shundan so'ng siz yaratishni boshlashingiz mumkin.

Agar dastur uchun yangi parol yaratadigan bo'lsak, serverga ulanish uchun uni MAIL_IMAP_PASS konstantasiga kiritishimiz kerak bo'ladi.

E'tibor bering, agar siz qo'shimcha parol yaratgan bo'lsangiz, siz hali ham serverga ulana olmasligingiz mumkin, ammo bu Gmail xizmati 5-60 daqiqagacha bu parol hali muzlatilmaganligi bilan bog'liq.
Ma'lumotlar yig'ish

// Barcha ma'lumotlar 3 kun ichida.

$mailsIds = $mailbox->searchMailBox("SINCE "".date("d-M-Y",strtotime("-3 kun")).""");

//3 kun davomida o'qilmagan bildirishnomalar.

$mailsIds = $mailbox->searchMailBox("SANGI KO'RILMAYDI" ".date("d-M-Y",strtotime("-3 kun")).""");

//Ushbu turdagi ma'lumotlarni TEXT sarlavhasiga qo'shing.

$mailsIds = $mailbox->searchMailBox("TEXT "Novinne rozsilannya"");

// BODY sarlavhasida ushbu turdagi ma'lumotlarni qidiring.

$mailsIds = $mailbox->searchMailBox("BODY "Ma'lumot"");

//Menejerning elektron pochta manzilini qidiring.

$mailsIds = $mailbox->searchMailBox("FROM""); //SUBJECT sarlavhasi ortidagi bildirishnomaning konturini tuzing $mailsIds = $mailbox->searchMailBox("SUBJECT "Telefoningiz uchun yangilanishlar chiqarildi"");

Ushbu misol mashhur qidiruv mezonlarining asoslarini yaxshi ko'rsatadi.

Ma'lumot olish

Endi bizda bir qator identifikatorlar bor, biz ularni qayta ishlashga tayyormiz:

//Qolgan bildirishnomaning identifikatorini massivdan olib tashlash.

$id = end($mailsIds);

//Bildirishnomalar haqida ma'lumotni o'z ichiga olgan IncomingMail sinfi ob'ektining namunasini o'chiradi.

$mail = $mailbox->getMail($id);

//Agar mavjud bo'lsa, biz ushbu sanagacha fayl va qo'shimchalarni olib tashlashimiz mumkin.

$mail->getAttachments();

Xo'sh, funktsiyalarni o'zlashtirish unchalik qiyin emas.

Ilgari RNRda ishlagan Lyudina ular bilan qanday ishlashni oson tushunadi.
Skriptni qayta ishlash uchun varaq sarlavhalarini tahlil qilish orqali ba'zi qiyinchiliklarni hal qilish mumkin.
Algoritm va skriptning o'zi noqulay.

Demon pochta serveri bilan aloqa o'rnatadi va varaqlarning mavjudligini tekshiradi.


Biroq, bu birinchi usul kabi mashhur emas.

Barglar yo'qligi sababli, ssenariyning ishi to'xtaydi.

Agar varaqlar bo'lsa, birinchi varaqning sarlavhalari tartiblanadi.
Maydonlar va mavzu ko'rinadi.
Agar mavzu maydonida ikkita to'g'ri sarlavha variantidan biri (obuna yoki obuna) bo'lsa, u holda "dan" maydonining qiymatiga mos keladigan yozuv faollashadi (tasdiqlanadi) yoki jadvaldan o'chiriladi.

Ikkala turda ham In maydoniga kiritilgan manzil skript haqida so'nggi ma'lumotlarni taqdim etish uchun so'raladi.

Quyidagi varaq ro'yxat sifatida ko'rsatilgan.


Agar mavzuda tegishli mavzular bo'lmasa, bekor qilish to'g'risidagi bildirishnoma kuchga kiradi va varaq ham o'chirish uchun belgilanadi.
Keyin skript qadam varag'iga o'tadi.
foreach ($h sifatida $k => $v) (
$pochta qutisi = $v -> pochta qutisi;
$host = $v -> xost;
$shaxsiy = $v -> shaxsiy;
$ elektron pochta = $ pochta qutisi.

?


@¬.
$host;
}

Imap_fetch_overview - varaqning mavzusini aniqlash imkonini beradi.

Ushbu maqsadlar uchun siz imap_header dan foydalanishingiz mumkin, ammo bir qator sabablarga ko'ra undan foydalanilmasligi mumkin.
Ushbu funktsiya aylanadigan massiv uchun bizga mavzu maydoni ham kerak foreach ($s sifatida $k => $v) ();

}
Ushbu funktsiya aylanadigan massiv uchun bizga mavzu maydoni ham kerak $subj = $v -> mavzu;);
Bizning keyingi qadamlarimiz elektron pochtani ma'lumotlar bazasidan olib tashlash bo'ladi va agar u mavjud bo'lsa, ushbu yozuv bilan butun qatorni "qayta tekshirish" deb belgilang yoki uni o'chiring.
}
Veb-saytdagi tarqatish shaklini to'ldirgandan so'ng, oldindan to'lovchiga 0 holati berilishi va obunani tasdiqlaganidan so'ng maqom 1 ga o'zgartirilishi qabul qilinadi.
Bizning keyingi qadamlarimiz elektron pochtani ma'lumotlar bazasidan olib tashlash bo'ladi va agar u mavjud bo'lsa, ushbu yozuv bilan butun qatorni "qayta tekshirish" deb belgilang yoki uni o'chiring.
}

agar ($subj == "OBUNA BO'LING" ) (


mysql_query(

“YANGILANISH obuna boʻlish SET stat=1 QAYERDA email=$my_email”

"QAYERDA E-mail = $my_email-ga obuna bo'lishdan o'chirish"
$del = imap_delete($mening_box, $m);
Barglar yo'qligi sababli, ssenariyning ishi to'xtaydi.
boshqa(
Yuqorida aytib o'tilganidek, barcha harakatlar o'chirilgandan so'ng, skript qutini tozalaydi.

Bu eng oddiy dastur bo'lib, PHP-da nafaqat dinamik ravishda o'zgarib turadigan saytlarni yozishingiz mumkinligi, balki sahna ortidagi kabi xizmatlar ko'rinmasligining namoyishi.
Albatta, qobiq uchun skriptlarni yozish nuqtai nazaridan, pHP raqobatchisi Perl yo'lida to'sqinlik qilmaydi, lekin...
Ma'lumotlar bazasiga ulanish parametrlari bo'yicha barcha dasturlarning ro'yxati (db.php):

"db.php" ni o'z ichiga oladi;
$my_box = imap_open("(you.pop.host/pop3:110)", "login", "parol");
$m = 0;
$add_text = " Obunani tasdiqlaganingiz uchun tashakkur”;

$add_sbj = "Siz qo'shdingiz!"

;
" ;
$del_text = "
Vibachte, ale tsya pochta skrinka vikoristovuetsya< $n ) {
faqat shoxobcha ma'muriyati uchun»;
$err_sbj = "Xato";
Agar mavzuda tegishli mavzular bo'lmasa, bekor qilish to'g'risidagi bildirishnoma kuchga kiradi va varaq ham o'chirish uchun belgilanadi.
foreach ($h sifatida $k => $v) (
$pochta qutisi = $v -> pochta qutisi;
$host = $v -> xost;
$shaxsiy = $v -> shaxsiy;
$sarlavha =
Kimdan: Robotga obuna bo'lish
}
@¬.
$host;
}
Ushbu maqsadlar uchun siz imap_header dan foydalanishingiz mumkin, ammo bir qator sabablarga ko'ra undan foydalanilmasligi mumkin.
Ushbu funktsiya aylanadigan massiv uchun bizga mavzu maydoni ham kerak X-mailer: PHP4);
Kontent turi: matn/tekis;
Bizning keyingi qadamlarimiz elektron pochtani ma'lumotlar bazasidan olib tashlash bo'ladi va agar u mavjud bo'lsa, ushbu yozuv bilan butun qatorni "qayta tekshirish" deb belgilang yoki uni o'chiring.
charset=UTF-8
}
agar($n! = 0) (
Ushbu funktsiya aylanadigan massiv uchun bizga mavzu maydoni ham kerak while($m++);
Bizning keyingi qadamlarimiz elektron pochtani ma'lumotlar bazasidan olib tashlash bo'ladi va agar u mavjud bo'lsa, ushbu yozuv bilan butun qatorni "qayta tekshirish" deb belgilang yoki uni o'chiring.
$h = imap_header($my_box, $m);
}
Veb-saytdagi tarqatish shaklini to'ldirgandan so'ng, oldindan to'lovchiga 0 holati berilishi va obunani tasdiqlaganidan so'ng maqom 1 ga o'zgartirilishi qabul qilinadi.
$s = imap_fetch_overview($my_box, $m);
$ elektron pochta = $ pochta qutisi.
}
}
"@".
}
?>


Elektron pochta ma'lumot almashishning eng muhim vositasi bo'lib, uni ish uchun ishlatganingizda, siz tez-tez vaziyatga duch kelasiz: pochtaga varaq keladi, unda qo'rqoq xirillash uchun zarur bo'lgan ma'lumotlar mavjud.

Biz Yandex haqida pochta orqali gaplashamiz - men ushbu maqolani siz bilan baham ko'raman, aziz o'quvchilar, skrinshotlardan etarli sahifalar paydo bo'lishi bilanoq, biz ro'yxatda fayl bo'lsa - qanday qilib ochishni ko'rib chiqamiz. uni ustidan yatsy yanada manipulyatsiyasi uchun natijasida.

Men o'zim bu vazifa ustida uzoq vaqt ishlayapman va Yandex pochta dasturlari bilan ishlaganim aniq bo'lsa-da, kerakli natijaga erishish uchun ko'p vaqt va asablarni sarfladim.

  1. Mening birinchi rahm-shafqatim shundaki, veb-ishlab chiquvchilar ko'p bo'lganligi sababli, men tezda eng muvaffaqiyatli (foydali) Yandex bo'lishdan ko'ra, tasodifiy ravishda shunga o'xshash butlarni intensiv ravishda qidira boshladim.
  2. Shunday qilib, u erda foydali ma'lumotlar mavjud, garchi bu etarli bo'lmasa-da, lekin bu turdagi skriptni yozish uchun muhim (quyida batafsilroq).
  3. O'sha soatda, u skript yozish uchun bir vaqtning o'zida, Yaki mohiyati chaqirdi: Yandex, Zamovnika depozit Doba bir marta XLS formatidan IZ Narx ishlab chiqarish varaq keldi, yogo hogicly gobbled emas ( Danimi bilan tartibli bo'lgan rospassvati, do'kon, yo'lda, natijadan tushkunlikka tushadi keyin bu yerda, uni yoqing).
  4. Skriptni yozishdan oldin qilishimiz kerak bo'lgan birinchi narsa - bu to'qqiz banddan iborat bo'lgan harakatlar rejamiz:
  5. Biz pochta protokollari orqali kirishni rad etish uchun pochtani o'rnatmoqdamiz;
  6. Shuni ta'kidlash kerakki, PHP dasturining tuzilishi fayllarni kodlashda muhim ahamiyatga ega;
  7. Pochta IMAP protokoli va uning imkoniyatlaridan xabardor bo'ling;
  8. Biz Yandex-ga bulut hisobining login va paroli orqali pochta orqali ulanamiz va ushbu bosqichda tasdiqlanishi kerak;
  9. Keling, bargning boshini qirqamiz;

Bargning tanasi olib tashlanadi va qayta ishlanadi;

Biz biriktirilgan fayllarni olib tashlaymiz va saqlaymiz;

Wikonan robotini tasavvur qiling;



Zrobimo visnovki.


Mavzu juda katta, lekin men hamma narsani iloji boricha ixcham va tushunarli qilib qo'yishga harakat qilaman.

Balki, ko'ramiz.

Ushbu dastur uchun biz dasturning murakkab tuzilishini aniqlay olmaymiz, uning ba'zilari kerak emas, lekin biz faqat keraklilarini qo'shamiz (men Sublime Text muharririda ishlayapman):


  • tmp - varaqdan fayllarni biriktirishingiz mumkin bo'lgan papka, chunki unday emas;
  • .htaccess – server qismining konfiguratsiyasi, masalan, Apache serveri;
  • functions.php – funksiyalarimizni shu yerga qo‘shish mumkin;
  • main.css – uslublar fayli;
  • index.php - dasturga kirish nuqtasi;

Biz UTF-8 yordamida kodlaymiz va shuning uchun quyidagi qatorlarda .htaccess faylini eslab qolamiz:

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

IMAP protokoli

Birinchi nuqtaga o'tsak, siz POP3 protokoli orqali Yandex pochtasidan ham foydalanishingiz mumkinligini ko'rishingiz mumkin.

Xo'sh, nega IMAPning o'zi?

Ikki IMAP kanali, yangiroq va muqobil POP3 o'rtasida bir qator afzalliklar mavjud (ularni Vikipediyani ko'rib chiqish orqali o'qishingiz mumkin), ammo bizning tanlovimizda faqat yangilari tanlangan. Men har qanday alohida farq haqida qayg'urmayman, aksincha, varaqni kesishning aniq vazifasi ostida vikorystuvatimu. Agar biron-bir sababga ko'ra siz POP3 protokolidan foydalanishingiz kerak bo'lsa, u holda IMAP uchun qo'llaniladigan barcha funktsiyalar buning uchun ishlaydi.


Biz Yandex-ga qo'shimcha IMAP protokoli yordamida pochta orqali ulanamiz

Pochtaga ulanish uchun biz uchta parametrni bilishimiz kerak: pochta login, parol va pochta serveri manzili.<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

Shuningdek, biz qo'shimcha sarlavha orqasida UTF-8 kodlashni oldindan belgilaymiz va taxalluslarni ko'rsatishni yoqamiz.

Biz functions.php faylini qo'shamiz va nima qilishimiz kerakligini o'rnatamiz.

$mail_filetypes massivi bizga kerakli fayl formatlarini belgilaydi.

Shunday qilib, muayyan fayllarni olib tashlash va o'chirishga hojat qolmasligi uchun ishlashga qaror qilindi.

Pochta bilan ulanish qo'shimcha imap_open() funktsiyasi tomonidan qo'llab-quvvatlanadi, bu boshqa tomondan IMAP oqimini va boshqa tomondan yolg'onni aylantiradi (aks holda kechirimlarni o'chirish uchun, lekin bunday emas).

Biz ulanish indikatoridan o'tib, qo'shimcha imap_close() funktsiyasidan foydalangan holda iplar bilan ishni yakunlaymiz.

Ikki funktsiya o'rtasida asosiy aqliy operator keladi.

Keyinchalik imap_num_msg() yordamiga ulanganda, pochta orqali varaqlar soni aniqlanadi va biz oqimdan barcha kerakli ma'lumotlarni joylashtirgan massiv qo'shiladi.

Keyinchalik, tsikl paydo bo'ladi, unda uning raqami bilan teri varaq hosil bo'ladi (raqamlash 1 ga o'xshaydi).

Funktsiya check_utf8($charset)( if(strtolower($charset) != "utf-8")( return false; ) return true; ) funktsiya convert_to_utf8($in_charset, $str)( return iconv(strtolower($in_charset)) , "utf-8", $str); ) funksiya get_imap_title($str)( $mime = imap_mime_header_decode($str); $title = ""; foreach($mime sifatida $kalit => $m)( if(!check_utf8) ($m->charset))( $title .= convert_to_utf8($m->charset, $m->matn )else( $title .= $m->matn; ) ) $title; )

Uni nomlang va menimcha, qolgan funktsiyani tushuntirish yaxshidir.

U bir qator kodlashlarni oladi va imap_mime_header_decode() yordamida ularni dekodlaydi, buning natijasida ob'ektlar massivi aylantiriladi, ularning har biri ikkita kuchga ega: belgilar to'plami va matn.

Keyin hamma narsa oddiy: tsikl kodlashni tekshiradi, uni UTF-8 ga keltiradi va mavzuni bitta sarlavhaga yopishtirib, uni aylantiradi.

Endi index.php fayliga va qolgan parametrga qaytaylik:

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

Shu nuqtada, barg boshini kesish tugallanadi.

Bargning tanasi bilan ishlagan

Biz to'plangan varaq ma'lumotlaridan massivimizni bosqichma-bosqich shakllantirishni davom ettiramiz va endi tanani olib tashlash uchun ikkita funktsiyadan tezda foydalanishimiz kerak:

// varaq tanasi $msg_structure = imap_fetchstructure($connection, $i);

  • $msg_body = imap_fetchbody($connection, $i, 1);
  • Birinchi o'zgarish $msg_structure harfning tuzilishini o'z ichiga oladi - bu ob'ekt, undan siz juda ko'p asosiy ma'lumotlarni topishingiz mumkin, ammo bu ob'ektning qisman ko'rinishi quyida keltirilgan:
  • Bizning vazifamiz uchun nima muhim:

turi - varaq tanasining birinchi turi, siz pochta orqali qabul qilgan narsangizga qarab, uni 0 dan 7 gacha o'zgartirish mumkin (har bir raqam varaq tanasidagi tarkib turini ko'rsatadi);

kodlash - tanani uzatish kodi, 0 dan 5 gacha o'zgaradi (0 - 7BIT, 1 - 8BIT, 2 - BINARY, 3 - BASE64, 4 - QUOTED-PRINTABLE, 5 - BOSHQA);

Boshqa funksiya, imap_fetchbody() varaqning asosiy qismini, odatda, kodlangan shaklda oladi.

Endi men varaq tanasining yakuniy versiyasini saqlash uchun o'zgartirish kiritaman:

$body = "";

Keling, functions.php fayliga qaytaylik va rekursiv funksiya yozamiz:

Funktsiya recursive_search($structure)( $encoding = ""; if($structure->subtype == "HTML" || $structure->type == 0)( if($structure->parameters->atribut == " charset")( $charset = $structure->parameters->value; ) return array("encoding" => $structure->kodlash, "charset" => strtolower($charset), "subtype" => $structure- >subtype); charset = $structure->parameters->value ) return array("kodlash" => $structure->kodlash, "charset" => strtolower($charset), "subtype" => $structure-> subtype );

Recursive_search() funktsiyasi bitta parametrni oladi - varaqning tuzilishi, bu erda u keyinchalik vakolatlarni tekshiradi va uchta parametrni taqdim etadi: kodlash, belgilar to'plami, pastki tur.

Rekursiyadan chiqish nuqtasi nol o'rtaga ega bo'lgan quvvat qismlarining mavjudligi.

Bu erda tushuntirish uchun ko'p narsa yo'q, lekin menimcha, bu nima ekanligi aniq.

Keling, varaqning tanasini aylantirish uchun yana bitta funktsiyani qo'shamiz, bu bizga keyinroq kerak bo'ladi:

Funktsiya strukturasini kodlash($encoding, $msg_body)( switch((int) $encoding)( 4-holat: $tana = imap_qprint($msg_body); break; 3-holat: $body = imap_base64($msg_body); break; 2-holat: $body = imap_binary($msg_body); 1-holat: $tana = imap_8bit($msg_body);

$recursive_data = recursive_search($msg_structure);

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

Varaqning asosiy qismi ham original matnga, ham o'ziga xos uslublarga ega HTML tartibiga ega bo'lishi mumkin.

U BASE64 da kodlangan, shuning uchun vizualizatsiya paytida bizning joylashuvimiz allaqachon qayta ishlanmagan.

Qo'shimchalar fayllari

Axis, biz asta-sekin dasturimizni yozishning oxiriga yaqinlashmoqdamiz:< count($msg_structure->// Fayl qo'shimchalari if(isset($msg_structure->parts))( for($j = 1, $f = 2; $j)

qismlar);

$j++, $f++)( if(in_array($msg_structure->qismlar[$j]->subtype, $mail_filetypes))( $mails_data[$i]["ilovalar"][$j]["type"] = $msg_structure->parts[$j]->subtype;$mails_data[$i]["attachs"][$j]["size"] = $msg_structure->parts[$j]->baytlar $i] [ "attachs"][$j]["name"] = get_imap_title($msg_structure->parts[$j]->parameters->value $mails_data[$i]["attachs"][$ j][ "); file"] = structure_encoding($msg_structure->parts[$j]->kodlash, imap_fetchbody($connection, $i, $f));file_put_contents("tmp/".iconv("utf-8") , " cp1251 ", $mails_data[$i]["attachs"][$j]["name"]), $mails_data[$i]["attachs"][$j]["fayl"]); )

Ko'p narsa kamroq, bu biriktirilgan faylga ishlov berish ancha kam ekanligini ko'rsatadi va endi nima uchun?


Fayl bilan ishlash printsipi varaqning tanasi bilan ishlashga o'xshaydi, faqat ushbu bosqich qismlar massividagi bittadan boshlanadi.

Sizga kerak bo'lmagan turlar ro'yxatini tekshirishni unutmang.<?php echo($mail_login);?>

file_put_contents() qo'shimcha oddiy funksiyasidan foydalanib, biz faylni serverimizga tmp papkasida saqlaymiz.

Men yaxshiroq natijalarni xohlayman!

Bu jarayonda biz $mails_data maʼlumotlaridan massiv hosil qildik va vizuallashtirish uchun biz u bilan bevosita ishlaymiz.
Ushbu maqolada men pochtamdagi test varag'ini tanladim, natijada bizdan nima chiqqanini ko'rib chiqaylik:
Har qanday o'q massivni tark etish uchun deyarli javobgardir, afsuski, men maxsus sabablarga ko'ra faylni tortib olishga majbur bo'ldim.
Keling, HTML sxemamizga o'tamiz:
Yandex Post |
$i--) ( $header = imap_header($imap, $i); $fromInfo = $header->dan; $replyInfo = $header->reply_to; $details = array("fromAddr" => (isset($) ) fromInfo->mailbox) && isset($fromInfo->xost)) $fromInfo->xost: "", "fromName" => $fromInfo->shaxsiy: "", "replyAddr" => (isset($replyInfo->pochta qutisi) && isset($replyInfo->host)) $replyInfo->xost : "", "replyName" => (. isset($replyTo->shaxsiy)) $replyto->shaxsiy: "", "subject" => (isset($header->subject)) $header->subject: "", "udate" => (? isset($header->udate)) ? $header->udate: ""); $uid = imap_uid ($imap, $i);
Yandex Posta (Vkhidni) |
Varaqlar soni:
Barglari yo'q
$mail):?>
Vaqt tamg'asi:
Sana:
Kimga:
Mavzu:

Baza 64 varaq:


Fayl qo'shimchalari:

Mavjud kodlash turlarining to'liq ro'yxati:

Ushbu maqoladagi barcha bosqichlarni tugatgandan so'ng, siz kerakli natijaga erishasiz, ammo hamma narsa ko'rinadigan darajada oddiy emas - oldini olish kerak bo'lgan tuzoqlar mavjud.

Muayyan vazifa uchun skriptni yozishda, barcha bosqichlarda kodlashni kuzatish kerak, sahifalar turli manbalardan kelib chiqishi mumkin, ularning har biri o'z nuanslariga ega bo'lishi mumkin;
Yandex Post va uning hujjatlari vaqti-vaqti bilan yangilanib turishini ta'minlash muhim, shuning uchun pochta dasturlari bilan ishlash uchun turli nuqtalar bo'lishi mumkin.

Menda bor narsa shu, sizni ishontirib aytamanki, ushbu maqola Yandex pochtasining arzonroq varianti bilan ishlashda evaziga berilgan.

Tashqariga chiqmang va qo'shimchalardan varaqni olib tashlamang (
Agar siz pochtani fayl bilan majburlasangiz, u holda varaq matni yo'qoladi
Iltimos, menga yordam bering

© 2022 androidas.ru - Android haqida hamma narsa