Avanti Indietro Indice

4. Spedire la posta, ovvero sendmail

Beh, a dire il vero ci sono diversi MTA, tra cui smail, qmail, ed altri ma, non avendo mai avuto modo di provarli, mi soffermerò solo su sendmail.

sendmail è forse uno dei software più complicati da configurare nella nostra galassia; in compenso ci permette di avere un sistema di gestione della posta all'altezza di qualsiasi situazione, tanto che è spesso sprecato in molti casi per i quali basterebbe un ben più semplice MTA. In ogni caso, per una configurazione base di sendmail ci viene in aiuto m4 che, con le sue macro, ci permette di creare in maniera estremamente semplice un file di configurazione adatto al nostro caso specifico.

Nota bene: sendmail è un software che avrà sempre dei buchi (bug o bacarozzi che dir si voglia) riguardanti la sicurezza, per cui consiglio vivamente di prelevare l'ultima versione disponibile (anche perchè tutte le prove sono state fatte sulla versione 8.8.3 e non posso assicurare che quanto è qui descritto funzioni anche con le versioni precedenti) da uno di questi URL:

4.1 Creazione del file sendmail.cf con m4

Per far capire a sendmail che operiamo off-line, dobbiamo andare a modificare il file di configurazione che di solito si chiama /etc/sendmail.cf Dal momento che non avrebbe molto senso andare a modificare a mano tale file, vediamo come possiamo piuttosto generarne uno nuovo usando m4 (ovviamente devi avere m4 installato e funzionante).

Come prima cosa andiamo a prendere via ftp l'ultima versione di sendmail da ftp://ftp.sendmail.org/pub/sendmail/ quindi andiamo a scompattare il file appena prelevato sotto /usr/src con il comando

tar vxzf /percorso/per/sendmail.x.x.x.tar.gz

A questo punto, per semplificarci la vita, creiamo un link simbolico in modo da far risultare la directory di sendmail come /usr/src/sendmail in questo modo:

ln -s /usr/src/sendmail-x.x.x /usr/src/sendmail

Ovviamente le x usate nel path di sendmail stanno ad indicare il numero della versione e dovranno essere sostituite!!!

Ora andiamo nella directory /usr/src/sendmail/cf/cf e creiamoci il file con le indicazioni per m4 chiamandolo linux-offline.mc ed avente come contenuto quanto segue:

include(`../m4/cf.m4')
VERSIONID(`linux per uso off-line')dnl
OSTYPE(linux)
FEATURE(nouucp)dnl
FEATURE(always_add_domain)dnl
MAILER(local)dnl
MAILER(smtp)dnl
define(confDELIVERY_MODE, defer)
define(`SMART_HOST', mio_smtp_host)
define(confUSERDB_SPEC, /etc/userdb.db)
FEATURE(notsticky)

Le due linee che contengono define(confUSERDB_SPEC, /etc/userdb.db) e FEATURE(notsticky) devono essere inserite solo se vogliamo usare il database di utenti locali (vedi la sezione Un database di utenti locali: perchè e come). Inoltre mio_smtp_host deve essere sostituito con il nome del server SMTP del provider. Ti faccio anche notare che quell'apostrofo al contrario che si trova ad esempio prima di linux per uso off-line')dnl è molto importante: è diverso dal semplice apostrofo e corrisponde in ASCII al codice 96 (decimale).

Ora facciamo una copia di riserva del file /etc/sendmail.cf e generiamone uno nuovo con il comando:

m4 linux-offline.mc > /etc/sendmail.cf

4.2 Creazione del file sendmail.cf e /etc/aliases con make

Per i più esperti, ecco in regalo un Makefile da mettere in /etc/mail per compilare automaticamente sendmail.cf e gli alias. Prima però bisogna togliere da sendmail.mc la riga con l'include(), quindi si deve creare un link simbolico con il comando:

ln -s /etc/sendmail.cf /etc/mail/sendmail.cf

Segue il contenuto del file /etc/mail/Makefile:

------------------------ taglia qui ------------------------
M4LIB=/usr/lib/sendmail.cf HOSTNAME=wonderland

all: cfg

sendmail.cf: $(HOSTNAME).mc m4 $(M4LIB)/m4/cf.m4 $(HOSTNAME).mc >
        sendmail.cf
# Queste righe sono un esempio di come applicare automaticamente delle patch
#       patch --silent < $(M4LIB)/smartdom.diff patch --silent <
#       $(M4LIB)/selective-masq.diff rm -rf sendmail.cf.orig

/etc/aliases: /etc/aliases.db

/etc/aliases.db: /etc/aliases sendmail -bi

cfg: sendmail.cf /etc/aliases

test: cfg sendmail -bt -C./sendmail.cf #-oQ/tmp/mqueue

clean: rm sendmail.cf /etc/aliases.db
------------------------ taglia qui ------------------------

4.3 Ultimi ritocchi a sendmail

Una volta generato il file sendmail.cf facciamo ripartire sendmail ed il gioco è fatto... o quasi :)

In genere la distribuzione di Linux che abbiamo installato fa in modo che al boot della macchina, da uno degli script nella directory /etc/rc.d, parta sendmail. Ora, dal momento che quelli che creano le distribuzioni di Linux danno per assunto che ognuno di noi sia collegato in rete con una T1 da casa, fanno partire sendmail per default con l'opzione -q, la quale dice a sendmail di processare immediatamente la coda dei messaggi in uscita oltre che ad certo intervallo di tempo.

Per evitare che ciò succeda, individuiamo in quale file viene fatto partire sendmail ed eliminiamo l'opzione -q (che generalmente è seguita anche dall'intervallo di tempo per processare la coda, per esempio 15m sta per 15 minuti). Per individuare il file, portiamoci nella directory /etc/rc.d e facciamo una

grep sendmail *

Nella Red Hat, la directory in questione è /etc/rc.d/init.d ed il file si chiama sendmail.init

A questo punto ogni messaggio che inviamo a sendmail, sia direttamente, sia via SMTP sulla porta locale, viene messo in una coda nella directory /var/spool/mqueue e la coda verrà processata (i messaggi verranno inviati) solo con il comando

sendmail -q -v

Per vedere il contenuto della coda digita mailq

L'opzione -v serve a dire a sendmail di visualizzare cosa combina durante l'invio dei messaggi, mentre -q serve proprio ad indicargli di processare la coda. Se vogliamo avere un log di cosa combina sendmail possiamo farlo partire in questo modo:

sendmail -q -v >> /var/log/sendmail

Un'ultima cosa: per compilare sendmail ed installarlo al posto della versione attuale:

cd /usr/src/sendmail/src
makesendmail
makesendmail install

4.4 Un database di utenti locali: perchè e come

Come abbiamo già visto con pine, uno dei problemi più ricorrenti nell'uso della posta off-line consiste nel fatto che il campo From: automaticamente generato dal nostro MUA non corrisponde al nostro indirizzo Internet reale. Per ovviare a questo problema basterebbe inserire un header del tipo Reply-to: con il nostro indirizzo effettivo, ma chi riceverà la nostra posta continuerà a vedere nel campo From: un indirizzo sbagliato che, se un nostro amico memorizza in un elenco credendolo corretto, sarebbe semplicemente inutile e ci farebbe anche perdere un sacco di tempo e messaggi.

La soluzione consiste nel creare un database di utenti locali in cui ad una chiave consistente in un certo login corrisponde un indirizzo email reale. Per fare ciò dobbiamo avere precedentemente specificato nel file per m4 (vedi la sezione Creazione del file /etc/sendmail.cf con m4) le righe:

define(confUSERDB_SPEC, /etc/userdb.db)
FEATURE(notsticky)

Inoltre dobbiamo avere installato il pacchetto db di Berkeley dal momento che questo sistema non funziona con DBM. Puoi prelevare i sorgenti da ftp://ftp.cs.berkeley.edu/pub/4bsd/db.tar.gz ma non ne avrai bisogno se stai utilizzando una distribuzione abbastanza recente come ad esempio la Red Hat 4.0.

Ora andiamo ad editare il file /etc/userdb in questo modo:

login:mailname  nome.utente@mio.provider.it
nome.utente@mio.provider.it:maildrop    login

Si tratta di sostituire login con il nostro login sulla macchina locale e nome.utente@mio.provider.it con il nostro indirizzo Internet reale. Quindi un esempio concreto potrebbe essere:

mirko:mailname  ik0zsn@amsat.org
ik0zsn@amsat.org:maildrop       mirko

Usa TAB per separare i campi. Ora generiamo il database con:

makemap btree /etc/userdb.db < /etc/userdb

Facciamo ripartire sendmail ed il gioco è fatto. Ora, ad esempio con Berkeley's Mail, i messaggi in uscita avranno l'indirizzo corretto nell'header From: e Return-Path:

Come avrai già notato, con pine invece non è cambiato un bel niente e si ostina a indicare un indirizzo scorretto. La soluzione viene dalla documentazione di sendmail (dalle FAQ per essere più esatti) e la riporto esattamente così com'è, limitandomi a tradurla.

======================================================================
Data: 19 Luglio 1996
Soggetto:  Q3.6 -- Come posso far funzionare il database di utenti
                   locali con Pine o con FEATURE(always_add_domain)?

    L'incompatibilita` di base tra Pine e il database di utenti
risiede in come Pine scrive il tuo indirizzo nella intestazione dei
messaggi. Molti MUA scrivono il tuo indirizzo come "From: user",
mentre Pine, per ragioni date nella sua documentazione, scrive
l'indirizzo come "From: user@FQDN" (FQDN=fully qualified domain name,
ovvero il nome di dominio completo di una macchina su
Internet). Usando la macro di m4 "always_add_domain" si ha lo stesso
effetto. Data questa differenza, il database di utenti locali non
riscrive queste intestazioni.

    Una soluzione a questo problema consiste nell'apportare la
seguente modifica nel file sendmail.mc compilato da m4 nel tuo
/etc/sendmail.cf (oppure ovunque il tuo file sendmail.cf risiede) dopo
che hai installato il database di utenti locali e l'hai fatto
funzionare con altri MUA:

    All'inizio della sezione dove imposti le variabili di
configurazione, aggiungi quanto segue:

        # Define our userdb file for FQDN rewrites
        Kuserdb btree -o /etc/userdb.db

    Ed un po' piu` in seguito, prima delle righe "MAILER()", ma dopo
che altre opzioni di configurazione siano state specificate:

   LOCAL_RULE_1
   ########################################################
   ### Local Ruleset 1, rewrite sender header & envelope ##
   ########################################################
   #Thanks to Bjart Kvarme <bjart.kvarme@usit.uio.no>
   S1
   R$-                     $1 < @ $j . >                user => user@localhost
   R$- < @ $=w . > $*      $: $1 < @ $2 . > $3 ?? $1    user@localhost ?
   R$+ ?? $+               $: $1 ?? $(userdb $2 : mailname $: @ $)
   R$+ ?? @                $@ $1                        Not found
   R$+ ?? $+               $>3 $2                       Found, rewrite

   # NOTA BENE   ^^^^^^^^^^^^^^^       ^^^^^^^^^^^^^^^^^^^^^^^^^
   # Usa il tasto Tab in queste regioni in modo da avere tre
   # colonne (la linea con "mailname" ha solo 2 colonne).

    Ora il database di utenti dovrebbe riscrivere i messaggi spediti
con Pine o qualsiasi altro MUA che vuole avere un indirizzo
completamente qualificato (FQDN). Se con il metodo appena descritto
non hai ancora risolto il problema, prova ad aggiungere quanto segue
sia al file di configurazione di sistema pine.conf, pine.conf.fixed, o
al tuo file di configurazione personale .pinerc:

        user-domain=localhost

    Sappiamo che questo ha risolto il problema a molte persone.

    Ad ogni modo, una soluzione piu` elegante (leggi: basata su m4)
per la versione 8 di sendmail deve essere ancora creata.
======================================================================

4.5 Makemap non supporta il tipo btree. E adesso?

Potrebbe succedere che makemap ti dice di non supportare il tipo btree rifiutandosi di generare il database. Cosa fare in questo caso? Soluzione: ricompilare makemap con il supporto per i database di tipo btree.

I sorgenti di makemap sono nella distribuzione di sendmail, quindi se abbiamo seguito le istruzioni precedenti dovremmo ritrovarci il tutto sotto /usr/src/sendmail/makemap

Per poter compilare makemap con il supporto per il tipo btree dobbiamo avere installato il pacchetto db di Berkeley (vedi la sezione Un database di utenti locali: perchè e come).

L'unica difficoltà nel compilare makemap consiste nel far funzionare il makefile. Dal momento che su ogni sistema le cose potrebbero cambiare (librerie diverse, ecc) ti riporto il makefile che ho usato con successo (per dovere di cronaca al momento delle prove avevo la Red Hat 4.0). Chiamalo semplicemente Makefile dopo avere rinominato quello già presente nella directory e lancia make quindi, se la compilazione è andata a buon fine, fai qualche prova con il tuo nuovo makemap ed infine installalo con make install

------------------------ taglia qui ------------------------
O=      -O
SRCDIR= ../src
DBMDEF= -DNDBM -DNEWDB
ENVDEF=
INCDIRS=-I${SRCDIR} -I/usr/include
LDOPTS=
LIBDIRS=-L/usr/lib
LIBS=   -ldb -lgdbm
BINDIR= /usr/sbin
OBJADD=

############  Non modificare al di sotto di questa linea  ##############

CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF}
OBJS=   makemap.o ${OBJADD}
LINKS=  ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq
BINOWN= bin
BINGRP= bin
BINMODE=555

ALL=    makemap makemap.0

all: ${ALL}

makemap: ${BEFORE} ${OBJS}
        ${CC} -o makemap ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS}

NROFF=  groff -Tascii
MANDOC= -mandoc

makemap.0: makemap.8
        ${NROFF} ${MANDOC} makemap.8 > makemap.0

install: install-makemap install-docs

install-makemap: makemap
        install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} makemap ${BINDIR}

install-docs: makemap.0

clean:
        rm -f ${OBJS} makemap makemap.0

${OBJS}: ${SRCDIR}/conf.h
------------------------ taglia qui ------------------------


Avanti Indietro Indice