Quoi de plus agaçant que de voir sa boîte aux lettres électronique envahie de messages, souvent en anglais, proposant des produits et services plus ou moins licites ? Une des façons de s’en protéger consiste à installer des produits payants, qui filtrent les e-mails sur des mots clés détectés dans le sujet, dans le corps du message ou dans l’adresse de messagerie de l’expéditeur. Il existe également des solutions gratuites, comme celle présentée ici.Si votre infrastructure de messagerie s’appuie sur Microsoft Exchange Server 2000, vous pouvez élaborer un event sink. Développé en VBScript, en Visual Basic ou en Visual C++, ce programme s’insère dans un composant de Microsoft Exchange Server afin d’en enrichir les fonctions.À titre d’exemple, l’event sink présenté ici détruit (ou transfère dans une boîte aux lettres d’archive) les messages provenant d’un expéditeur dont l’adresse contient plusieurs caractères numériques à la suite, ce qui est souvent caractéristique des mails de spam.
1. Quel event sink utiliser ?
Il existe trois types d’event sinks. Embarqués dans le moteur SMTP de Microsoft Exchange, les premiers, les event sinks de protocole, interceptent la conversation SMTP entre le serveur et la machine interlocutrice. Développés en C++, ils ajoutent des commandes SMTP supplémentaires à celles supportées en standard par Exchange. Ils sont toutefois situés à un niveau trop bas pour convenir à cette mise en ?”uvre, l’objectif de cette dernière étant de récupérer un message complet afin d’examiner son expéditeur.De leur côté, les event sinks de stockage web sont pris en compte par le système de stockage d’Exchange 2000, lequel héberge les boîtes aux lettres des utilisateurs et les dossiers publics. Dotés de l’objet Message, ces programmes sont capables d’interpréter la chaîne de caractères constituant l’adresse de l’expéditeur. En revanche, ils se définissent par unité de stockage. L’installation d’un tel event sink pour chaque boîte aux lettres concernée reste donc indispensable, ce qui n’est pas sans conséquence sur les performances du serveur.Enfin, l’event sink de transport, sur lequel s’appuie notre exemple, s’intègre dans le moteur de file d’attente et de catégorisation d’Exchange Server, là où les messages sont analysés puis reroutés en fonction de critères liés au destinataire et à l’expéditeur. À ce niveau, l’objet Message est à la disposition de l’event sink via l’interface CDO for Exchange 2000.Ce type de programme est développé en VBScript ou en Visual Basic, sans perte trop importante de performances par rapport à un code écrit en C++. Attention, les event sinks de transport fonctionnent en mode “in process“, ce qui signifie qu’un dysfonctionnement de l’event sink peut perturber le fonctionnement de l’ensemble du moteur de routage d’Exchange Server. Ce procédé présente néanmoins l’avantage d’accroître les performances.
2. Développez l’event sink de transport en VBScript
Comme c’est l’usage, le fichier VB-Script porte l’extension “.VBS“. Il contiendra deux procédures. La première, IEventIsCacheable_IsCacheable, ne réalise aucune opération, mais met en ?”uvre l’interface (A). Elle doit donc être présente et retourner un code valeur OK. La procédure ISMTPOnArrival_OnArrival (B), quant à elle, constitue le vrai c?”ur du programme. Elle reçoit en argument un objet CDO de type message, qui représente le message dans sa totalité (enveloppe, texte, pièces jointes, etc.), ainsi que la variable “EventStatus“.Grâce à cette dernière, l’event sink de transport indique si le moteur de routage doit faire passer le message au travers des autres event sinks qui peuvent être inscrits. La propriété “From” de l’objet Message renferme l’adresse de messagerie SMTP de l’expéditeur, au format utilisateur @domaine. Cette adresse est une chaîne de caractères dont il convient d’extraire le nom d’utilisateur, situé avant le @. La règle arbitraire employée ici veut que si le nom d’utilisateur contient 3 caractères numériques à la suite, l’e-mail provient d’un spammer.Le programme doit donc vérifier le type (numérique ou pas) de chaque sous-chaîne de 3 caractères composant le nom de l’utilisateur (C). La solution la plus simple consiste à recourir à la fonction “VBScript Cint“. Si cette dernière retourne une erreur, la sous-chaîne n’est pas numérique. Si la fonction ne retourne pas d’erreur, la sous-chaîne est numérique et le message doit être supprimé ou envoyé dans une boîte aux lettres d’archive.
3. Supprimer ou archiver ?
Par sécurité, nous vous conseillons de conserver le message dans une boîte aux lettres d’archive (D), à condition que cette boîte soit régulièrement analysée par un administrateur. Définissez la valeur de la propriété “To” du message à l’adresse de messagerie de la boîte aux lettres d’archive, ainsi que les chaînes vides pour les propriétés CC (copie conforme) et BCC (copie conforme invisible) du message.Pour supprimer le message, vous devez modifier sa propriété “MessageStatus“. Cette propriété de l’enveloppe du message peut prendre 3 valeurs : 0 signifie que le message est autorisé à continuer sa route ; 2 : arrêter le message ; 3 : arrêter le message et l’enregistrer dans le répertoire “BadMail“. Parallèlement à la modification de la propriété “MessageStatus“, définissez la variable “EventStatus” de la procédure à 1, de façon à ce que le moteur d’Exchange ne transmette pas le message aux event sinks suivants.
4. Inscrivez le programme en tant qu’event sink
Pour effectuer cette opération, téléchargez l’utilitaire “smtpreg.vbs” à partir du site msdn.microsoft.com. Concevez ensuite un petit programme batch de 2 lignes, qui enregistre le programme VBScript en tant qu’event sink, en lui donnant un nom (E).L’event sink sera déclenché automatiquement à chaque passage de message provenant d’un expéditeur internet. Il ne sera donc pas activé sur les messages sortants, ce qui n’est pas grave puisque leurs expéditeurs ont forcément été authentifiés.
5. Les mêmes services que les produits payants
En vous appuyant sur l’ossature de cet event sink, vous pouvez exploiter toutes les propriétés du message : sujet, destinataires, texte, pièces jointes, etc. Quelques lignes de code suffisent pour développer une solution qui offre les mêmes services que les produits payants, à savoir filtrer le message en se reposant sur des mots clés dans le texte ou le sujet. Pour disposer d’un code plus robuste (mais pas beaucoup plus rapide), développez l’event sink en Visual Basic ou en Visual C++.
🔴 Pour ne manquer aucune actualité de 01net, suivez-nous sur Google Actualités et WhatsApp.