Az Exim és a Mailman együtt
===========================

[Ez a fájl Nigel Metheringhamz "HOGYANIS - Az Exim és a Mailman együtt"
 dokumentációjának egy kivonata, amelyben a 2.0.x verziójú Mailman-ról
 és a 3-as verziójú Exim-ről lehet olvasni. A frissített dokumentációban
 a 2.1-es Mailman és 4-es Exim összekapcsolásáról is lehet olvasni. Az
 eredeti dokumentációt az alábbi címen lehet olvasni:
 http://www.exim.org/howto/mailman.html ]


Mailman beállítása
------------------

A Mailman-t nem kell a hagyományostól eltérő módon beállítani, mint ahogy
az a Mailman telepítési dokumentációjában le van írva. Mindössze a
mailman uid/gid értékeit kell az Exim konfigurációjának megfelelő helyein
megadni.
   
Exim beállítása
---------------

Az Exim beállításával a Mailman-ben létrehozott listák automatikusan,
további bejegyzések nélkül megjelennek és használhatóak lesznek.

Ennek a beállításnak a hátránya az, hogy gyenge teljesítménnyel működik 
olyan rendszereken, amelyek több különböző levelező tartomány listáit 
szolgálják ki. Igaz, hogy a Mailman képes kezelni virtuális tartományok 
kezelésére, de egyelőre nem képes kezelni ugyanaz a telepített Mailman 
azonos névvel, de eltérő tartományban található listákat. Ez a jövőben 
változni fog. (Lejjebb különböző változatokról lehet olvasni, amelyekkel 
a virtuális tartományokat lehet megfelelően kiszolgálni.)
      
A később bemutatott konfigurációs állomány részleteket azon már működő Exim
konfigurációs részbe kell elhelyezni, amely azon tartomány levelezéséért
felelős, ahol a lista működik.  Ha ez a tartomány eltér az Eximben megadott 
tartományoktól, akkor a következőket kell tenni:

  * adjuk hozzá a local_domains-hez a lista tartományát, 
    pl. sajat.listam.domain

  * adjuk a "domains=sajat.listam.domain" beállítást a lista átirányító
    (director) részéhez

  * (ha szükséges) a többi átirányítónál vegyük fel ezt a tartományt a
    figyelmen kívül hagyandó tartományok közé.

[Megjegyzés: a leírásban található beállítások mind 3-as, mind 4-es Eximhez
egyaránt használhatóak. 3-as Eximnél 'local_domains' beállításra van
szükségünk, míg a 4-es verzióban többnyire a 'local_domains'-ben megadott
tartománylistára. Ha nem így használjuk az Eximet, akkor valószínűleg 
alapos Exim beállítási ismeretekkel rendelkezünk, így nem lesz nehéz
módosítani a később ismertetett beállításokat. 4-es Eximben az átirányítók
(directors) rész megszűnt, szerepét a routers rész vette át, így ha 4-es
Eximet használunk, akkor mindenhol ahol a dokumentáció átirányítót említ
mi routert értsünk.]

Függetlenül attól, hogy melyik Exim verziót használjuk az Exim konfigurációs
állományának általános beállítások részébe néhány változóz kell megadnunk.
Továbbá egy új továbbító részt is létre kell majd hoznunk. 3-as Eximnél
egy új átirányító, míg a 4-es verzióban egy új router tölti be majd
ugyanazt a szerepet.

Végül pedig érdemes tudni, hogy ezekkel a beállításokkal ugyanazon a
gépen egymás mellett működhet a Mailman 2.0-ás és 2.1-es verziója is.
Ekkor "mailman" helyett hivatkozhatunk "mm21" névvel a másik, újabb
verzióra, pl. MM21_HOME, mm21_transport, stb.


Általános beállítások
~~~~~~~~~~~~~~~~~~~~~

Először is ez Exim konfigurációs állományának elejéhez adjuk a következő
változókat. A változók segítségével egyszerűbben kezelhetőek a később
megadott átirányító és router beállítások. Természetesen a saját 
rendszerünk szerint módosítsuk a megadott értékeket.

  # A telepített Mailman 'home' könyvtára
  MAILMAN_HOME=/usr/local/mailman
  MAILMAN_WRAP=MAILMAN_HOME/mail/mailman

  # Mailman felhasználó és csoport azonosítója, egyeznie kell a Mailman
  # bellításakor használt --with-mail-gid kapcsolónál megadott értékkel
  MAILMAN_UID=mailman
  MAILMAN_GID=mailman


Transport rész Exim 3-hoz
~~~~~~~~~~~~~~~~~~~~~~~~~
    
Az Exim konfigurációs állományának transports fejezetéhez adjuk a következő
sorokat, kb. az első és második "end" tartalmú sor közé kell beszúrni a
következőket:

  mailman_transport:
    driver = pipe
    command = MAILMAN_WRAP \
              '${if def:local_part_suffix \
                    {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
                    {post}}' \
              $local_part
    current_directory = MAILMAN_HOME
    home_directory = MAILMAN_HOME
    user = MAILMAN_USER
    group = MAILMAN_GROUP


Átirányító rész Exim 3-hoz
~~~~~~~~~~~~~~~~~~~~~~~~~~

Ha 3-as Eximet használunk, akkor a konfigurációs állomány átirányító 
részéhez a következőket kell adni (az átirányítók a második és harmadik
"end" tartalmú sor között találhatóak). Fontos, hogy itt számít a sorrend
-- pl. ha ezt az irányítót az aliasállomány átirányítójára való hivatkozás
elé tesszük, akkor a Mailman bejegyzései (aliases) a rendszer bejegyzéseknél 
magasabb érvényűek lesznek.

  # A listához tartozó összes címet kezeli ez a rész.
  # Automatikusan azonosítja a listákat a MAILMAN_HOME könyvtárban
  # található lists/$local_part/config.pck állományok alapján.
  mailman_director:
    driver = smartuser
    require_files = MAILMAN_HOME/lists/$local_part/config.pck
    suffix_optional
    suffix = -bounces : -bounces+* : \
             -confirm+* : -join : -leave : \
             -owner : -request : -admin
    transport = mailman_transport


Router rész Exim 4-hez
~~~~~~~~~~~~~~~~~~~~~~

4-es Eximben az átirányítók helyett routereket kell használni. Ezen túl a 
konfigurációs állomány felépítése is megváltozott -- ABC sorrendet használ,
így itt a router rész a transport rész elé kerül. Tegyük a router beállítást
a router részbe, amely a "begin routers" sor után kezdődik. El ne felejtsük,
hogy a megadott sorrend itt még inkább számít.

  mailman_router:
    driver = accept
    require_files = MAILMAN_HOME/lists/$local_part/config.pck
    local_part_suffix_optional
    local_part_suffix = -bounces : -bounces+* : \
                        -confirm+* : -join : -leave : \
                        -owner : -request : -admin
    transport = mailman_transport


Transport rész Exim 4-hez
~~~~~~~~~~~~~~~~~~~~~~~~~

A 4-es Eximhez használhatjuk a 3-as Eximben megadott transport bejegyzést,
nyugodtan másoljuk be valahova a "begin transports" sor után a 3-as Eximnél
ismertetett beállításokat.


Megjegyzés
~~~~~~~~~~

Az Exim-et úgy kell beállítani, hogy a kézbesítés elfogadható mértékű
legyen - pl. a max_recipients ne valami nagyon kis érték legyen, és a
biztonsági beállítások is értelmes szintet eredményezzenek - pl. 127.0.0.1
címről (evidensen) engedélyezett a relaying, de máshonnan nagyon nem.
Párhuzamos küldési módot is be lehet állítani. A kézbesítések idő-
túllépésére figyelmeztető üzeneteket legalább a listákhoz kapcsolódó
címeknél kapcsoljuk ki, ha nem szeretnénk nagyon sok ilyen üzenetet
kapni, amikor a címzett gép nem érhető el.
   

Problémák
~~~~~~~~~

  * A Mailman annyi MAIL FROM/RCPT TO hívást használ, amennyi szükséges.
    Ennek következtében 10 vagy 100 üzenetnél is többet próbál meg egy 
    kapcsolat alatt elküldeni, amely több mint az Exim alapesetben
    beállított engedélyezett küldése (smtp_accept_queue_per_connection).
    Emiatt az Exim várakozólista módba kapcsol és nagy késésekkel
    fogja az üzeneteket továbbítani.
    A probléma elkerülésére adjunk az SMTP_MAX_SESSIONS_PER_CONNECTION
    változónak (a ~mailman/Mailman/mm_cfg.py állományban) az Exim
    smtp_accept_queue_per_connection értékénél kisebb értéket

  * A Mailman-nak figyelmen kívül kellene hagynia az Exim kézbesítés 
    időtúllépéséből (delay) eredő üzeneteit, annak ellenére, hogy az
    Exim ezeket sohasem küldi el a listákra. A Mailman 2.1-ben a
    visszapattanások kezelése és a VERP támogatása nagyban segítheti
    a visszapattanások nyomonkövetését.
       
  * A listák létezésénél ellenőrzi a beállítás, hogy található-e a
    listához config.pck fájl. Ha töröljük a listát, akkor ügyeljünk
    hogy töröljük a listához tartozó config.pck fájlt is.

  * Ha hibás felhasználói azonosítóra hivatkozva nem történik kézbesítés, 
    akkor ellenőrizzük, hogy a MAILMAN_UID és MAILMAN_GID váltózóknak
    helyesen adtuk-e meg a Mailman ezen értékeit. Figyeljünk arra
    is, hogy a rendszerszintű aliases fájlban nem található a listához
    közvetlenül kapcsolódó bejegyzés.
       

Címzett azonosítása
~~~~~~~~~~~~~~~~~~~

Az Exim címzett azonosítás funkciója nagyon hasznos, mivel segítségével
az SMTP kapcsolat ideje alatt el lehet vetni a nem ismert címzettű
leveleket. Ez a funkció a saját tartományukba külső címekről érkező
levelek esetén hasznos. A Mailman listák forgalmánál a levelek a saját
szerverünkről indulnak és különböző külső, tőlünk független tartományokba
kerülnek elküldésre. Minden egyes levél több címzettnek kerülhet továbbításra
-- akár egyszerre 500-nak is, ha a Mailman alapértelmezett értékét használjuk
és nem módosítottuk az SMTP_MAX_RCPTS értékét.

A Mailman listák forgalmán címzett azonosítást végezve problémák
merülhetnek fel. Általában az Exim a Mailman listákról érkező üzenetek
minden címzettjét megpróbálja elérni. Ehhez mindössze pár keresést
végez a DNSben minden egyes címzettnél, azonban ez a keresés a kézbesítést
nagyon lelassíthatja. Ezért célszerű kikapcsolni a címzett azonosítást
a Mailman forgalomra.

3-as Exim alatt a következőt kell elhelyezni az általános beállítások
részben:

  receiver_verify_hosts = !127.0.0.1

4-es Eximnél valószínűleg az alapértelmezett címzett azonosítási ACL
kifejezésben (az "RCPT TO" ACL-ben) már engedélyezve van ez a funkció:

  accept  domains       = +local_domains
          endpass
          message       = unknown user
          verify        = recipient

Ekkor csak a saját tartományba érkező levelekre végez címzett azonosítást
az Exim. (Ez a megoldás nem teljesen azonos azoknál az üzeneteknél 
alkalmazott címzett azonosítási funkcióval, amelyek nem-127.0.0.1 hostokról
érkeznek, de működik a Mailman esetében.)


SMTP Callback
~~~~~~~~~~~~~

Az Exim SMTP callback képességével még hatékonyabban lehet azonosítani
a hibás feladócímeket, mint a hagyományos feladó ellenőrzéssel. Sajnos
nagyon sok szerver a visszapattanási üzenet fejlécében hibás feladót
tüntet fel (annak ellenére, hogy csak egy üres feladó címet kéne
használniuk ilyen esetekben).

Azért, hogy a Mailman a visszapattanó címeket kezelni tudja szükséges
a Mailman listákon fogadni az ilyen leveleket, még akkor is ha ezek
nem alkalmasak visszapattanások azonosítására. Ezért többnyire 
célszerű kikapcsolni az SMTP callback ellenőrzést a visszapattanó 
levelekre.

Exim 4 esetén ezt a következő beállítással lehet elérni az "RCPT TO" ACL
részben:

  # Fogadjuk a visszapattanásokat a listán még akkor is ha a callback vagy
  # más ellenőrzések nem jártak sikerrel
  warn     message	= X-WhitelistedRCPT-nohdrfromcallback: Yes
	   condition	= \
           ${if and {{match{$local_part}{(.*)-bounces\+.*}}
                     {exists {MAILMAN_HOME/lists/$1/config.pck}}} \
                {yes}{no}}
                {yes}{no}}

  accept   condition	= \
           ${if and {{match{$local_part}{(.*)-bounces\+.*}}
                     {exists {MAILMAN_HOME/lists/$1/config.pck}}} \
                {yes}{no}}
                {yes}{no}}

  # Most ellenőrizhetjük a feladó címét az SMTP callback funkcióval.
  deny   !verify = sender/callout=90s

Ha a fejlécben található címekre is szeretnénk SMTP callback ellenőrzést
végrehajtani, akkor a "DATA" ACL-t a következőképpen kell megadni:

  deny   !condition = $header_X-WhitelistedRCPT-nohdrfromcallback:
	 !verify = header_sender/callout=90s


VERP használata Eximmel és Mailmannel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

VERP esetén a listatagoknak a leveleket külön-külön küldjük el, a VERP
beállításáról a ~mailman/Mailman/Defaults.py állományban lehet bővebben
olvasni. Röviden, a következőket kell feltüntetni a ~mailman/Mailman/mm_cfg.py
állományban a VERP használatához:

  VERP_PASSWORD_REMINDERS = 1
  VERP_PERSONALIZED_DELIVERIES = 1
  VERP_DELIVERY_INTERVAL = 1
  VERP_CONFIRMATIONS = 1
 
 (A fenn említett átirányítok képesek a VERP visszapattanások kezelésére is.)


Virtuális tartományok
~~~~~~~~~~~~~~~~~~~~~

Virtuális tartományok kezelésére megoldás lehet az a módszer, hogy minden
egyes virtuális tartományhoz külön-külön telepített Mailmant használunk.
(Jelenleg csak ezzel a módszerrel lehet ugyanazon a rendszeren azonos névvel,
de eltérő tartományokban listákat üzemeltetni.)

Ez esetben ne adjuk meg a MAILMAN_HOME és MAILMAN_WRAP változókat, töröljük
azokat az általános beállítások részből. Módosítsuk a director (router)
részeket valahogy így:

  require_files = /virtual/${domain}/mailman/lists/${lc:$local_part}/config.pck

a transports részeket pedig így:

  command = /virtual/${domain}/mailman/mail/mailman \
            ${if def:local_part_suffix \
                 {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}}
                 {post}} \
              $local_part
  current_directory = /virtual/${domain}/mailman
  home_directory = /virtual/${domain}/mailman


Lista ellenőrzése
~~~~~~~~~~~~~~~~~

A következőkben bemutatjuk, hogy hogyan lehet ellenőrizni egy működő
rendszeren, hogy az Eximnek megadott listák címei megfelelően működnek.
A példában az mems-exchange.org levelezőszerveren működő 
quixote-users@mems-exchange.org listán mutatjuk be a szükséges parancsokat
("% " jelzi a Unix shell promptját):

  % exim -bt quixote-users
  quixote-users@mems-exchange.org
    router = mailman_main_router, transport = mailman_transport

  % exim -bt quixote-users-request
  quixote-users-request@mems-exchange.org
    router = mailman_router, transport = mailman_transport

  % exim -bt quixote-users-bounces
  quixote-users-bounces@mems-exchange.org
    router = mailman_router, transport = mailman_transport

  % exim -bt quixote-users-bounces+luser=example.com
  quixote-users-bounces+luser=example.com@mems-exchange.org
    router = mailman_router, transport = mailman_transport

Ha az "exim -bt" parancsok kimenete hasonlít valamennyire a fentiekhez,
akkor az jó jel, mert azt jelenti hogy az Exim a megfelelő Mailman
bejegyzéshez továbbítja az eltérő üzeneteket. Azonban messze nem jelenti
azt, hogy az Exim és Mailman telepítés biztosan tökéletesen működik!


A dokumentum készítői
~~~~~~~~~~~~~~~~~~~~~

Eredeti szerzője Nigel Metheringham <postmaster@exim.org>.
Mailman 2.1-es és Exim 4-es verzióhoz adaptálta Merlin <marc_soft@merlins.org>.
Ellenőrízte/formába öntötte/pontosította/egyszerűsítette Greg Ward <gward@python.net>.
