POD2-FR

 view release on metacpan or  search on metacpan

FR/perlfaq9.pod  view on Meta::CPAN

forme d'un chemin absolu (sans le schéma ni le nom du serveur) est
résolu en interne par le serveur sans utiliser la redirection HTTP. En
tous cas, les spécifications CGI n'autorisent pas les URL relatifs.

L'utilisation de CGI.pm est fortement recommandée. L'exemple
ci-dessous montre une redirection avec un URL complet. Cette
redirection est gérée par le navigateur web.

  use CGI qw/:standard/;
   
  my $url = 'http://www.cpan.org/';
  print redirect($url);

Ce deuxième exemple montre une redirect avec un URL sous la forme d'un
chemin absolu. Cette redirect est gérée par le serveur web local.

  my $url = '/CPAN/index.html';
  print redirect($url);

Si vous souhaitez le coder vous-même directement, c'est faisable comme
suit (le "\n" final est montré séparément pour être plus clair). que
l'URL soit complet ou sous la forme d'un simple chemin absolu.

  print "Location: $url\n";   # en-tête de la réponse CGI
  print "\n";                 # fin de l'en-tête

=head2 Comment mettre un mot de passe sur mes pages WebE<nbsp>?

Pour que l'authentification soit active sur votre serveur web, il faut
le configurer pour cela. Cette configuration diffèrent selon le
serveur web -- apache ne fait pas comme iPlanet qui ne fait pas comme
IIS. Consultez la documentation de votre serveur web pour connaître
les détails de configuration de ce serveur.

=head2 Comment éditer mes fichiers .htpasswd et .htgroup en PerlE<nbsp>?

Les modules HTTPD::UserAdmin et HTTPD::GroupAdmin proposent une
interface orientée objet cohérente pour ces fichiers, quelle que soit
la façon dont ils sont stockés. Les bases de données peuvent être du
texte, une dbm, une Berkley DB ou n'importe quelle autre base de
données avec un pilote compatible DBI. HTTPD::UserAdmin accepte les
fichiers utilisés par les mécanismes d'authentification 'Basic' et
'Digest'. Voici un exempleE<nbsp>:

    use HTTPD::UserAdmin ();
    HTTPD::UserAdmin
          ->new(DB => "/foo/.htpasswd")
          ->add($username => $password);

=head2 Comment être sûr que les utilisateurs ne peuvent pas entrer de valeurs dans un formulaire qui font faire de vilaines choses à mon script CGIE<nbsp>?

Voyez les références à la sécurité dans la Meta FAQ S<CGI :>

  http://www.perl.org/CGI_MetaFAQ.html

=head2 Comment analyser un en-tête de mailE<nbsp>?

Pour une solution rapide et peu propre, essayez cette solution dérivée
de L<perlfunc/split>E<nbsp>:

    $/ = '';
    $header = <MSG>;
    $header =~ s/\n\s+/ /g;      # fusionne les lignes fractionnées
    %head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header );

Cette solution ne fonctionne pas correctement si, par exemple, vous
essayez de mettre à jour toutes les lignes reçues. Une approche plus
complète consiste à utiliser le module Mail::Header du CPAN (faisant
parti du paquetage MailTools).

=head2 Comment décoder un formulaire CGIE<nbsp>?

(contribution de brian d foy)

Utilisez la module CGI.pm qui vient avec Perl. Il est rapide, simple
et effectue le travail nécessaire pour s'assurer que tout se passe
correctement. Il gère les requêtes GET, POST et HEAD, les formulaires
multipart, les champs multi-valués, les combinaisons chaîne de requête
et données de flux, et plein d'autres choses dont vous ne voulez
probablement pas vous préoccuper.

Et tout cela d'une manière on ne peut plus C<simple :> le module CGI
analyse automatiquement les entrées et rend accessible chacune des
valeurs via la fonction C<param()>.

  use CGI qw(:standard);
  
  my $total = param( 'prix' ) + param( 'transport' );
  my @items = param( 'item' ); # valeurs multiples, pour un même champ

Si vous préférez une interface orientée objet, CGI.pm sait aussi le
faire.

  use CGI;
  
  my $cgi = CGI->new();
  
  my $total = $cgi->param( 'prix' ) + $cgi->param( 'transport' );
  
  my @items = $cgi->param( 'item' );

Vous pouvez aussi essayer le module CGI::Minimal qui est version
allégée pour faire la même chose. D'autres modules CGI::* de CPAN
peuvent aussi mieux vous convenir.

Beaucoup de gens essaye d'écrire leur propre décodeur (ou recopie
celui d'un autre programme) et tombe ensuite dans l'un des nombreux
pièges de cette tâche. Il est plus simple et moins embêtant d'utiliser
CGI.pm.

=head2 Comment vérifier la validité d'une adresse électroniqueE<nbsp>?

Vous ne pouvez pas, du moins pas en temps réel. Dommage, heinE<nbsp>?

Sans envoyer un mail à cette adresse pour constater qu'il y a un être
humain à l'autre bout pour vous répondre, vous ne pouvez pas
déterminer si une adresse est valide. Même si vous appliquez l'en-tête
standard d'email, vous pouvez rencontrer des problèmes, car il existe
des adresses valides qui ne sont pas compatibles avec la RFC-822 (le
standard des en-têtes des mails), et inversement il existe des
adresses qui ne sont pas délivrables et qui sont compatibles.

FR/perlfaq9.pod  view on Meta::CPAN

    $mailer->open({ From    => $from_address,
                    To      => $to_address,
                    Subject => $subject,
                  })
        or die "Can't open: $!\n";
    print $mailer $body;
    $mailer->close();

Le module Mail::Internet utilise Net::SMTP qui est moins
Unix-centrique que Mail::Mailer, mais moins fiable. Évitez les
commandes SMTP crues. Il y a de nombreuses raisons pour utiliser un
agent de transport de mail comme sendmail. Celles-ci comprennent la
mise en file d'attente, les enregistrement MX et la sécurité.

=head2 Comment utiliser MIME pour attacher des documents à un S<mail ?>

Cette réponse est directement extraite de la documentation du module
MIME::Lite. Créez un message multipart (c'est à dire avec des
documents attachées).

  use MIME::Lite;
  
  ### Création d'un nouveau message multipart
  $msg = MIME::Lite->new(
               From    =>'me@myhost.com',
               To      =>'you@yourhost.com',
               Cc      =>'some@other.com, some@more.com',
               Subject =>'A message with 2 parts...',
               Type    =>'multipart/mixed'
               );
  
  ### Ajout de parties (chaque "attach" a les mêmes arguments que "new"):
  $msg->attach(Type     =>'TEXT',
               Data     =>"Here's the GIF file you wanted"
               );
  $msg->attach(Type     =>'image/gif',
               Path     =>'aaa000123.gif',
               Filename =>'logo.gif'
               );
  
  $text = $msg->as_string;

MIME::Lite propose aussi une méthode pour envoyer le messages.

  $msg->send;

Par défaut, il utilise C<sendmail> mais on peut le paramètrer pour
qu'il utilise SMTP via L<Net::SMTP>.

=head2 Comment lire du courrierE<nbsp>?

Vous pourriez utiliser le module Mail::Folder de CPAN (faisant partie
du paquetage MailFolder) ou le module Mail::Internet de CPAN (faisant
partie du paquetage MailTools), toutefois, un module est souvent un
marteau pour écraser une mouche. Voici un trieur de mail.

  #!/usr/bin/perl
  
  my(@msgs, @sub);
  my $msgno = -1;
  $/ = '';                    # lit un paragraphe
  while (<>) {
    if (/^From/m) {
      /^Subject:\s*(?:Re:\s*)*(.*)/mi;
      $sub[++$msgno] = lc($1) || '';
    }
    $msgs[$msgno] .= $_;
  }
  for my $i (sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msgs)) {
    print $msgs[$i];
  }

Ou de façon plus succincte,

    #!/usr/bin/perl -n00
    # bysub2 - awkish sort-by-subject
    BEGIN { $msgno = -1 }
    $sub[++$msgno] = (/^Subject:\s*(?:Re:\s*)*(.*)/mi)[0] if /^From/m;
    $msg[$msgno] .= $_;
    END { print @msg[ sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msg) ] }

=head2 Comment trouver mon nom de machineE<nbsp>/ nom de domaineE<nbsp>/ mon adresse IPE<nbsp>?

(contribution de brian d foy)

Le module Net::Domain, qui fait partie de la distribution standard
depuis Perl 5.7.3, peut vous fournir le nom d'hôte complet (fully
qualified domain name ou FQDN), le nom d'hôte (ou de machine) ou le
nom de domaine.

  use Net::Domain qw(hostname hostfqdn hostdomain);
  
  my $host = hostfqdn();

Le module C<Sys::Hostname>, inclus dans la distribution standard
depuis Perl 5.6, peut aussi vous donner le nom d'hôte.

  use Sys::Hostname;
  
  $host = hostname();

Pour obtenir l'adresse IP, vous pouvez faire appel à la fonction
prédéfinie <gethostbyname> pour transformer le nom d'hôte en un
nombre. Pour convertir ce nombre en une adresse classique (a.b.c.d)
que la plupart des gens attendent, utilisez la fonction C<inet_ntoa>
du module C<Socket> qui fait partie de perl.

  use Socket;
  
  my $address = inet_ntoa(
    scalar gethostbyname( $host || 'localhost' )
    );

=head2 Comment récupérer un article de news ou les groupes actifsE<nbsp>?

Utilisez les modules Net::NNTP ou News::NNTPClient, tous les deux
disponibles sur le CPAN. Ceux-ci peuvent rendre des tâches comme la
récupération de la liste des groupes de news aussi simple S<que :>

    perl -MNews::NNTPClient
      -e 'print News::NNTPClient->new->list("newsgroups")'



( run in 1.298 second using v1.01-cache-2.11-cpan-54e63673c56 )