2010-10-05 16 views
39

Est-il possible de créer des règles dans Outlook 2007 en fonction d'une chaîne regex?Règles d'expression régulière dans Outlook 2007?

J'essaie d'ajouter un filtre pour les messages contenant une chaîne telle que: 4000-10, un numéro à quatre chiffres suivi d'un tiret, puis un numéro à deux chiffres, ce qui peut être quelque chose de 0000-00 à 9999-99.

Je l'utilisais comme une regex: \b[0-9]{4}\-[0-9]{2}\b mais le filtre ne fonctionne pas. J'ai aussi essayé quelques autres modifications sans succès. Je n'ai pas été en mesure de trouver quoi que ce soit de concret en ligne pour savoir si Outlook accepte même d'entrer des regex dans une règle, alors j'ai pensé que je demanderais ici au cas où je perdrais mon temps.

EDIT: Grâce au commentaire de Chris ci-dessous, j'ai pu implémenter ce filtre via une macro. Je pensais que je partage mon code ci-dessous dans le cas où il est en mesure d'aider quelqu'un d'autre:

Sub JobNumberFilter(Message As Outlook.MailItem) 
    Dim MatchesSubject, MatchesBody 
    Dim RegEx As New RegExp 

    'e.g. 1000-10' 
    RegEx.Pattern = "([0-9]{4}-[0-9]{2})" 

    'Check for pattern in subject and body' 
    If (RegEx.Test(Message.Subject) Or RegEx.Test(Message.Body)) Then 
     Set MatchesSubject = RegEx.Execute(Message.Subject) 
     Set MatchesBody = RegEx.Execute(Message.Body) 
     If Not (MatchesSubject Is Nothing And MatchesBody Is Nothing) Then 
      'Assign "Job Number" category' 
      Message.Categories = "Job Number" 
      Message.Save 
     End If 
    End If 
End Sub 
+1

Est-ce vraiment lié à la programmation? Je veux dire, vous ne demandez pas si la regex est correcte, seulement si Outlook supporte les expressions régulières –

+0

Je voulais dire en fait que les deux questions. Je n'ai pas beaucoup utilisé les regex, donc j'étais aussi incertain. Dans le même aspect cependant, si Outlook ne supporte même pas les expressions rationnelles, le point est discutable, alors c'était un peu ce que j'allais faire avec. – kcoppock

+1

Je ne pense pas que cela ait de l'importance, cela semble également correspondre = "[0-9] {4} - [0-9] {2}" –

Répondre

43

Je ne sais pas si une regex peut être utilisée directement dans une règle, mais vous pouvez avoir une règle qui déclenche un script et le script peut utiliser des regex. Je déteste Outlook. D'abord, vous devez ouvrir l'éditeur de script via Outils - Macro - Ouvrir Visual Basic Editor (Alt-F11 est le raccourci).

L'éditeur s'ouvrira. Il doit contenir un plan de projet dans un petit panneau dans le coin supérieur gauche. Le projet sera répertorié en tant que VBAProject.OTM. Développez cet élément pour révéler les objets Microsoft Office Outlook. Développez cela pour révéler ThisOutlookSession. Double-cliquez sur ThisOutlookSession pour ouvrir le volet d'édition de code (qui sera probablement vide).

Ensuite, sélectionnez Outils menu | Références et activer les références RegExp appelé quelque chose comme "Microsoft VBScript Regular Expressions 5.5"

Vous pouvez maintenant créer un sous-programme pour effectuer votre action de filtrage. Notez qu'un sous-programme appelé par une règle doit avoir un seul paramètre de type Outlook.MailItem. Par exemple:

' note that Stack Overflow's syntax highlighting doesn't understand VBScript's 
' comment character (the single quote) - it treats it as a string delimiter. To 
' make the code appear correctly, each comment must be closed with another single 
' quote so that the syntax highlighter will stop coloring everything as a string.' 

Public Enum Actions 
    ACT_DELIVER = 0 
    ACT_DELETE = 1 
    ACT_QUARANTINE = 2 
End Enum 

Sub MyNiftyFilter(Item As Outlook.MailItem) 
    Dim Matches, Match 
    Dim RegEx As New RegExp 
    RegEx.IgnoreCase = True 

    ' assume mail is good' 
    Dim Message As String: Message = "" 
    Dim Action As Actions: Action = ACT_DELIVER 

    ' SPAM TEST: Illegal word in subject' 
    RegEx.Pattern = "(v\|agra|erection|penis|boner|pharmacy|painkiller|vicodin|valium|adderol|sex med|pills|pilules|viagra|cialis|levitra|rolex|diploma)" 
    If Action = ACT_DELIVER Then 
     If RegEx.Test(Item.Subject) Then 
      Action = ACT_QUARANTINE 
      Set Matches = RegEx.Execute(Item.Subject) 
      Message = "SPAM: Subject contains restricted word(s): " & JoinMatches(Matches, ",") 
     End If 
    End If 

    ' other tests' 

    Select Case Action 
     Case Actions.ACT_QUARANTINE 
      Dim ns As Outlook.NameSpace 
      Set ns = Application.GetNamespace("MAPI") 

      Dim junk As Outlook.Folder 
      Set junk = ns.GetDefaultFolder(olFolderJunk) 

      Item.Subject = "SPAM: " & Item.Subject 
      If Item.BodyFormat = olFormatHTML Then 
       Item.HTMLBody = "<h2>" & Message & "</h2>" & Item.HTMLBody 
      Else 
       Item.Body = Message & vbCrLf & vbCrLf & Item.Body 
      End If 

      Item.Save 
      Item.Move junk 

     Case Actions.ACT_DELETE 
      ' similar to above, but grab Deleted Items folder as destination of move' 

     Case Actions.ACT_DELIVER 
      ' do nothing' 
    End Select 
End Sub 


Private Function JoinMatches(Matches, Delimeter) 
    Dim RVal: RVal = "" 

    For Each Match In Matches 
     If Len(RVal) <> 0 Then 
      RVal = RVal & ", " & Match.Value 
     Else 
      RVal = RVal & Match.Value 
     End If 
    Next 

    JoinMatches = RVal 
End Function 

Ensuite, vous devez créer une règle (Outils - Règles et alertes) pour déclencher ce script. Cliquez sur le bouton Nouvelle règle dans la boîte de dialogue pour lancer l'assistant. Sélectionnez un modèle pour la règle. Choisissez le modèle "Vérifier les messages à leur arrivée" dans la catégorie "Démarrer à partir d'une règle vide". Cliquez sur Suivant.

Choisissez la condition "Sur cette machine uniquement" (n'est-ce pas?) Et cliquez sur Suivant.

Choisissez l'option "Exécuter un script". Au bas de l'assistant où il montre votre nouvelle règle, il faut lire:

Apply this rule after the message arrives 
on this machine only 
run a script 

L'expression « un script » est un lien cliquable. Cliquez dessus et Outlook affichera une boîte de dialogue qui devrait répertorier le sous-programme que vous avez créé précédemment. Sélectionnez votre sous-programme et cliquez sur le bouton OK.

Vous pouvez cliquer sur Suivant pour ajouter des exceptions à la règle ou sur Terminer si vous n'avez aucune exception.Maintenant, comme si ce processus n'était pas assez compliqué, cette règle sera désactivée chaque fois que vous arrêtez et redémarrez Outlook sauf si vous signez le script avec une clé de signature de code. Si vous ne disposez pas déjà d'une clé de signature de code, vous pouvez create one avec OpenSSL. Ai-je mentionné que je déteste Outlook?

+0

Wow. Oui, je peux comprendre ta douleur. J'ai fait de la lumière dans PowerPoint (horrible cauchemar aussi) et c'est horrible. Merci beaucoup pour la réponse très détaillée! Je travaillerai là-dessus quand j'aurai du temps libre pour voir ce que je peux faire. Encore merci! – kcoppock

+0

Juste pour ajouter à ceci, j'ai trouvé il y a une manière alternative et plus facile de signer une macro: using un certificat auto-signé. http://msdn.microsoft.com/en-us/library/aa155754(office.10).aspx#oldigitalsignature_sign Vous pouvez en créer un via une partie de l'application Office appelée certificat numérique pour les projets VBA. – kcoppock

+0

+1 (je souhaite que je pourrais +1000!) Pour le 'Enum'. Je pense que je dois revenir en arrière et rendre chaque Macro que j'ai jamais écrit environ un million de fois plus lisible! Merci! –

15

Microsoft Outlook does not support regular expressions. Vous pouvez effectuer des recherches génériques, bien que, pour une raison inexplicable, le caractère générique soit %, et non *.

+1

Merci Ether. C'est bizarre qu'ils changent le caractère générique. – kcoppock

+2

Cet article de la Base de connaissances ne traite pas de l'assistant de règles en soi, mais plutôt d'un add-on pour CRM. Si vous analysez l'article, vous verrez qu'il est parfaitement logique de savoir pourquoi le signe% est utilisé dans ce contexte. C'est parce que c'est une requête SQL où le caractère générique est en effet un% – noonand

+0

MS 2013 supporte un caractère de pourcentage lors de la recherche de sujets et de corps de courriels (au moins) du ruban de recherche principal en regardant la boîte de réception. Mais si vous créez un "Dossier de recherche" (dossier virtuel dont le contenu est le résultat de diverses conditions de recherche), les conditions de recherche dans les "Dossiers de recherche" ne prennent * pas * en charge le caractère générique pourcentage. Way to go Microsoft>;) –

Questions connexes