Ingénieurs 2000
Filière Informatique et Réseaux

Projet Système 2001-2002
Christian Favier


CGI par l'exemple


Envoi de mail - Tableau de liens




Envoi de mail


Schéma:



Principe de l'envoi de mail anonyme:

L'envoi de mail consiste à envoyer un mail au travers un script CGI réalisé en Perl ici nommé sendmail.cgi.
Le script CGI récupère tout d'abord les données du formulaire HTML. Ces données contiennent l'adresse e-mail de destination et de source, le sujet du mail ainsi que son contenu.
Ensuite, nous allons voir comment utiliser la commande Unix "sendmail" pour pouvoir envoyer le mail.
Et enfin, le script renverra une page HTML confirmant l'envoi du mail.

Le formulaire (form.html):

<FORM ACTION="cgi-bin/send_mail.cgi" METHOD=POST><BR>
From: <INPUT TYPE="text" NAME="from" SIZE=50 MAXLENGTH=200><BR>
To: <INPUT TYPE="text" NAME="to" SIZE=50 MAXLENGTH=200><BR>
Subject: <INPUT TYPE="text" NAME="subject" SIZE=50 MAXLENGTH=200><BR>
Content: <TEXTAREA NAME="text" COLS=50 ROWS=10></TEXTAREA><BR>
<INPUT TYPE="submit" VALUE="submit">
<INPUT TYPE="reset" VALUE="reset"><BR>
</FORM>
Voir l'aperçu (save as pour le sauvegarder):

Le script CGI (sendmail.cgi):

#!/usr/bin/perl
require "cgi-lib.pl";
# Utilisation de la librairie cgi-lib.pl
# (voir le chapitre sur les bibliothèques)
&ReadParse; # Récupère les données du Formulaire
$mail = "/usr/lib/sendmail"; # Commande sendmail
$from = $in{from}; # Récupérer de l'adresse mail de l'expéditeur
open (MAIL,"|$mail $in{to}"); # Création d'un pipe
print MAIL <<"TAG";
From: $from
Subject: $in{subject}
To: $in{to}

$in{text}

TAG
close(MAIL);
	  
print "Content-type: text/html\n\n";
# En-tête pour la réponse aux clients
print <<"TAG";
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
Your e-mail has been sent...<BR>
Thank you for use this page realised by Moi.<BR>
<BR>
Tschuss!
</BODY>
</HTML>
TAG
Télécharger le script:

Quelques conseils d'utilisation:

Pour tester ce script, vous devez télécharger le formulaire form.html et le placer sur votre serveur (ou chez votre provider). Ensuite, vous devez aussi télécharger le script sendmail.cgi et le placer dans le répertoire "cgi-bin" de votre serveur.
Il ne faut pas oublier de changer les droits d'exécution sur le fichier sendmail.cgi par la commande:
	  chmod 755 sendmail.cgi
A noter aussi que vous devez avoir Perl installé sur votre serveur ainsi que sendmail.
Le chemin de Perl est mis à la première ligne du fichier (dans mon exemple, j'ai supposé que la commande perl était dans /usr/bin). Si le script ne marche pas, cette commande peut être située dans un autre répertoire (contacter votre administrateur).


Tableaux de liens


Schéma:



Principe du tableau de liens:

Perl est très utile pour mettre en page un fichier de données et notamment une liste et en particulier une liste de liens.
Le fichier links.txt contient une liste de liens. Chaque lien contient sa langue, son URL et une description du site en question.
Le script CGI links.cgi a pour but de transformer ce fichier en page HTML et de le retourner au client WWW.
Ainsi, pour mettre à jour cette page, il suffit de modifier le fichier de données et non de modifier du HTML.

Fichier de données links.txt:
Francais	http://www.alianwebserver.com/informatique/internet/cgi/default.htm	Aide sur les CGIs
Francais	http://www.perl-gratuit.com	Scripts CGI Perl gratuits
Francais	http://www.lecgi.net	Aide à l'utilisation des CGIs
Francais	http://www.scripts-fr.com	Toutes sortes de CGIs par thème
Francais	http://www.webdeveloppeur.com	Des outils web utiles
Francais	http://guide.ungi.net	Des cours sympas sur les technos Web en français
Francais	http://www.enstimac.fr/Perl/DocFr/perl.html	Docs du Perl en Français
Francais	news:fr.comp.lang.perl	News
Anglais	http://www.perl.org	Le site officiel du Perl
Anglais	http://www.perl.com	Perl.com The Source for Perl -- perl development, perl conferences
Anglais	http://stein.cshl.org/WWW/software/CGI	CGI.pm	Le site sur le package
Anglais	http://www.papillion.ne.us/~sthomas/cgi_in_c.html	CGI en C
Anglais	http://perl.oreilly.com	About Perl
Anglais	http://cgi-lib.berkeley.edu	Le site de la librairie cgi-lib.pl
Anglais	http://hoohoo.ncsa.uiuc.edu/cgi	The Common Gateway Interface
Anglais	http://www.freecode	Des tonnes de bibliothèques vraiment utiles
Anglais	news:comp.lang.perl.misc	News
Les champs sont séparés par des tabulations (\t en Perl).
Télécharger le fichier exemple links.txt:

Script CGI links.cgi:

#!/usr/bin/perl
print "Content-type: text/html\n\n"; # En-tête de la réponse
print "<HTML><HEAD><TITLE>PERL Search Results</TITLE></HEAD>\n";
print "<BODY bgcolor=#FFFFFF>\n";.
print<<"TAG";
<!– ENTETE DU TABLEAU -->
<FONT SIZE=+1><B>CGI en Perl - les liens</B></FONT>
<HR>
<TABLE BORDER=2>
<TR><TD><B>Type</B></TD>
<TD><B>Links</B></TD>
<TD><B>Description</B></TD></TR>
TAG

# Liste des liens du fichier:
print "<CENTER>\n";
open (LINKDATA,"data/links.txt"); # Ouverture du fichier de données
while (<LINKDATA>) { # Tant qu'il y a des données dans le fichier
	# Si la ligne ne commence pas par # et n'est pas vide:
	if ((!(/#.*/))&&(/.+/)){ 
		@data = split (/\t/,$_); # On découpe la ligne par tabulation
		$type = $data[0]; # Le type est dans la première colonne
		if ($data[0] eq $type_before) { # Si le type n'a pas changé
			$data[0]=""; # Le type ne sera pas affiché
		}
		$type_before = $type; # Le type d'avant
		print "<TR><TD>$data[0]</TD>"; # Affichage du type
		# Affichage du lien:
	 	print "<TD><A HREF=\"$data[1]\" TARGET=\"_blank\">";
		print "$data[1]</A></TD>";
		# Affichage de la description:
		print "<TD>$data[2]</TD></TR>\n"; 
	}
}
print "</TABLE>"; # Fin du tableau
close (LINKDATA); # Fermeture du fichier
print <<"TAG"; # Dernier affichage
<HR><DIV ALIGN="center"><FONT SIZE=-2>Page réalisé par
<A>HREF="mailto:christian\@favier.as">Christian FAVIER</A></FONT></DIV>
</CENTER></BODY></HTML>
TAG
Si c'est la première fois que vous lisez du Perl, c'est normal que vous hurliez en vous tirant les cheveux. Il faut savoir que le Perl est un langage puissant et qui contient de nombreuses fonctionnalités et il est souvent plus facile de coder mais beaucoup plus compliqué de décrypter le script d'une autre personne.
Ce qui peut être utile avec ce script est que vous pouvez voir l'utilisation des TAGs. Au lieu de faire plusieurs prints, il est parfois utile d'utilser un TAG (voir la syntaxe du script). Le script fera le print de toutes les lignes jusqu'à la prochaine ligne contenant le TAG (et uniquement le TAG, pas de tab ou autres).
Ce qui est utile aussi, c'est l'utilisation du tableau data qui contient toutes les données d'un lien grâce à la fonction split.
Pour le test sur les motifs, j'ai voulu faire mon petit malin, ou plutôt montré combien Perl est performant dans la recherche de motifs.
En effet, l'expression ((!(/#.*/))&&(/.+/)) teste la variable courante (c'est à dire la ligne courante dans notre cas) pour savoir si la ligne commence par un # (commentaire dans le fichier de données) ou si la ligne est vide.
Ainsi, le script CGI ne prendra pas en compte les lignes vides et les commentaires du fichier de données (links.txt).

Télécharger le script CGI sendmail.cgi:

Résultat:

Voir le résultat avec le fichier d'exemple:

Quelques conseils d'utilisation:

Pour utiliser le script CGI, téléchargez links.cgi et mettez le dans votre répertoire cgi-bin.
Changez les droits si besoin (chmod) et créez votre fichier links.txt dans un répertoire data. Pour le fichier de données, séparez bien les champs par des tabulations comme dans l'exemple: links.txt.
Vous pouvez changer de place votre fichier de données en modifiant le script...
Ensuite, vous pourrez voir le résultat en allant directement sur le CGI. Exemple: http://serveur/cgi-bin/links.cgi.




Page réalisée par Christian Favier