Přístup do newsů pomocí PHP
Při vývoji některých dílčích informačních systémů v HKFree vyvstala potřeba komunikovat s newsy z PHP - proto vzniklo toto HOWTO. Příklady se snaží korektně řešit problematiku kodování češtiny (vychází z toho, že texty z PHP jsou v ISO-Latin-2).
Obsah
Co je třeba
- PHP
- IMAP funkce v PHP (imap_8bit, případně lze nahradit vlastní funkcí)
- PEAR
- PEAR modul Net_NNTP
Posting
<? require_once "Net/NNTP.php"; $nntp = new Net_NNTP; $ret = $nntp->connect("10.107.12.1", 119); if( PEAR::isError($ret)) { // handle connecting error echo $ret->getMessage(); } else { echo "Uspesne pripojeno :)"; $addheader = "Content-Transfer-Encoding: quoted-printable\n". "Content-Type: text/plain; charset=ISO-8859-2;"; $subject = "Žluťoučký kůň pěl čábelské ódy"; $subject = "=?ISO-8859-2?Q?" . imap_8bit($subject). "?=" ; $ret = $nntp->post($subject,"hkfree.popelnice","cenda@seznam.cz","Pokus Body",$addheader); if( PEAR::isError($ret)) { // handle posting error } } $nntp->quit(); ?>
Implementační poznámky
Unikátní identifikace příspěvku
Každá zpráva má unikátní identifikátor - je představován hlavičkou Message-ID (má jakýsi doporučený formát - viz RFC, můžete se kouknout taky do jakékoliv zprávy v newsech - pro představu). Není li tato hlavička součástí zasílané zprávy, vygeneruje ji newsserver.
Vygenerujete-li si tuto hlavičku sami (např. z ID dané entity ve vašem systému - viz např. tato hlavička u příspěvků ve skupině hkfree.webforum-mirror), můžete toho později využít:
- snadno lze poslat další zprávu jako reply (již do threadu - hlavička References)
- v rámci nezaručení dostupnosti newsserveru (viz dále) se nemusíte bát, že by se zpráva při nějakém nedefinovaném stavu, kdy se odešle 2x objevila v newsech 2x - podle Message-ID newsserver pozná že se jedná o totožnou zprávu a duplicitu zahodí
Pokud vám jde hlava kolem z věcí jako Message-ID a podobně, tak pro funkčnost nutné nejsou, jen korektně řeší některé situace, klidně něco implementujte bez toho a časem to lze dodělat.
Ošetření nedostupnosti news-serveru
Jelikož PHP aplikace může běžet na jiném serveru než newsy, může dojít k tomu, že newserver není dostupný v momentě kdy chceme zprávu odeslat.
V případě že příspěvky POŘIZUJEME z replikovatelného zdroje
Tj. například máme v systému entity (řádky v tabulce) ze který lze kdykoliv znovu vyrobit odesílaný příspěvek. Pak je třeba k entitám přidat atribut "nepodařilo se odeslat do newsů" a čas od času (třeba v cronu nebo obecně při každém požadavku na nějakou stránku aplikace) přojít entity a nalézt ty u kterých se má opakovat pokus o odeslání do newsů. Použijte hlavičku Message-ID vygenerovanou z ID řádku v tabulce pro identifikaci zprávy.
V případě že příspěvky NEPOŘIZUJEME z replikovatelného zdroje
Nutno založit v systému frontu neodeslaných příspěvků (např. tabulku) a čas od času se pokusit přeposílat příspěvky znovu. Použijte hlavičku Message-ID vygenerovanou z neopakovatelného ID (v tomto případě třeba timestamp + nějaký random) záznamu ve frontě v tabulce pro identifikaci zprávy.