<howto@fdd.com>
Questo documento descrive come rifornire un news server con una mailing list utilizzando un sistema Linux. È un mini-HOWTO, più specificatamente il Mail2News mini-HOWTO.
Copyright (c) 1999, Rick Dean.
Copyright (c) 1996, Robert Hart.
The authors retain their copyright of this document. You are hereby granted permission to redistribute this document in whole or in part as long as it includes this copyright notice. Commercial redistribution is allowed and encouraged. All translations or derivative works of this document must be covered under this copyright notice, and without additional restrictions on distribution. This arrangement is also known as a copyleft.
This copyright notice, itself, is hereby placed in the public domain. You may copy it without atribution.
La versione più recente di questo documento è disponibile all'indirizzo http://fdd.com/howto/.
Molte distribuzioni includono questo HOWTO nella
directory /usr/doc/HOWTO
.
Questo mini-HOWTO, come la maggior parte dei mini-HOWTO di Linux, è stato scritto inizialmente in SGML. Questo permette al testo di essere automaticamente tradotto in molti formati, tra cui testo, HTML, PostScript, ecc. Questi formati sono disponibili da qualche parte.
Altre informazioni sulla documentazione di Linux sono disponibili presso Linux Documentation Project, e in molti altri posti
<hartr@redhat.com>
nel 1996 <howto@fdd.com>
a partire dal Luglio 1999.
Questo documento descrive come rifornire (feed) un news server con una mailing-list utilizzando una macchina Linux. È un mini-HOWTO, specificatamente il Mail2News mini-HOWTO.
Una mailing list (conosciuta anche col nome di remailer), è un indirizzo dove le e-mail vengono rispedite ad una lista di indirizzi. È molto utile per la collaborazione di gruppi geograficamente dispersi. Molte compagnie (ad esempio i gruppi di lavoro della IETF) utilizzano le mailing list.
Sfortunatamente, se si è iscritti a più mailing list, si ha la casella di posta regolarmente innondata di messaggi. Inoltre, alcune compagnie (come 3Com) specificano quale applicazione di posta devono utilizzare i loro impiegati (ad esempio Lotus Notes). Se le e-mail vengono reindirizzate ad un gruppo di discussione, le persone sono rese libere di scegliere il lettore di news che preferiscono, utilizzando delle funzioni progettate proprio per quello scopo (cioè derivare un segnale dal rumore).
I server di news sono apparsi su Internet molto tempo fa, diversi anni prima del World Wide Web. I server di news e i lettori di news hanno carateristiche come...
Un grande obiettivo dei server di news è la condivisione di notizie tra server. Il più grande di questi gruppi venne conosciuto come USENET. Questo mini HOWTO non è rivolto a questo. Si possono condividere i gruppi di discussione creati attraverso questo documento da soli, ma si vive bene anche senza. Come per i web server, l'onnipresente connettività ad Internet, ha reso accettabile i news server centralizzati. Inoltre recenti prove hanno mostrato che un macchina Linux con un solo processore può gestire più di 1300 richieste HTTP per secondo, quindi la scalabilità è un obiettivo secondario.
Sebbene non ci sia bisogno di avere una mailing list per utilizzare questo documento, è una buona idea avere il news server.
Questo documento presume che si stia utilizzando Linux, ma vanno
bene anche altri Unix. Attualmente è descritto solo sendmail
come agente di posta, ma non appena qmail
diverrà popolare
(in parte per la facilità di configurazione) si spera che qualcuno
scriva delle note di configurazione anche per lui. :-)
Al momento della scrittura questo mini-HOWTO è stato testato solo su un distribuzione Redhat 6.0. Da buoni informatici, non si dovrebbe credere che qualcosa funzioni finché non sia stato specificatamente testato. Qualsiasi contributo o annotazione riguardo altre distribuzioni è benvenuto.
Per la gran parte di questo documento si avrà bisogno dell'accesso di root, a meno che non sia specificato il contrario.
Questo mini-HOWTO è presentato al contrario, dato che è il modo più semplice di costruire e debuggare il tutto. Al contrario significa che si inizierà con il lettore di news e si risalirà fino al gestore della mailing list, cioè la direzione opposta del normale flusso di dati. Questo sistema utilizza alcune parti (come sendmail e innd) che sono dei piccoli HOWTO.
Questo mini-HOWTO non riguarda...
Per favore non scrivetemi e-mail su questi argomenti (o SPAM).
Netscape contiene un lettore di news integrato. Il modo più semplice di sottoscrivere un gruppo di discussione è di scrivere o cliccare un link simile a
news://news.sfour.com/ietf.confctrl
Una volta iscritti, si deve solo andare al centro messaggi. Questo si fa cliccando sulla icona a fumetto nell'angolo destro della finestra.
Free Agent è un meraviglioso lettore di news di Forte per Windows. Si guardi: http://www.forteinc.com/agent/freagent.htm
I vecchi lettori di news come trn
e tin
sono una
buona soluzione. Ci si assicuri di impostare prima la variabile d'ambiente NNTPSERVER.
Per esempio...
export NNTPSERVER=news.sfour.com
trn
Si deve installare un server di news. Io utilizzo inn
,
ma ne sono disponibili anche altri.
Preferiblmente si scelga l'opzione "News Server" durante l'installazione iniziale, ma se la distribuzione utilizza RPM (RedHat package manager), allora basta utilizzare un comando come
rpm -i inn-2.2.9.i386.rpm
Per far partire o fermare l'esecuzione del news server, si utilizza il comando
/etc/rc.d/init.d/innd start
o
/etc/rc.d/init.d/innd stop
o
/etc/rc.d/init.d/innd restart
Per far partire il news server all'avvio del sistema si può
aggiungere un comando, come quelli visti, alla fine di /etc/rc.d/rc.local
,
ma non è la soluzione migliore.
Molte distribuzioni hanno della applicazioni grafiche che permettono
di scegliere quali demoni attivare. Si provi a scrivere:
setup
or
chkconfig --add innd
innd
richiede poco riguardo a permessi e proprietà
Per la gran parte della configurazione basterà essere utente news
.
Per diventare questo utente quando si è root:
su - news
Utilizzando ctlinnd
, si crea il gruppo di discussione sul server.
Da ricordare che il newsgroup sarà locale,
quindi si deve crearlo
con un nome distintivo, in modo da poterlo filtrare dalla distribuzione delle
news se si fa questo errore.
Con orgoglio ho chiamato il mio newsgroup ietf.confctrl
.
Le parole da sinistra a destra vanno da meno a più specifico.
Inoltre si deve dire a innd
che il gruppo è moderato
(utilizzando ctlinnd). Questo si fa specificando m
al comando
newgroup
. Per esempio:
ctlinnd newgroup ietf.confctrl m confctrl@isi.edu
Il gruppo di discussione deve essere creato come moderato, in modo da poter usufruire delle possibilità di innd. Qualsiasi messaggio inviato ad un gruppo moderato non è immediatamente consegnato al gruppo, ma viene prima inviato al moderatore. Nell'esempio confctrl@isi.edu è l'indirizzo a cui è rimandato il remailer.
Se si stanno condividendo notizie con altri server, ci si deve ricordare di editare le proprie configurazioni in modo che il gruppo non sia distribuito, a meno che non si voglia specificatamente fare questo.
Di default, il news server non permette ad ogni client di leggere le notizie, quindi si deve disabilitare l'autenticazione dell'utente di innd. Questo va fatto nel file /etc/news/nnrp.access. Si legga la pagina man di nnrp.access per apprendere la sintassi di questo file. Io ho cambiato la prima riga non di commento in:
*:Read Post:::*
Se si vuole un nome utente e una password, allora si devono riempire il terzo e il quarto campo. Per maggiori informazioni sulla sintassi si guardi il manuale...
man nnrp.access
Si devono cambiare anche i permessi di /usr/bin/rnews. Non è
leggibile e eseguibile da tutti, ma sendmail
esegue script come
nobody
.
chmod a+rx /usr/bin/rnews
Se si copia il seguente articolo in un file di nome rick.article
...
Path: rick From: rick@fdd.com Message-ID: <199907120548.AAA05475@fdd.com> Subject: test Date: Mon, 12 Jul 1999 00:48:49 -0500 (CDT) Newsgroups: ietf.confctrl Approved: ietf-confctrl@kepler.hedland.edu.au NNTP-Posting-Host: localhost Organisation: (mail2news gateway) test
Ora si dovrebbe essere in grado di inviare un file con...
/usr/bin/rnews -r localhost <rick.article
Non c'è bisogno di aspettare che l'articolo sia mostrato come non letto, basta guardare
nelle sottocartelle /var/spool/news/articles/
e vedere che file che sono stati creati.
Si può volere incrementare il tempo di vita degli articoli del gruppo di discussione. Nel mio caso ho voluto che non decadessero mai, cosí ho aggiunto la seguente linea...
ietf*:A:never:never:never
...al file /etc/news/expire.ctl
Per imparare di più sulla sintassi di questo file:
man expire.ctl
Per sta per Practical Extension and Report Language. È molto popolare per piccoli script che manipolino testi, che è esattamente quello che si vuole.
Perl, di default, è installato in molti sistemi Unix.
Se perl è installato in una cartella inusuale (non in /usr/bin/
),
allora si deve modificare la prima linea dello script.
Se questa righa è sbagliata sul mio sistema con kernel 2.2 ottengo:
"bash: /usr/local/bin/mail2news.pl: No such file or directory"
Possiamo tranquillamente cambiarla in: "bash: /usr/local/bin/mail2news.pl:
interprete non trovato. Controlla la prima linea dello script"?
#!/usr/bin/perl ($program = $0) =~ s%.*/%%; #( $version ) = $] =~ /(\d+\.\d+).*\nPatch level/; #die "$program: requires at least version 3 of perl\n" # if $version < 3; # $news_poster_program = "/usr/bin/inews"; # $news_poster_options = "-h -o \"mail2news gateway\""; $news_poster_program = "/usr/bin/rnews"; $news_poster_options = "-r localhost"; $postinghost = "localhost"; if ($#ARGV < 0) { # $newsgroup = "test"; # we'll expect the newsgroup line in the body } elsif ($#ARGV == 0) { $newsgroup = $ARGV[0]; } else { die "usage: $program [newsgroup]\n"; } # in case inews dumps core or something crazy $SIG{'PIPE'} = "plumber"; sub plumber { die "$program: \"$news_poster_program\" died prematurely!\n"; } open (INEWS, "| $news_poster_program $news_poster_options") || die "$program: can't run $news_poster_program\n"; # header munging loop while (<STDIN>) { last if /^$/; # transform real from: line back to icky style s/^From:\s+(.*) <(.*)>/From: $2 ($1)/; s/Message-Id/Message-ID/; # transform from_ line to path header; also works locally s/^From\s+(\S+)@(\S+).*/Path: $2!$1/ || s/^From\s+(\S+)[^@]*$/Path: $1\n/; print INEWS # if /^(Date|From|Subject|Path|Newsgroups|Organization|Message-ID):/i; if /^(Date|From|Subject|Path|Newsgroups|Message-ID):/i; $saw_subject |= ( $+ eq 'Subject' ); $saw_msgid |= ( $+ eq 'Message-ID' ); # $saw_newsgroup |= ( $+ eq 'Newsgroups' ); } warn "$program: didn't expect newsgroup in both headers and ARGV\n" if $newsgroup && $saw_newsgroup; die "$program: didn't get newsgroup from either headers or ARGV\n" unless $newsgroup || $saw_newsgroup; $approved = $newsgroup; $approved =~ s/\./'-'/eg; ($sec,$min,$hour,$mday,$mon,$year)=localtime(time); $madeupid = "\<$year$mon$mday.$hour$min$sec.$$\@kepler.hedland.edu.au\>"; printf INEWS "Newsgroups: %s\n", $newsgroup if $newsgroup; printf INEWS "Approved: %s\@kepler.hedland.edu.au\n", $approved; print INEWS "Subject: Untitled\n" unless $saw_subject; printf INEWS "Message-ID: %s\n", $madeupid unless $saw_msgid; printf INEWS "NNTP-Posting-Host: %s\n", $postinghost; print INEWS "Organisation: (mail2news gateway)\n"; print INEWS "\n"; print INEWS while <STDIN>; # gobble rest of message close INEWS; exit $?;
Io ho salvato lo script in /usr/local/bin (e utilizzeremo questo percorso per tutto l'HOWTO).
Ci si assicuri di rendere lo script eseguibile per tutti, ma senza permesso di scrittura per il gruppo e gli altri.
chmod a+x /usr/local/bin/mail2news.pl
chmod go-w /usr/local/bin/mail2news.pl
o
chmod 555 /usr/local/bin/mail2news.pl
per brevità.
Ho testato questo script cambiando il programma per inviare news da /usr/bin/rnews a /bin/cat. Quindi ho salvato una mail mandata a me stesso in un file. Infine ho eseguito mail2news.pl sulla mail salvata e catturato l'output in un file.
/usr/local/bin/mail2news.pl ietf.confctrl </tmp/savedMailFile >/tmp/article
Sí l'output dello script deve contener l'indirizzo di un australiano. Il mio consiglio è che l'indirizzo sia un indirizzo garantito nella propria configurazione (sebbene non possa trovarlo nella mia) per approvare l'invio moderato.
Se lo script mail2news.pl non è nel percorso
si ottiene l'errore bash: mail2news.pl: command not found
.
Si deve aggiungere quindi questa direcory al percorso:
PATH=$PATH:/usr/local/bin
(che funziona solo per la sessione corrente) o dare un percorso assoluto quando si esegue lo script:
/usr/local/bin/mail2news.pl
Per veder l'attuale valore della variabile PATH:
echo $PATH
Si deve prima creare un indirizzo di posta locale a cui far spedire la mailing-list. Questo indirizzo sarà configurato per eseguire un programma (spedire ad un gruppo di discussione) tutte le volte che arriva un mail. Sfortunatamente (per noi), questa opzione non è abilitata usualmente per ragioni di sicurezza.
Questo HOWTO descrive solo come configurare sendmail.
qmail
è un'altra scelta eccellente, ma non è ancora
trattato.
Invece di creare un nuovo acconto per un utente, si creerà solo
un alias. Per sendmail questi sono contenuti in /etc/aliases
.
La sintassi è definita nella pagina man...
man aliases
Nell'esempio, il nome utente dell'indirizzo di mail
è confctrl
che spedisce al gruppo di discussione locale
ietf.confctrl
, cosí aggiungiamo una riga...
confctrl: "| /usr/local/bin/mail2news.pl ietf.confctrl "
Il doppio apice è richiesto. Non ci può essere uno spazio tra la prima coppia di apici e il carattere | (pipe), o sendmail si lamenterà: "User unknown".
Quandunque si modifichi il file /etc/aliases
, si dovrà
comunicarlo a sendmail.
sendmail -bi
Dopo aver mandato una e-mail, si controlli il file /var/log/maillog per controllare se ha funzionato. Il log può contenere un utile messaggio di errore. Ho trovato conveniente aprire un'altro terminale per seguire il log con
tail -f /var/log/maillog
Il "pipe al programma" è il CGI della posta elettronica. Quando arriva una mail, invece di appenderla ad un file, sendmail esegue uno script o un programma e consegna la mail allo standard input.
Attualmente, con Redhat 6.0, sendmail è distribuito con il "pipe al programma" abilitato, ma solo un numero limitato di programmi é eseguibile. La sicurezza degli utenti non era un bisogno sulla mia macchina, cosí otrovato piú facile abilitare l'esecuzione di tutto. D'altra parte non c'è una pagina di manuale per smrsh.
Per rendere possibile il "pipe al programma" dobbiamo modificare sendmail.cf
,
modificando sendmail.mc
, per non utilizziare la shell ristretta.
Stranamente, scommentando l'opzione, non funziona, quindi ho dovuto
cambiare la shell da /usr/sbin/smrsh
a /bin/bash
.
L'intestazione del file /etc/senmail.mc
di Redhat 6 ha un errore.
La linea di comando giusta è
m4 /etc/sendmail.mc >/etc/sendmail.cf
Si deve fare questo quando si cambia sendmail.mc
. Fortunatamente
Redhat estenderà la magnifica idea del Makefile in /etc/mail
in modo da dover solo scrivere make.
Si dovrà prima installare sendmail-cf.
qualcosa.rpm
Ad esempio:
rpm -i sendmail-cf-8.9.3-10.i386.rpm
Ogni volta che si modifica il file sendmail.cf, si deve far ripartire sendmail...
/etc/rc.d/init.d/sendmail restart
La Redhat, di default, non installa la documentazione di sendmail.
È distribuita in un pacchetto rpm separato con un nome come
sendmail-doc-8.9.3-10.i386.rpm. Questo crea una cartella /usr/doc/sendmail
rpm -i sendmail-doc-*
http://www.sendmail.org/ ca/email/doc/op-sh-5.html descrive la sintassi del sendmail.cf. Spero che non dobbiate utilizzarla.
Questa è descrizione delle caratteristiche che si stanno modificando in sendmail.mc http://www.sendmail.org/m4/features.html
Sendmail ha un pagina di manuale...
man sendmail
Se si hanno dei problemi e si crea un alias di un indirizzo di posta
con un script differente e più semplice per testarlo,
si ricordi che sendmail esegue il programma come utente non privilegiato,
che probabilmente non avrà il diritto di scrivere ovunque, eccetto
che in cartelle come /tmp
.
Il metodo di sottoscrizione ad ognuna delle mailing list è differente, sebbene implichi l'invio di un certo tipo di messaggio di posta. Per favore, si stia attenti a non mandare l'indirizzo di risposta al gruppo. È un metodo sicuro per annoiare i membri della lista. Molte mailing list hanno indirizzi separati per le sottoscrizioni. In confctrl, l'indirizzo di amministrazione è confctrl-request@isi.edu, come spiegato da http://www.ietf.org/html.charters/mmusic-charter.html.
Quando ci si è iscritti con successo, si dovrebbe vedere un messaggio di benvenuto nel newsgroup.
Alcune liste non permettono di iscriversi con un indirizzo diverso da quello con cui si sta inviando. In questo caso si dovrà truccare l'indirizzo di ritorno di una e-mail.
Questa è la cosa più semplice da fare con un vecchio Netscape. Accetta qualsiasi cosa come indirizzo di ritorno. Fortunatamente, i browser moderni, richiedono che si scarichi posta con successo per un indirizzo, prima di permettere l'invio. Quindi si deve tornare al buon vecchio metodo...telnet.
Quando si richiede un pagina web, il browser effettua una richiesta al DNS per convertire il nome del dominio in un indirizzo IP. Questo equivale alla ricerca di un campo "A" (sono considerati anche i campi "CNAME"). Quando si invia un e-mail, si ricerca il campo "MX". Se non è trovato allora si utilizza il campo "CNAME", o "A". Quindi per truccare un'e-mail si deve cercare il campo MX.
dig mx isi.edu
darà...
; <<>> DiG 8.2 <<>> mx isi.edu
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 4
;; QUERY SECTION:
;; isi.edu, type = MX, class = IN
;; ANSWER SECTION:
isi.edu. 1D IN MX 0 tnt.isi.edu.
isi.edu. 1D IN MX 10 venera.isi.edu.
;; AUTHORITY SECTION:
isi.edu. 1D IN NS venera.isi.edu.
isi.edu. 1D IN NS ns.isi.edu.
isi.edu. 1D IN NS east.isi.edu.
;; ADDITIONAL SECTION:
tnt.isi.edu. 1D IN A 128.9.128.128
venera.isi.edu. 1D IN A 128.9.176.32
ns.isi.edu. 1D IN A 128.9.128.127
east.isi.edu. 1D IN A 38.245.76.2
;; Total query time: 448 msec
;; FROM: fdd.com to SERVER: default -- 127.0.0.1
;; WHEN: Sun Jul 25 15:49:32 1999
;; MSG SIZE sent: 25 rcvd: 182
quindi si vorrà usare tnt.isi.edu (se non si ha dig, anche
;; nslookup
andrà bene).
La posta è consegnata utilizzando il protocollo SMTP (Simple Mail Transfert Protocol). Come la maggior parte dei protocolli di Internet è basato su ASCII per rendere lo sviluppo e la risoluzione dei problemi più semplici. Non spiegherò tutto, ma semplicemente darò un esempio. Spero che sia abbastanza.
Il protocollo è orientato alla linea. Ogni e-mail, come specificato nel documento RFC822, è composta da intestazioni e da un corpo, che sono separati dalla prima linea vuota (senza caratteri o spazi). Il protocollo SMTP specifica che l'e-mail è terminata da una linea contenente solo un punto.
halyard$ telnet tnt.isi.edu 25
Trying 128.9.128.128...
Connected to tnt.isi.edu.
Escape character is '^]'.
220 tnt.isi.edu ESMTP Sendmail 8.8.7/8.8.6; Sun, 25 Jul 1999 14:01:25 -0700 (PDT)
helo isi.edu
250 tnt.isi.edu Hello rick@node-d8e9822 [216.233.8.34] (may be forged), pleased to meet you
mail from:<confctrl@news.sfour.com>
250 <confctrl@news.sfour.com>... Sender ok
rcpt to:<confctrl-request@isi.edu>
250 <confctrl-request@isi.edu>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
From:<confctrl@news.sfour.com>
Subject: help
help
.
250 OAA26778 Message accepted for delivery
quit
221 tnt.isi.edu closing connection
Connection closed by foreign host.
halyard$
La mailing list è l'ultima in parte perché è la più lenta. Quando la posta viene girata ad altri indirizzi, sipuò aspettare un'ora prima di vedere la risposta.