Přístup k emailové schránce přes php může být velmi užitečný. Používal jsem IMAP například pro zpracování zpráv o pohybech na bankovním účtu (přinejmenším do doby, než moje banka konečně uveřejnila API) nebo pro integrovaný systém zpracování e-mailové komunikace přímo v e-shopu. Musí-li uživatel zpracovávat velké množství e-mailů, potom se z dlouhodobého hlediska investice času (nebo peněz) do vývoje webmail systému vyplatí.
PHP má integrovanou opravdu obsáhlou knihovnu funkcí pro práci s IMAP. Doporučuji nejprve důkladně prostudovat manuál: http://php.net/manual/en/book.imap.php
Nejprve potřebujeme nastavit správně připojení k mailserveru. To bývá největší problém, proto se pokusím funkci imap_open probrat detailněji než odstatní funkce. Jak můžete zjistit v manuálu, tato funkce má tři povinné parametry:
imap_open ( string $mailbox
, string $username
, string $password
);
Kámen úrazu spočívá v prvním parametru. Ten má následující formát:
„{“ remote_system_name [„:“ port] [flags] „}“ [mailbox_name]
Budete-li se chtít připojit například do schránky na wedosu, potom remote_system_name je imap-98060.m60.wedos.net (čísla v adrese budete mít téměř určitě jiná).
Port pro IMAP je 993 využíváte-li protokol zabezpečení SSL/TLS nebo 143 chcete-li STARTTLS.
Bezprostředně za číslem portu se uvádí návěští oddělené lomítkem. V mém příkladu níže jsem nastavil ujištění, že chci imap, šifrování ssl (podobně jako u https) a novalidate-cert, protože na sdíleném hostingu jsou většinou jen daným serverem podepsané certifikáty.
Jako mailbox_name uvádím INBOX, což je výchozí hodnota chcete-li vstoupit do schránky příchozí pošty.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php $mailserver = "váš.mailserver.cz"; $ucet = "váš.účet@superdoména.cz"; $heslo = "vašeheslo"; $mbox = imap_open("{".$mailserver.":993/imap/ssl/novalidate-cert}INBOX", $ucet, $heslo); $pocet_zprav = imap_num_msg($mbox); for( $i = 1; $i <= $pocet_zprav; $i++ ) { $text = imap_body($mbox, $i); // načti zprávu z INBOXu echo "Zpráva č.".$i.":<br />"; echo $text; echo '<hr />'; mb_internal_encoding("UTF-8"); if (mb_strpos($text,'Potřebujete peníze?') !== false) { //multi-byte strpos pro práci s utf8 $res = imap_delete($mbox, $i); if( $res ) { echo = 'Zpráva č. '.$i.' byla smazána, protože obsahovala slova <b>Potřebujete peníze?</b>.<br>'; } } } imap_expunge($mbox); //smazání všech zpráv označených ke smazání echo imap_errors(); imap_close($mbox); ?> |
Funkce imap_num_msg() zjistí počet zpráv v INBOXu. Pomocí cyklu for je všechny zpracujeme. Funkce imap_body() předává obsah těla zprávy. V naší ukázce se podíváme, jak mazat zprávy. Smažeme například všechny zprávy, které obsahují v těle text „Potřebujete peníze?“. Pokud je podmínka splněna, funkcí imap_delete() zprávu označíme ke smazání. V té chvíli však ještě není nadobro smazána! O to se postará až zavolání funkce imap_expunge() těsně před skončením celého skriptu (nevolejte tuto funkci v cyklech). Odznačit zprávu určenou ke smazání lze funkcí imap_undelete().
Prohlédávat e-maily by mělo jít lépe s funkcí imap_search() než s mb_strpos().
Slušností je nakonec uzavřít imap spojení.