2010-10-05 44 views
39

Có thể tạo quy tắc trong Outlook 2007 dựa trên chuỗi regex không?Quy tắc biểu thức chính quy trong Outlook 2007?

Tôi đang cố gắng thêm bộ lọc cho thư có chứa chuỗi như: 4000-10, số có bốn chữ số, sau đó là dấu gạch ngang và sau đó là số có hai chữ số, có thể là bất kỳ thứ gì từ 0000-00 đến 9999-99.

Tôi đã sử dụng mã này làm regex: \b[0-9]{4}\-[0-9]{2}\b nhưng bộ lọc không hoạt động. Tôi đã thử một vài sửa đổi khác cũng như không có may mắn. Tôi đã không thể tìm thấy bất cứ điều gì cụ thể trực tuyến về việc liệu Outlook thậm chí hỗ trợ nhập regexes vào một quy tắc, mặc dù, vì vậy tôi figured tôi sẽ hỏi ở đây trong trường hợp tôi đang lãng phí thời gian của tôi.

EDIT: Cảm ơn nhận xét của Chris bên dưới, tôi đã có thể triển khai bộ lọc này qua macro. Tôi nghĩ rằng tôi sẽ chia sẻ mã của tôi dưới đây trong trường hợp nó có thể giúp bất cứ ai khác:

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

Chương trình này có thực sự liên quan không? Tôi có nghĩa là, bạn không hỏi nếu regex là chính xác, chỉ khi triển vọng hỗ trợ regexes –

+0

Tôi thực sự có nghĩa là nó như là cả hai câu hỏi. Tôi đã không sử dụng nhiều regex, vì vậy tôi cũng không chắc chắn về điều đó. Trong cùng một khía cạnh, nếu Outlook thậm chí không hỗ trợ regexes, điểm là tranh luận, do đó, đó là kinda nơi tôi đã đi với nó. – kcoppock

+1

Tôi không nghĩ rằng nó quan trọng, điều này dường như phù hợp với nó cũng = "[0-9] {4} - [0-9] {2}" –

Trả lời

43

Tôi không biết liệu regex có thể được sử dụng trực tiếp trong quy tắc hay không, nhưng bạn có thể có quy tắc kích hoạt tập lệnh và tập lệnh có thể sử dụng regex. Tôi ghét Outlook.

Trước tiên, bạn phải mở trình chỉnh sửa tập lệnh thông qua Công cụ - Macro - Mở Trình chỉnh sửa Visual Basic (Alt-F11 là phím tắt).

Trình chỉnh sửa sẽ mở. Nó sẽ chứa một phác thảo dự án trong một bảng điều khiển nhỏ ở góc trên cùng bên trái. Dự án sẽ được liệt kê dưới dạng VBAProject.OTM. Mở rộng mục này để hiển thị đối tượng Microsoft Office Outlook. Mở rộng để tiết lộ ThisOutlookSession. Bấm đúp ThisOutlookSession để mở ngăn chỉnh sửa mã (có thể sẽ trống).

Tiếp theo chọn menu Công cụ | Tham khảo và bật tham chiếu RegExp được gọi là "Microsoft VBScript Regular Expressions 5.5"

Bây giờ bạn có thể tạo một chương trình con để thực hiện hành động lọc của mình. Lưu ý rằng một chương trình con được gọi bởi một quy tắc phải có một tham số duy nhất của kiểu Outlook.MailItem. Ví dụ:

' 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 

Tiếp theo, bạn phải tạo quy tắc (Công cụ - Quy tắc và Cảnh báo) để kích hoạt tập lệnh này. Nhấp vào nút Quy tắc mới trên hộp thoại để khởi chạy trình hướng dẫn. Chọn mẫu cho quy tắc. Chọn mẫu "Kiểm tra thư khi họ đến" từ danh mục "Bắt đầu từ quy tắc trống". Bấm tiếp.

Chọn điều kiện "Chỉ trên máy này" (trực quan phải không?) Và nhấp vào tiếp theo.

Chọn tùy chọn "chạy tập lệnh". Ở cuối trình hướng dẫn hiển thị quy tắc mới của bạn, quy tắc phải đọc:

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

Cụm từ "tập lệnh" là liên kết có thể nhấp. Nhấp vào nó và Outlook sẽ hiển thị một hộp thoại sẽ liệt kê chương trình con mà bạn đã tạo trước đó. Chọn chương trình con của bạn và nhấp vào nút OK.

Bạn có thể nhấp vào Tiếp theo để thêm ngoại lệ cho quy tắc hoặc nhấp vào Hoàn tất nếu bạn không có ngoại lệ.

Bây giờ, mặc dù quy trình đó không đủ phức tạp, quy tắc này sẽ hủy kích hoạt mỗi khi bạn dừng và khởi động lại Outlook trừ khi bạn ký tập lệnh bằng khóa ký mã.

Nếu bạn chưa có khóa ký mã, bạn có thể create one với OpenSSL.

Tôi có đề cập đến việc tôi ghét Outlook không?

+0

Chà. Vâng, tôi có thể hiểu nỗi đau của bạn. Tôi đã thực hiện một số chương trình ánh sáng trong PowerPoint (cơn ác mộng khủng khiếp là tốt) và nó là khủng khiếp. Cảm ơn bạn rất nhiều vì câu trả lời rất chi tiết! Tôi sẽ làm một số công việc về điều này khi tôi nhận được một số thời gian rảnh và xem những gì tôi có thể làm. Một lần nữa, cảm ơn bạn! – kcoppock

+0

Chỉ cần thêm vào điều này, tôi đã tìm thấy một cách thay thế, dễ dàng hơn để ký macro: sử dụng chứng chỉ tự ký. http://msdn.microsoft.com/en-us/library/aa155754 (office.10).aspx#oldigitalsignature_sign Bạn có thể tạo một thông qua một phần tùy chọn được cài đặt của Văn phòng được gọi là Giấy chứng nhận kỹ thuật số cho các dự án VBA. – kcoppock

+0

+1 (tôi ước tôi có thể +1000!) Cho 'Enum'. Tôi nghĩ rằng tôi cần phải quay trở lại và làm cho mọi Macro mà tôi từng viết về một triệu lần có thể đọc được! Cảm ơn! –

15

Microsoft Outlook does not support regular expressions. Bạn có thể thực hiện tìm kiếm theo ký tự đại diện, mặc dù vì một số lý do không thể giải thích, ký tự đại diện là %, không phải là *.

+1

Cảm ơn Ether. Đó là kỳ quái mà họ sẽ thay đổi ký tự đại diện. – kcoppock

+2

Bài viết KB này không phải là về trình hướng dẫn quy tắc, mà là một phần bổ trợ cho CRM. Nếu bạn phân tích cú pháp bài viết, bạn sẽ thấy rằng nó hoàn toàn có ý nghĩa là tại sao dấu% được sử dụng trong ngữ cảnh này. Đó là vì đó là truy vấn SQL mà ký tự đại diện thực sự là% – noonand

+0

MS 2013 hỗ trợ ký tự phần trăm khi tìm kiếm các đối tượng và cơ quan email (ít nhất) từ ruy-băng Tìm kiếm chính nhìn vào hộp thư đến. Nhưng nếu bạn tạo "Thư mục tìm kiếm" (thư mục ảo có nội dung là kết quả của các điều kiện tìm kiếm khác nhau), điều kiện tìm kiếm trong "Thư mục tìm kiếm" sẽ * không * hỗ trợ ký tự đại diện phần trăm. Cách để đi Microsoft>;) –

Các vấn đề liên quan