
                           Mini Howto Mail vers News

Robert Hart, InterWeft IT Consultants Melbourne, Australie, iweft@ipax.com.au
Traduit par Olivier Tharan, tharan@int-evry.fr

   v1.0, 4 novembre 1996
     _________________________________________________________________

   _Ce document dcrit comment configurer votre logiciel de News et
   mail2news.pl pour relier des listes de distribution aux groupes de
   news locaux. _
     _________________________________________________________________

1. Copyright et autres choses

   Le copyright de ce document est retenu par l'auteur. Il donne la
   permission de distribuer ce document par des moyens lectroniques et
   sur des CDs,  condition qu'il soit gard entirement dans son format
   d'origine. Il donne aussi la permission d'imprimer une copie de ce
   document pour usage personnel.

   La publication de ce document en partie ou en entier sans la
   permission du propritaire du copyright de toute manire autre
   qu'indique ci-dessus est interdite.

   Ce document est directement support par InterWeft IT Consultants
   (Melbourne, Australie).

   La dernire version de ce document est disponible sur le site WWW
   d'InterWeft chez InterWeft IT Consultants, http://203.29.72.65/.

2. Introduction

   La plupart des sites sur Internet sont toujours en train de chercher
   des moyens d'amliorer l'utilisation de la bande passante limite dont
   ils disposent sur leur lien  Internet.

   Supposons que plus d'un utilisateur s'abonne  la mme liste de
   distribution, et il y aura duplication de trafic. S'il y a un certain
   nombre de telles duplications, ou si le trafic sur les listes est
   important, la consommation de bande passante s'accrot.

   En abonnant le site  une liste (si c'est permis par le propritaire
   de la liste), et en _routant_ le courrier lectronique vers le serveur
   de news local, il est possible de rendre les listes de distribution
   accessibles  tous les utilisateurs du site ou, en utilisant les
   principes de scurit d'innd, de limiter l'accs  certains
   utilisateurs.

   Un tel abonnement de groupe (surtout s'il y a quelques listes  grand
   trafic) peut gnrer des conomies d'utilisation de bande passante
   importantes.

   La lecture des listes  travers un lecteur de news offre aussi aux
   utilisateurs l'avantage du threading (NdT : crer des enfilades), qui
   n'est pas disponible dans de nombreux programmes de mail, et aussi
   l'avantage de librer leur bote aux lettres pour du courrier
   peut-tre plus urgent ou plus personnel.

   Ce mini Howto dcrit la mise en place du script mail2news.pl pour
   raliser ceci.

2.1 O trouver mail2news.pl

   L'auteur n'a pas pu trouver mail2news.pl sur le CPAN (le rseau
   complet d'archives Perl), mais il a pu passer devant sans le voir. Il
   est cependant sur sunsite.unc.edu (quelque part) et aussi sur
   ftp.redhat.com.

   Comme ce script Perl n'est pas trs long, vous le trouverez  la fin
   de ce Howto.

3. Vue d'ensemble du systme

   Il est probablement plus facile de comprendre le fonctionnement de ce
   systme en suivant un message  partir de la liste de distribution
   vers le groupe de news, puis d'un message post sur le groupe de news
   local (rout vers la liste de distribution) et en regardant comment
   ils sont traits.

3.1 Le courrier venant de la liste de distribution

   Le courrier de la liste de distribution est envoy  toutes les
   adresses mail abonnes. Un alias de mail spcial est abonn  la liste
   de distribution en question et tout le trafic  destination et en
   provenance de la liste est ainsi envoy par le serveur de liste 
   cette adresse.

   Quand le courrier de la liste de distribution arrive sur la machine
   locale, l'alias de mail envoie le message entrant dans mail2news.pl.
   L'alias de mail spcifie aussi le groupe de news (local) de
   destination.

   Le script mail2news.pl traite le message, en appliquant de nouvelles
   en-ttes et utilise ensuite rnews ou inews pour poster le message dans
   le groupe de news.

3.2 Messages posts dans le groupe de news local

   Le groupe de news local est install en tant que groupe modr,
   puisque ceci nous permet de bnficier des possibilits de courrier
   lectronique d'innd. Tout message post dans un groupe modr n'est
   pas transmis automatiquement au groupe.  la place, les messages sont
   envoys par _email_ au modrateur du groupe.

   En dclarant le modrateur du groupe de news local comme tant
   l'adresse de la liste de distribution, tous les messages posts sur le
   groupe de news local seront envoys par _email_  la liste de
   distribution par innd et n'apparatront qu'une fois qu'ils auront t
   reus par mail2news.pl qui ajoute la ligne _approved_ ncessaire aux
   messages pour qu'innd accepte de les poster dans le groupe de news.

4. Configurer mail2news

   Placez le script mail2news.pl dans un endroit convenable. Je prfre
   /usr/local/scripts, mais l'endroit dpend de vous.

   Vous devrez diter le script comme suit :

     * au dbut du script, assurez-vous que vous pointez vers le binaire
       Perl local
         _____________________________________________________________

#!/usr/bin/perl
# pointe vers l'endroit courant de Perl
         _____________________________________________________________

     * j'ai eu des problmes avec les trois lignes suivantes. Les mettre
       en commentaire ne pose pas de problmes.
         _____________________________________________________________

( $version  ) = $] =~ /(\d+\.\d+).*\nPatch level/;
die "$program: demande au moins la version 3 de Perl\n"
       if $version < 3;
         _____________________________________________________________

     * ditez les lignes suivantes pour pointer vers le programme qui
       poste (j'utilise rnews) et vers votre machine de news :
         _____________________________________________________________

# $inews = "/usr/bin/inews";
# $iopts = "-h -o \"passerelle mail2news\"";
$inews = "/usr/bin/rnews";
$iopts = "";
$postinghost = "votre.serveur.de.news";   # pointe vers votre serveur de news
         _____________________________________________________________

     * assurez-vous que le script est excutable (mode 755).

5. Mettre en place les alias de mail

   ditez /etc/aliases pour crer des entres pour les listes de
   distribution que vous voulez envoyer vers les news. Chaque entre doit
   tre de la forme :

<adresse email abonne  la liste>: \
          "| /usr/local/scripts/mail2news.pl <nom du groupe de news local>"

   Si par exemple l'adresse de mail  laquelle il faut envoyer le
   courrier de la liste (l'adresse _email_ abonne) est liste_site et le
   groupe de news local dans lequel il faut poster le courrier s'appelle
   groupe.site.local, l'alias sera

# adresse d'abonnement de groupe pour machin@une.certaine.liste
liste_site: "|/usr/local/scripts/mail2news.pl groupe.site.local"

   Crez une entre pour chaque liste de distribution que vous devez
   router vers votre serveur de news local et lancez ensuite newaliases.

6. Configurer les groupes de news et le serveur de news (innd)

   En utilisant ctlinnd, crez les groupes de news sur votre serveur de
   news. Rappelez-vous qu'ils doivent tre locaux, donc nommez-les de
   faon distincte avec un prfixe de faon  les exclure de votre
   distribution de news (dans le fichier newsfeeds).

   Vous devez aussi dire  innd que le groupe est modr (en utilisant
   ctlinnd). Rappelez-vous que innd est trs sensible aux propritaires
   et permissions de fichiers, vous devez agir  ce niveau avec innd en
   tant qu'utilisateur _news_. Vous indiquez un groupe modr en donnant
   le paramtre m  la commande newgroup.

ctlinnd newgroup <nom du nouveau groupe> m <administrateur>

   Le m indique  innd que le groupe est modr.

   ditez votre fichier newsfeeds pour vous assurer que ces groupes
   locaux ne sont pas distribus (sauf si vous voulez spcifiquement que
   a se passe ainsi).

   Par exemple, si votre liste de distribution s'appelle
   groupe.site.local, vous ajouterez sans doute !local* dans le second
   champ des sites que vous distribuez (ou dont vous recevez les news)
   dans votre fichier newsfeeds.

   Maintenant, de faon  vous assurer que les messages des utilisateurs
   sont envoys sur la liste automatiquement par innd, ditez
   /etc/news/moderators (ou /usr/local/news/moderators) pour ajouter une
   ligne qui dclare l'adresse de la liste de distribution comme
   modrateur.

groupe.site.local:liste@un.site.de.liste

7. Abonner l'alias mail2news  la liste de distribution

   Vous devez maintenant abonner l'alias de mail  la liste de
   distribution. Vrifiez avec l'information de la liste de distribution
   comment s'abonner. Certaines listes de distribution vous permettent
   d'abonner une adresse _email_ diffrente de celle d'o vient
   l'abonnement (elles vrifient la confirmation avec l'adresse  abonner
   avant d'abonner rellement cette adresse).

   D'autres listes de distribution ne permettent pas ceci. Vous devrez
   donc _forger_ une demande d'abonnement. Il y a plusieurs faons de
   faire ceci. L'une des plus simples est d'utiliser Netscape Mail
   configur (de manire temporaire) avec l'adresse avec laquelle la
   liste de distribution doit envoyer le courrier.

   Aprs l'abonnement, vous devriez voir un message de bienvenue de la
   part du serveur de listes dans votre serveur de news. Dans ce cas,
   tout s'est bien pass et vous pouvez maintenant tester l'autre sens en
   postant un message de news dans votre nouvelle liste.

   Le message _ne devrait pas_ apparatre immdiatement dans le groupe de
   news. Il devrait tre envoy par courrier lectronique et reu 
   nouveau et post dans le groupe de news.

   Si cela fonctionne, vous avez russi  router la liste vers les news.

8. Si a ne fonctionne pas...

   Si a ne marche pas, vous devez retrouver la trace des messages pour
   voir exactement o a s'arrte de fonctionner. Des outils utiles  ce
   niveau sont les logs de mail et de news.

   Robert Hart Melbourne, Victoria, Australie, octobre 1996

9. Le script mail2news.pl
     _________________________________________________________________

#!/usr/bin/perl

($program = $0) =~ s%.*/%%;

#( $version  ) = $] =~ /(\d+\.\d+).*\nPatch level/;
#die "$program: demande au moins la version 3 de Perl\n"
#        if $version < 3;

# $inews = "/usr/bin/inews";
# $iopts = "-h -o \"passerelle mail2news\"";
$inews = "/usr/bin/rnews";
$iopts = "";
$postinghost = "votre.serveur.de.news";

if ($#ARGV < 0) {
    # $newsgroup = "test";
    # nous attendons la ligne newsgroup dans le corps
} elsif ($#ARGV == 0) {
    $newsgroup = $ARGV[0];
} else {
    die "usage: $program [groupe de news]\n";
}

# si jamais inews fait un core dump ou quelque chose insense
$SIG{'PIPE'} = "plumber";
sub plumber { die "$program: \"$inews\" est mort trop tot !\n"; }

open (INEWS, "| $inews $iopts") ||
    die "$program: ne peut pas lancer $inews\n";

# boucle qui prend les en-tetes
while (<STDIN>) {
   last if /^$/;

   # transforme la vraie ligne from: dans le vieux style
   s/^From:\s+(.*) <(.*)>/From: $2 ($1)/;

   s/Message-Id/Message-ID/;

   # transforme la ligne from_ en en-tete de chemin ;
   # fonctionne aussi en local
   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: n'attendait pas le groupe dans les en-tetes et les arguments\n"
    if $newsgroup && $saw_newsgroup;

die "$program: n'a pas obtenu le groupe des en-tetes ni des arguments\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>;   # avale le reste du message

close INEWS;
exit $?;
     _________________________________________________________________
