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 :
| 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 | document PDF | |
| image/jpeg | .jpg, .jpeg | image JPEG |
| image/gif | .gif | image GIF |
| text/html | .htm, .html | document HTML |
| text/x-vcard | VCard Netscape |