Přístup do newsů pomocí PHP

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání

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).

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 newsservru (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.