Правила регулярных выражений в Outlook 2007?

40

Можно ли создавать правила в Outlook 2007 на основе строки регулярного выражения?

Я пытаюсь добавить фильтр для сообщений, содержащих строку, например: 4000-10, четырехзначное число, за которым следует тире, а затем двухзначное число, которое может быть от 0000-00 до 9999-99,

Я использовал это как регулярное выражение: \b[0-9]{4}\-[0-9]{2}\b, но фильтр не работает. Я также попробовал несколько других модификаций, но не повезло. Я не смог найти что-либо конкретное в Интернете о том, что Outlook даже поддерживает ввод регулярных выражений в правило, поэтому я решил, что попрошу здесь, если я буду тратить свое время.

EDIT: благодаря комментарию Криса ниже я смог реализовать этот фильтр с помощью макроса. Я думал, что поделился бы своим кодом ниже, если он сможет помочь кому-либо еще:

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
    Это действительно программирование? Я имею в виду, вы не спрашиваете, правильное ли регулярное выражение, только если Outlook поддерживает регулярные выражения
  • 0
    Я действительно имел в виду оба вопроса. Я не очень часто использовал регулярные выражения, поэтому я тоже был не уверен в этом. Однако в том же аспекте, если Outlook даже не поддерживает регулярные выражения, вопрос спорный, так что я с этим согласился.
Показать ещё 5 комментариев
Теги:
vbscript
outlook-vba
outlook-2007

2 ответа

41
Лучший ответ

Я не знаю, может ли регулярное выражение использоваться непосредственно в правиле, но вы можете запустить триггер script, а script - использовать регулярные выражения. Я ненавижу Outlook.

Сначала вам нужно открыть редактор script с помощью инструмента "Инструменты" - "Макро" - "Открыть редактор Visual Basic" (Alt-F11 - это ярлык).

Откроется редактор. Он должен содержать схему проекта на небольшой панели в верхнем левом углу. Проект будет указан как VBAProject.OTM. Разверните этот элемент, чтобы открыть Microsoft Office Outlook Objects. Разверните это, чтобы открыть ThisOutlookSession. Дважды щелкните ThisOutlookSession, чтобы открыть панель редактирования кода (которая, вероятно, будет пустой).

Далее выберите меню "Сервис" | Ссылки и включите ссылки RegExp, называемые "Microsoft VBScript Regular Expressions 5.5"

Теперь вы можете создать подпрограмму для выполнения фильтрации. Обратите внимание, что подпрограмма, вызванная правилом, должна иметь единственный параметр типа Outlook.MailItem. Например:

' note that Qaru 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

Затем вы должны создать правило (Инструменты - Правила и предупреждения), чтобы вызвать этот script. Нажмите кнопку "Новое правило" в диалоговом окне, чтобы запустить мастер. Выберите шаблон для правила. Выберите шаблон "Проверить сообщения при их получении" в категории "Начать с пустого правила". Нажмите "Далее" .

Выберите условие "Только на этом компьютере" (интуитивно понятный, не так ли?) и нажмите "Далее" .

Выберите опцию "запустить a script". В нижней части мастера, где он показывает ваше новое правило, он должен читать:

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

Фраза "a script" является кликабельной ссылкой. Щелкните по нему, и в Outlook появится диалоговое окно, в котором должна быть указана ранее созданная подпрограмма. Выберите свою подпрограмму и нажмите кнопку "ОК".

Вы можете нажать "Далее" , чтобы добавить исключения в правило или нажать "Готово", если у вас нет исключений.

Теперь, как если бы этот процесс не был достаточно сложным, это правило будет деактивироваться при каждом остановке и перезапуске Outlook, если вы не подпишете script с помощью ключа подписи кода.

Если у вас еще нет ключа подписи кода, вы можете создать один с OpenSSL.

Я упоминал, что ненавижу Outlook?

  • 0
    Вот это да. Да, я могу понять твою боль. Я немного программировал в PowerPoint (это тоже ужасный кошмар), и это ужасно. Большое спасибо за очень подробный ответ! Я поработаю над этим, когда у меня будет немного свободного времени и посмотрю, что я могу сделать. Еще раз спасибо!
  • 0
    Чтобы добавить к этому, я обнаружил, что есть альтернативный, более простой способ подписания макроса: использование самозаверяющего сертификата. msdn.microsoft.com/en-us/library/… Вы можете создать его с помощью дополнительно установленной части Office, которая называется Цифровой сертификат для проектов VBA.
Показать ещё 2 комментария
14

Microsoft Outlook не поддерживает регулярные выражения. Вы можете выполнять подстановочный поиск, хотя по какой-то необъяснимой причине подстановочный знак %, а не *.

  • 1
    Спасибо, Эфир. Это странно, что они поменяют символ подстановки.
  • 2
    Эта статья базы знаний не о мастере правил как таковом, а о надстройке для CRM. Если вы проанализируете статью, вы поймете, что в этом смысле есть смысл, почему знак% используется в этом контексте. Это потому, что это SQL-запрос, где подстановочный знак действительно является%
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню