- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 06/98

Kterak poštu na Linuxu Pmailem čísti

Dan Ohnesorg a Milan Keršláger, 12. června 1998

Pokud se rozhlédnete po českých školách, zjistíte, že téměř všude se používá jako klient elektronické pošty Pegasus Mail, dílo to Davida Harrise. Jeho popularita je celosvětově obrovská a jeden čas byl dokonce prostřednictvím firmy Novell prodáván pod názvem First Mail jako oficiální klient novellského poštovního systému MHS, posléze ho v této funkci nahradil GroupWise. Pegasus Mail je šířen jako freeware, s několika výhradami - nejsou k dispozici zdrojové texty, program se nesmí prodávat (může být součástí nějakého placeného balíku, ale nesmí být prodán sám o sobě), nesmí se používat pro rozesílání nevyžádaných reklamních mailů a nesmí být modifikován bez předchozího svolení autora.

Velikou výhodou je úzká integrace se serverem Novell Netware. Pegasus mail si načítá konfiguraci přímo ze serveru, umí lokálně doručovat přímo uživatelům, bez potřeby dalšího programu běžícího na serveru, umí vyhledávat lokální uživatele podle jmen uložených v tzv. bindery databázi (mnohem složitější obdoba souboru /etc/passwd, dostupná ke čtení a zápisu jedině službami běžícími na serveru (no za tuto větu by se mi každý hacker vysmál, ale pro naše účely toto zjednodušení stačí)). Podporuje tzv. nástěnky, které fungují asi jako news, ale pouze lokálně. Je velice dobře rozšiřitelný, umožňuje uživatelskou definici menu, tím pádem také překlad do jiných jazyků, uživatel si definuje vlastní tabulky pro překlad mezi znakovou sadou svého počítače a ISO znakovými sadami, používanými pro transport pošty po síti. V současné době jsou k dispozici kompletně české překlady jak menu, tak nápovědy. Pmail je k dispozici ve verzích pro DOS, Windows, Windows 95/NT a Macintosh. Obrovskou výhodou je identický formát používaných souborů, takže si můžete poštu číst současně pod všemi zmíněnými operačními systémy s výhradou, že verze pro Macintosh není lokalizovaná a asi v dohledné době ani nebude. Vyrovná se i s tím, že je spuštěn vícekrát na více stanicích v síti pod stejným uživatelem. Není ale možné ze dvou počítačů modifikovat stejnou složku, kam se pošta ukládá, to ale obvykle příliš nevadí, protože novou poštu lze číst bez omezení.

Logika jeho práce je velmi prostá a dobře zdokumentovaná. Mějme uživatele A, uživatel A má pod Novellem číslo AN, které je mu přiděleno při vytvoření účtu na serveru. Tímto číslem je uživatel identifikován v bindery databázi. Na disku, který se obvykle jmenuje SYS: existuje adresář \MAIL\AN, který má uživatel sám pro sebe. Tam se ukládá veškerá přicházející pošta, každá zpráva do jednoho souboru, který se jmenuje nějakým náhodným číslem (podle data, hodiny a výsledku fce random()). Tomuto souboru je přidělena přípona .cnm. Pmail po startu hledá všechny souboru *.cnm a zobrazí je. Cnm soubory obsahují čistou mailovou zprávu ve formátu podle RFC 822 a navazujících norem (MIME a pod.). Uživatel si dopisy potom přesouvá do složek podle své volby, ve složce je již více dopisů v jednou souboru, nebo může využít služeb automatického filtrování a přesouvat dopisy do jednotlivých složek při otevření nové pošty pomocí pravidel, která si sám nadefinuje. Verze pro Windows navíc umožňuje aplikovat filtrovací pravidla na odesílané dopisy nebo na jednotlivé složky. Také při odesílání lze na dopis také aplikovat pravidla, která rozhodnou o osudu zprávy. Pokud je zpráva lokální, Pegasus mail zjistí pro jméno adresáta jeho číslo a uloží mu zprávu do jeho adresáře \MAIL\číslo. Pokud zpráva splní nějaké jiné filtrovací pravidlo, adresa třeba začíná FAX: je např. spuštěn externí program. Pokud je vyhodnocena jako Internetová, je uložena do předem vybraného adresáře kde je zpracována typicky dalším Harrisovým programem - Mercurym, který zajistí doručení. Toto chování je implicitní, ale dá se změnit, třeba při instalaci na server Windows NT se místo čísel používají přímo jména uživatelů.

Co z předchozího vyplývá pro nás. Je zřejmé, že by nebylo složité došlou poštu ukládat do adresáře MAIL a odesílanou vyzvedávat z adresáře určeného pro Mercuryho prostředky Linuxu. Uživatelům by to přineslo "svobodu" lokálního zpracování pošty, snadné ukládání příloh dopisů, rychle startující program, nepotřebující služby často problematického telnetu a bezproblémovou transparentní podporu češtiny. To samozřejmě nemohlo nezůstat nepovšimnuto a tak bych vás rád seznámil s řešením, které použil Milan Keršláger. Výhodou je i to, že budete moci použít Linux i na mnoho dalších funkcí, pro který byste jinak potřebovali další stroj.

Budete potřebovat emulátor služeb serveru Novell Netware, který se pod Linuxem jmenuje Mars_nwe. Dále samozřejmě fungující IPX na stanicích a Pegasus mail. Mars na Linuxu asi máte, je součástí běžných distribucí, jak se instaluje IPX na stanice je popsáno v dokumentaci Marsu.

Pegasus mail pro DOS (spolu s pconfig.exe) najdeme na URL: http://risc.ua.edu/pub/network/pegasus/pmail340.zip

Doporučuji však používat spustitelný soubor z poslední preview, podle naši zkušeností je dostatečně stabilní a spolehlivý: ftp://risc.ua.edu/pegasus-previews/pmdos_pv.zip

Instalace Pmailu spočívá v rozbalení do adresáře, který si vyberete. Potom nastavíte spuštěním programu pconfig.exe cesty k adresáři pro poštu, jméno serveru a podobně, tato část je popsána v konfiguraci serveru. Spustíte program pmail.exe a kouknete se jak funguje. Při tom vznikne v poštovním adresáři soubor pmail.ini, ten si prohlédnete, nastavíte konfigurační volby podle vlastní úvahy, především ale nastavíte jako kódování místo ISO-8859-1 ISO-8852-2. Potom soubor okopírujete pod názvem pmdflts.ini do adresáře, kde je uložen pmail.exe a smažete nepoužité konfigurační parametry. Podle této šablony se budou zakládat konfigurace uživatelů. Pro korektní funkci češtiny bude ještě potřeba stáhnout českou podporu ze stránek pana Jiřího Kuchty na http://www.fee.vutbr.cz/~kuchta/pmail nebo ze stejného adresáře odkud jste stáhli základní instalaci pmailu. Instalace popsána tamtéž. Tím máme pmail funkční a dáme se do serveru.

Na serveru je konfigurace následující, Pmail umí odchozí poštu směrovat do tiskové fronty nebo do sdíleného adresáře. Pro naši potřebu je výhodný sdílený adresář, protože do něj Pegasus odchozí dopisy jednoduše umístí jako soubory, které můžeme snadno zpracovávat skriptem. Informace o umístění tohoto adresáře je uložena v bindery databázi a tak se nemusíme starat o jednotlivé konfigurace pro každého uživatele zvlášť. K jejímu nastavení slouží program pconfig.exe, který je součástí distribuce Pegasus mailu. Toto nastavení respektují obě verze Pegasa (DOSová i pro Windows). Jako SUPERVISOR (ekvivalent roota na serveru Novell) spustíme pconfig.exe a nastavíme v menu: "SMTP Internet mail Interface:"

 Spool interface?:   Y
 Output path:        SYS:MAIL\SMTP
 Enabled?:           Y
 Preferred?:         N
 Use always?:        N
 This server's name: server.domena.cz
 Our time zone:      +0100 MET
 Organization:       Nějaké jméno naší organizace

Umístění spool adresáře je prakticky libovolné, pokud ho chceme skrýt, není špatné ho umístit jako klasický mailový adresář do SYS:MAIL. Uživatele potřebují do tohoto adresáře pouze právo C (Create), což je v Linuxovém prostředí drwx-wx-wx. Položka "This server's name" určuje, co je přidáno za jméno a zavináč v adrese odesílatele. Může to být konkrétní jméno stroje nebo jen doména - záleží na konfiguraci našeho poštovního systému. Časová zóna je ponechána na nás. Uvedená hodnota je starší, poslední dobou se setkávám se zkratkou CEST, ale jistě si vyberete formát dle vlastní úvahy. Mezi letní a zimní časovou zónou musíte přepínat "ručně". Jméno organizace je volitelné a bude také přidáno do hlaviček odesílaných dopisů.

Měl bych se také zmínit o bezpečnosti. Obvyklá situace je taková, že všichni uživatelé mají právo zápisu do poštovních adresářů všech ostatních uživatelů. To není šťastné řešení, zvláště pokud dbáme na bezpečnost. Umožňuje totiž kromě přímého doručení dopisu (jednoduché vytvoření *.cnm souboru v adresátově mailovém adresáři) také podvrhnout komukoliv jakýkoliv soubor, který uživatel ještě v poštovním adresáři nemá. Nemusím zdůrazňovat, jak to může být nepříjemné. Řešením může být odebrání tohoto práva a ponechání jediného přístupného adresáře pro všechny uživatele - spool adresáře pro odchozí dopisy. Pak je možné doručit všechny dopisy jen přes externí poštovní systém (náš script nebo Mercury) a odstraníme tak zmíněné potenciální nebezpečí. V tomto případě je však nutné nastavit v pconfig.exe volbu "Use always?" na "Y", aby se Pegasus nepokoušel místní poštu doručovat přímo, ale použil spool adresář.

Celá finta, jak poštu přijímat a odesílat, je realizována dvěma scripty. Jistě existují i elegantnější řešení přes procmail a podobně, ale tohle je vyzkoušené a funkční.

Začneme tím jednodušším scriptem, který slouží na odesílání pošty do internetu. Je na výpise Script pro odesílání pošty do Internetu.


#!/bin/sh

SMTP_DIR="/home/nwserv.sys/mail/smtp"

for file in $SMTP_DIR/*
do
  if [ -e $file ]; then
    FROM=`grep "^From:" $file | head -1 | sed -e 's/.*<//' -e
    's/>.*//'` TO=`fromdos < $file | sed -n '2,/^$/p'` echo -n " 
    $FROM -> $TO ..." fromdos < $file | sed '1,/^$/d' | sendmail $TO
    echo " done." rm $file
  fi
done

Výpis č. 1: Script pro odesílání pošty do Internetu

A co vlastně dělá? Musí zajistit předání pošty ze sdíleného adresáře do fronty sendmailu. Pmail odesílanou poštu ukládá do adresáře, kterému se v pconfigu říká spool directory, v našem scriptu je to SMTP_DIR a skript z něj vybere všechny soubory a v nich nalezne položku From: a To: (tyto položky jsou v souboru dvakrát, jednou pro Mercuryho a podruhé v těle zprávy, script vybírá první variantu, druhá nemusí být např. u BCC: validní, z těla zprávy je vybíráno From: ale jen pro diagnostické účely). Poté je vyvolán program sendmail, který poštu uloží do fronty.

A teď složitější script Třídění pošty.


#!/usr/bin/perl

$mail_dir  = "/home/nwserv.sys/mail/user";
$spoll_dir = "/var/spool/mail";

sub cnm_from_file {
  $number = 0;
  $close  = 0;
  while ( $line = <VSTUP> ) {
    chop ($line);
    if ( $line =  /^From / ) {
      while ( -e "${mail_dir}/${user_name}/${number}.cnm" ) {
        $number++;
      }
      if ( $close != 0 ) {
        close (VYSTUP);
      } else {
        $close = 1;
      }
      if (! open (VYSTUP, ">${mail_dir}/${user_name}/${number}.cnm") )
      {
        print "nemohu zapsat do souboru
        ${mail_dir}/${user_name}/${number}.cnm\n"; return 1;
      } else {
        print "  vytvarim ${user_name}/${number}.cnm ...\n";
      }
    }
    print VYSTUP "$line\r\n";
  }
  close (VYSTUP);
  return 0;
}

opendir(SPOOL, $spoll_dir) || \
   die "nemohu cist z adresare $spoll_dir";
while ( $user_name = readdir(SPOOL) ) {
  if ( -f "${spoll_dir}/${user_name}" && -s
  "${spoll_dir}/${user_name}") {
    rename ("${spoll_dir}/${user_name}",
    "${spoll_dir}/${user_name}.lock") || \
         die "nemohu prejmenovat soubor ${spoll_dir}/${user_name}";
    open (VSTUP, "${spoll_dir}/${user_name}.lock") || \
         die "nemohu otevrit soubor ${spoll_dir}/${user_name}.lock";
    if ( &cnm_from_file ) {
      close (VSTUP);
      rename ("${spoll_dir}/${user_name}.lock",
      "${spoll_dir}/${user_name}");
    } else {
      close (VSTUP);
      unlink ("${spoll_dir}/${user_name}.lock") || \
           die "nemohu smazat soubor ${spoll_dir}/${user_name}.lock";
    }
  }
}
exit 0;

Výpis č. 2: Třídění pošty

Ten funguje takto:

Vybírá poštu z adresářů /var/spool/mail/jmeno a rozláme ji na jednotlivé soubory. Z těch vyrobí *.cnm soubory, které uloží do poštovního adresáře uživatele. Volí trochu odlišný postup než Pmail, vytváří soubory 0.cnm, 1.cnm a pokud již takový existuje, inkrementuje název, dokud se netrefí do volné pozice. Mail v unixovém mailboxu začíná "From jméno" od začátku řádku. (Není tam dvojtečka.) Aby se nemohlo stát, že dopis obsahující od začátku řádku From bude rozdělen, je před uložením do mailboxu From quotováno >From , tzv. vránu je tedy potřeba odstranit před uložením do cnm souboru. Script se nezabývá zamykáním mailboxu a jednoduše frontu přejmenuje na *.lock. Po zpracování je pošta na linuxu smazána. Script využívá toho, že Mars zakládá v poštovním adresáři adresář user s adresáři dle jmen uživatelů a linkuje je oproti adresářům MAIL\cislo_uzivatele. Dalším předpokladem úspěšného běhu je, že uživatelé mají na Novellu a v Linuxu stejná jména, a že vytvoříme link root->supervisor, nebo budeme poštu pro roota forwardovat jinému uživateli (klasickým souborem /.forward). Vytvoření linků povolíme marsu v sekci 16, konfiguračního souboru Marsu, kde nastavíme hodnotu buď 1 nebo 2. Česká dokumenace k Marsu je na http://www.spsselib.hiedu.cz/homedirs/~kerslage/manuals/linux/.

A teď již třešnička na dortu, jak to funguje celé dohromady. Nejdříve spustíme první script. Ten nám předá poštu od uživatelů do fronty, potom nahodíme sendmail, UUCP, ETRN či co vlastně používáme a poštu odešleme a přijmeme. A do třetice spustíme druhý script, ten nám poštu rozdělí mezi jednotlivé uživatele. První script není špatné pouštět pravidelně a často z cronu. Pmail totiž i lokální poštu, pokud obsahuje @ ukládá do fronty pro odesílání do Internetu.

A má to nějaké chyby? Jistě, nemohu tvrdit, že Pmail je naprosto bezchybný produkt, ale při běžném používání jich moc nenajdete. Pmailu pro Windows třeba nechutnají některé speciální případy MIME kódování, třeba BASE64 v hlavičkách, zato ale narozdíl od Netscape mailu umí odesílat hlavičky s diakritikou.

Za určitou závadu prezentovaného řešení lze považovat to, že k poště není nadále možné přistupovat přes POP3 a IMAP4 protokol. O podpoře pro POP3 se uvažuje, o IMAPu zatím ne, ale je zde samozřejmě možnost, že tento článek přiláká někoho, kdo by měl zájem s námi řešení dále rozvíjet a zdokonalovat. Kdo ví, třeba se jednou stane integrální součástí MARS NWE. Pokud máte pocit, že mluvím právě o Vás, určitě se nám ozvěte. *


- předchozí článek - následující článek - obsah - úvodní stránka -