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:
www.sendmail.org
ftp.sendmail.org
sotto la directory /pub/sendmail/
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
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 ------------------------
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
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.
======================================================================
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 ------------------------