Mail2News Mini-Howto

Rick Dean <howto@fdd.com>

v2.1, 1 settembre 1999


Questo documento descrive come rifornire un news server con una mailing-list. Traduttore: Maurizio Mollicone, <mm551@jb.math.unifi.it>, 23 Marzo 2000

1. Diritti e distribuzione

1.1 Che cos'è questo documento

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.

1.2 Copyright (in inglese)

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.

1.3 Dove posso trovare questo HOWTO?

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

1.4 Storia del documento

2. Introduzione

2.1 Come, perché, più alcune definizioni

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.

2.2 Ambiente presupposto

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.

2.3 Metodologia

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.

2.4 Argomenti esclusi

Questo mini-HOWTO non riguarda...

Per favore non scrivetemi e-mail su questi argomenti (o SPAM).

3. Il lettore di news

3.1 Netscape

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.

3.2 Free Agent

Free Agent è un meraviglioso lettore di news di Forte per Windows. Si guardi: http://www.forteinc.com/agent/freagent.htm

3.3 trn e altri

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

4. Il server di news

4.1 Installazione del server di news

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

4.2 Far partire il news server

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

4.3 Creazione del newsgroup

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.

4.4 Ampliare l'accesso

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

4.5 Cambiare i permessi di /usr/bin/rnews

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

4.6 Testare l'invio dell'articolo

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

4.7 Funziona?

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.

4.8 Aumentare il tempo di vita

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

5. Lo script di invio e Perl

5.1 Che cos'è Perl?

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.

5.2 Locazione di perl

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"?

5.3 Lo script mail2news.pl


#!/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à.

5.4 Come si fa a sapere se lo script è in esecuzione?

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

5.5 Cosa c'entra l'Australia?

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.

5.6 Cosa significa $PATH?

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

6. Il demone di posta locale

6.1 Introduzione

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.

6.2 Creazione di un alias di posta

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

6.3 Funziona?

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

6.4 Abilitare il "pipe al programma"

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

6.5 Documentazione

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

6.6 Senza privilegi

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.

7. Il reindirizzatore della mailing list

7.1 Sottoscrizione

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.

7.2 Truccare la posta

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.

Cercare macchine MX

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).

SMTP

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$ 

7.3 Pazienza.

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.