<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN"> <HTML> <HEAD> <TITLE>Posta Off-Line HOW-TO: Spedire la posta, ovvero sendmail</TITLE> </HEAD> <BODY> <A HREF="Posta-OFFline-HOWTO-3.html">Precedente</A> Successivo <A HREF="Posta-OFFline-HOWTO.html#toc4">Indice</A> <HR> <H2><A NAME="s4">4. Spedire la posta, ovvero sendmail</A></H2> <P> Beh, a dire il vero ci sono diversi MTA, tra cui <CODE>smail</CODE>, <CODE>qmail</CODE>, ed altri ma, non avendo mai avuto modo di provarli, mi soffermerò solo su <CODE>sendmail</CODE>. <P><CODE>sendmail</CODE> è 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 <CODE>sendmail</CODE> ci viene in aiuto <CODE>m4</CODE> che, con le sue macro, ci permette di creare in maniera estremamente semplice un file di configurazione adatto al nostro caso specifico. <P><B>Nota bene:</B> <CODE>sendmail</CODE> è 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: <P> <UL> <LI><CODE> <A HREF="http://www.sendmail.org/">www.sendmail.org</A></CODE></LI> <LI><CODE> <A HREF="ftp://ftp.sendmail.org/">ftp.sendmail.org</A></CODE> sotto la directory <CODE>/pub/sendmail/</CODE></LI> </UL> <P> <H2><A NAME="ss4.1">4.1 Creazione del file sendmail.cf con m4</A></H2> <P> Per far capire a <CODE>sendmail</CODE> che operiamo off-line, dobbiamo andare a modificare il file di configurazione che di solito si chiama <CODE>/etc/sendmail.cf</CODE> Dal momento che non avrebbe molto senso andare a modificare a mano tale file, vediamo come possiamo piuttosto generarne uno nuovo usando <CODE>m4</CODE> (ovviamente devi avere <CODE>m4</CODE> installato e funzionante). <P>Come prima cosa andiamo a prendere via <CODE>ftp</CODE> l'ultima versione di <CODE>sendmail</CODE> da <CODE> <A HREF="ftp://ftp.sendmail.org/pub/sendmail/">ftp://ftp.sendmail.org/pub/sendmail/</A></CODE> quindi andiamo a scompattare il file appena prelevato sotto <CODE>/usr/src</CODE> con il comando <P> <BLOCKQUOTE><CODE> <PRE> tar vxzf /percorso/per/sendmail.x.x.x.tar.gz </PRE> </CODE></BLOCKQUOTE> <P>A questo punto, per semplificarci la vita, creiamo un link simbolico in modo da far risultare la directory di <CODE>sendmail</CODE> come <CODE>/usr/src/sendmail</CODE> in questo modo: <P> <BLOCKQUOTE><CODE> <PRE> ln -s /usr/src/sendmail-x.x.x /usr/src/sendmail </PRE> </CODE></BLOCKQUOTE> <P>Ovviamente le <CODE>x</CODE> usate nel path di <CODE>sendmail</CODE> stanno ad indicare il numero della versione e dovranno essere sostituite!!! <P>Ora andiamo nella directory <CODE>/usr/src/sendmail/cf/cf</CODE> e creiamoci il file con le indicazioni per <CODE>m4</CODE> chiamandolo <CODE>linux-offline.mc</CODE> ed avente come contenuto quanto segue: <P> <BLOCKQUOTE><CODE> <PRE> 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) </PRE> </CODE></BLOCKQUOTE> <P>Le due linee che contengono <CODE>define(confUSERDB_SPEC, /etc/userdb.db)</CODE> e <CODE>FEATURE(notsticky)</CODE> devono essere inserite solo se vogliamo usare il database di utenti locali (vedi la sezione <I>Un database di utenti locali: perchè e come</I>). Inoltre <CODE>mio_smtp_host</CODE> 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 <CODE>linux per uso off-line')dnl</CODE> è molto importante: è diverso dal semplice apostrofo e corrisponde in ASCII al codice 96 (decimale). <P>Ora facciamo una copia di riserva del file <CODE>/etc/sendmail.cf</CODE> e generiamone uno nuovo con il comando: <P> <BLOCKQUOTE><CODE> <PRE> m4 linux-offline.mc > /etc/sendmail.cf </PRE> </CODE></BLOCKQUOTE> <P> <H2><A NAME="ss4.2">4.2 Creazione del file sendmail.cf e /etc/aliases con make</A></H2> <P> Per i più esperti, ecco in regalo un <CODE>Makefile</CODE> da mettere in <CODE>/etc/mail</CODE> per compilare automaticamente <CODE>sendmail.cf</CODE> 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: <P> <BLOCKQUOTE><CODE> <PRE> ln -s /etc/sendmail.cf /etc/mail/sendmail.cf </PRE> </CODE></BLOCKQUOTE> <P>Segue il contenuto del file <CODE>/etc/mail/Makefile</CODE>: <P> <BLOCKQUOTE><CODE> <PRE> ------------------------ 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 ------------------------ </PRE> </CODE></BLOCKQUOTE> <P> <H2><A NAME="ss4.3">4.3 Ultimi ritocchi a sendmail</A></H2> <P> Una volta generato il file <CODE>sendmail.cf</CODE> facciamo ripartire <CODE>sendmail</CODE> ed il gioco è fatto... o quasi :) <P>In genere la distribuzione di Linux che abbiamo installato fa in modo che al boot della macchina, da uno degli script nella directory <CODE>/etc/rc.d</CODE>, parta <CODE>sendmail</CODE>. 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 <CODE>sendmail</CODE> per default con l'opzione <CODE>-q</CODE>, la quale dice a <CODE>sendmail</CODE> di processare immediatamente la coda dei messaggi in uscita oltre che ad certo intervallo di tempo. <P>Per evitare che ciò succeda, individuiamo in quale file viene fatto partire <CODE>sendmail</CODE> 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 <CODE>/etc/rc.d</CODE> e facciamo una <P> <BLOCKQUOTE><CODE> <PRE> grep sendmail * </PRE> </CODE></BLOCKQUOTE> <P>Nella Red Hat, la directory in questione è <CODE>/etc/rc.d/init.d</CODE> ed il file si chiama <CODE>sendmail.init</CODE> <P>A questo punto ogni messaggio che inviamo a <CODE>sendmail</CODE>, sia direttamente, sia via SMTP sulla porta locale, viene messo in una coda nella directory <CODE>/var/spool/mqueue</CODE> e la coda verrà processata (i messaggi verranno inviati) solo con il comando <P> <BLOCKQUOTE><CODE> <PRE> sendmail -q -v </PRE> </CODE></BLOCKQUOTE> <P>Per vedere il contenuto della coda digita <CODE>mailq</CODE> <P>L'opzione <CODE>-v</CODE> serve a dire a <CODE>sendmail</CODE> di visualizzare cosa combina durante l'invio dei messaggi, mentre <CODE>-q</CODE> serve proprio ad indicargli di processare la coda. Se vogliamo avere un log di cosa combina <CODE>sendmail</CODE> possiamo farlo partire in questo modo: <P> <BLOCKQUOTE><CODE> <PRE> sendmail -q -v >> /var/log/sendmail </PRE> </CODE></BLOCKQUOTE> <P>Un'ultima cosa: per compilare <CODE>sendmail</CODE> ed installarlo al posto della versione attuale: <P> <BLOCKQUOTE><CODE> <PRE> cd /usr/src/sendmail/src makesendmail makesendmail install </PRE> </CODE></BLOCKQUOTE> <P> <H2><A NAME="ss4.4">4.4 Un database di utenti locali: perchè e come</A></H2> <P> Come abbiamo già visto con <CODE>pine</CODE>, uno dei problemi più ricorrenti nell'uso della posta off-line consiste nel fatto che il campo <CODE>From:</CODE> automaticamente generato dal nostro MUA non corrisponde al nostro indirizzo Internet reale. Per ovviare a questo problema basterebbe inserire un header del tipo <CODE>Reply-to:</CODE> con il nostro indirizzo effettivo, ma chi riceverà la nostra posta continuerà a vedere nel campo <CODE>From:</CODE> 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. <P>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 <CODE>m4</CODE> (vedi la sezione <I>Creazione del file <CODE>/etc/sendmail.cf</CODE> con <CODE>m4</CODE></I>) le righe: <P> <BLOCKQUOTE><CODE> <PRE> define(confUSERDB_SPEC, /etc/userdb.db) FEATURE(notsticky) </PRE> </CODE></BLOCKQUOTE> <P>Inoltre dobbiamo avere installato il pacchetto <I>db</I> di Berkeley dal momento che questo sistema non funziona con DBM. Puoi prelevare i sorgenti da <A HREF="ftp://ftp.cs.berkeley.edu/pub/4bsd/db.tar.gz">ftp://ftp.cs.berkeley.edu/pub/4bsd/db.tar.gz</A> ma non ne avrai bisogno se stai utilizzando una distribuzione abbastanza recente come ad esempio la Red Hat 4.0. <P>Ora andiamo ad editare il file <CODE>/etc/userdb</CODE> in questo modo: <P> <BLOCKQUOTE><CODE> <PRE> login:mailname nome.utente@mio.provider.it nome.utente@mio.provider.it:maildrop login </PRE> </CODE></BLOCKQUOTE> <P>Si tratta di sostituire <I>login</I> con il nostro login sulla macchina locale e <I>nome.utente@mio.provider.it</I> con il nostro indirizzo Internet reale. Quindi un esempio concreto potrebbe essere: <P> <BLOCKQUOTE><CODE> <PRE> mirko:mailname ik0zsn@amsat.org ik0zsn@amsat.org:maildrop mirko </PRE> </CODE></BLOCKQUOTE> <P>Usa TAB per separare i campi. Ora generiamo il database con: <P> <BLOCKQUOTE><CODE> <PRE> makemap btree /etc/userdb.db < /etc/userdb </PRE> </CODE></BLOCKQUOTE> <P>Facciamo ripartire <CODE>sendmail</CODE> ed il gioco è fatto. Ora, ad esempio con Berkeley's Mail, i messaggi in uscita avranno l'indirizzo corretto nell'header <CODE>From:</CODE> e <CODE>Return-Path:</CODE> <P>Come avrai già notato, con <CODE>pine</CODE> invece non è cambiato un bel niente e si ostina a indicare un indirizzo scorretto. La soluzione viene dalla documentazione di <CODE>sendmail</CODE> (dalle FAQ per essere più esatti) e la riporto esattamente così com'è, limitandomi a tradurla. <P> <BLOCKQUOTE><CODE> <PRE> ====================================================================== 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. ====================================================================== </PRE> </CODE></BLOCKQUOTE> <P> <H2><A NAME="ss4.5">4.5 Makemap non supporta il tipo btree. E adesso?</A></H2> <P> Potrebbe succedere che <CODE>makemap</CODE> ti dice di non supportare il tipo <I>btree</I> rifiutandosi di generare il database. Cosa fare in questo caso? Soluzione: ricompilare <CODE>makemap</CODE> con il supporto per i database di tipo <I>btree</I>. <P>I sorgenti di <CODE>makemap</CODE> sono nella distribuzione di <CODE>sendmail</CODE>, quindi se abbiamo seguito le istruzioni precedenti dovremmo ritrovarci il tutto sotto <CODE>/usr/src/sendmail/makemap</CODE> <P>Per poter compilare <CODE>makemap</CODE> con il supporto per il tipo <I>btree</I> dobbiamo avere installato il pacchetto <CODE>db</CODE> di Berkeley (vedi la sezione <I>Un database di utenti locali: perchè e come</I>). <P>L'unica difficoltà nel compilare <CODE>makemap</CODE> 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 <CODE>Makefile</CODE> dopo avere rinominato quello già presente nella directory e lancia <CODE>make</CODE> quindi, se la compilazione è andata a buon fine, fai qualche prova con il tuo nuovo <CODE>makemap</CODE> ed infine installalo con <CODE>make install</CODE> <P> <BLOCKQUOTE><CODE> <PRE> ------------------------ 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 ------------------------ </PRE> </CODE></BLOCKQUOTE> <P> <HR> <A HREF="Posta-OFFline-HOWTO-3.html">Precedente</A> Successivo <A HREF="Posta-OFFline-HOWTO.html#toc4">Indice</A> </BODY> </HTML>