next up previous contents
suivant: Conclusion monter: Utilisation avancée précédent: Utilisation avancée   Table des matières

Refuser des attachements (Word, HTML, etc.)

Thomas Nemeth a donné la recette qu'il utilise pour filtrer des messages contenant des attachements indésirables : scripts Visual Basic (.vbs), des exécutables Windows (.exe), des documents Word (.doc) ou Excel (.xls). Cette recette a pour effet de renvoyer un message à l'expéditeur lui demandant de ne pas envoyer ce genre d'attachements.

:0 HB
* ^Content-Disposition:.*\.(exe|vbs|doc|dot|xls)
*$ !X-Loop:.*$MOI
| (formail -rtk -p '| ' \
            -A "X-Loop: $MOI" \
            -A "Precedence: junk"; \
            cat $HOME/.procmail/badfile ) | $SENDMAIL -t -oi

Cette recette utilise principalement formail pour générer un message d'auto-réponse. On recherche, à la fois dans les en-têtes et dans le corps (drapeaux 'H' et 'B'), un en-tête MIME décrivant le contenu (Content-Disposition) et indiquant un nom de fichier se terminant par les extensions définies dans l'expression (exe|vbs|doc|dot|xls). Libre à vous d'en ajouter ou d'en retirer.

En cas de correspondance, on génère une réponse automatique, qui incluera le message complet : celui-ci est donc perdu pour un traitement ultérieur, copiez-le si vous voulez le garder quand même. Les options utilisées sont décrites dans la page de manuel de formail. On inclut le message d'origine, puis un message expliquant le refus et le tout est passé à Sendmail.

Vous avez sûrement remarqué la troisième ligne de cette recette. Expliquons-la plus en détail. Quand nous générons le message, nous ajoutons un en-tête X-Loop contenant notre adresse électronique (la variable $MOI pour tester si le message est déjà passé entre ses mains. Ceci a un but : éviter les boucles de courrier, qui peuvent s'avérer très gênantes à découvrir et à réparer. On teste donc avec cette règle que le message n'a pas déjà subi un filtrage. Le signe $ derrière l'étoile en début de ligne indique à procmail que se trouvent dans la ligne des variables qu'il faudra substituer (ici, $MOI).

Il est possible d'optimiser cette recette, pour coller plus spécifiquement au format MIME. En effet, l'en-tête Content-Type contient le type MIME de l'attachement, qui peut être plus fiable à vérifier que la simple extension du nom de fichier. On pourrait écrire la deuxième ligne ainsi, pour chercher les attachements binaires Windows, par exemple :

* ^Content-Type:.*application/octet-stream
* ^Content-Disposition.*name=.*\.exe
<action>

L'expression rationnelle cherche les en-têtes représentant un attachement de type application/octet-stream, dont le nom se termine par .exe. On peut faire de même avec d'autres types d'attachement, le mieux est de tester. Le tableau suivant représente des attachements courants avec leur type MIME correspondant :


Tableau 1: Attachements et types MIME
type MIME extension nom courant
application/octet-stream .exe binaire Windows
application/msword .doc document Word
application/vnd.ms-excel .xls document Excel
application/vnd.ms-powerpoint .pps, .ppt document PowerPoint
application/x-zip-compressed .zip document compressé Zip
application/x-unknown-content-type-hlpfile .hlp document d'aide Windows
application/pdf .pdf document PDF
image/jpeg .jpg, .jpeg image JPEG
image/gif .gif image GIF
text/html .htm, .html document HTML
text/x-vcard   VCard Netscape


next up previous contents
suivant: Conclusion monter: Utilisation avancée précédent: Utilisation avancée   Table des matières
Olivier Tharan 2002-06-09