Přístup do newsů pomocí PHP: Porovnání verzí

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání
 
Řádek 14: Řádek 14:
 
  $ret = $nntp->connect("10.107.12.1", 119);
 
  $ret = $nntp->connect("10.107.12.1", 119);
 
  if( PEAR::isError($ret)) {
 
  if( PEAR::isError($ret)) {
     // handle error
+
     // handle connecting error
 
     echo $ret->getMessage();
 
     echo $ret->getMessage();
 
  } else {
 
  } else {
Řádek 23: Řádek 23:
 
     $subject = "=?ISO-8859-2?Q?" . imap_8bit($subject). "?=" ;
 
     $subject = "=?ISO-8859-2?Q?" . imap_8bit($subject). "?=" ;
 
     $ret = $nntp->post($subject,"hkfree.popelnice","cenda@seznam.cz","Pokus Body",$addheader);
 
     $ret = $nntp->post($subject,"hkfree.popelnice","cenda@seznam.cz","Pokus Body",$addheader);
 +
    if( PEAR::isError($ret)) {
 +
        // handle posting error
 +
    }
 
  }
 
  }
 
  $nntp->quit();
 
  $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-servru ===
 +
Jelikož PHP aplikace může běžet na jiném servru 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.

Verze z 15. 4. 2005, 11:28

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-servru

Jelikož PHP aplikace může běžet na jiném servru 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.