2008-09-17 26 views
8

Tôi đã viết chức năng xử lý tin nhắn trong Visual Basic của Outlook (chúng tôi đang sử dụng Outlook 2003 và Exchange Server) để giúp tôi sắp xếp email đến.Khi nào một MailItem không phải là một MailItem?

Nó làm việc cho tôi, ngoại trừ đôi khi quy tắc không thành công và Outlook tắt nó.

Sau đó, tôi bật lại quy tắc và chạy thủ công quy tắc đó trên Hộp thư đến của mình để bắt kịp. Quy tắc tự động thất bại và vô hiệu hóa nhiều lần trong ngày.

Tôi rất muốn khắc phục điều này một lần và mãi mãi.

Trả lời

1

đã viết chức năng xử lý tin nhắn trong Visual Basic của Outlook (chúng tôi đang sử dụng Outlook 2003 và Exchange Server) để giúp tôi sắp xếp email đến. Nó làm việc cho tôi, ngoại trừ đôi khi quy tắc không thành công và Outlook hủy kích hoạt nó. Sau đó, tôi bật lại quy tắc và tự chạy quy tắc đó trên Hộp thư đến của mình để bắt kịp. Quy tắc tự động thất bại và vô hiệu hóa nhiều lần trong ngày. Tôi rất thích sửa lỗi này một lần và mãi mãi.

Đây là mã bị tước hết các chức năng, nhưng đem lại cho bạn một ý tưởng về cách nó trông giống:

Public WithEvents myOlItems As Outlook.Items 

    Public Sub Application_Startup() 
     ' Reference the items in the Inbox. Because myOlItems is declared 
     ' "WithEvents" the ItemAdd event will fire below. 
     ' Set myOlItems = Outlook.Session.GetDefaultFolder(olFolderInbox).Items 
     Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
    End Sub 

    Private Sub myOlItems_ItemAdd(ByVal Item As Object) 
     On Error Resume Next 
     If TypeName(Item) = "MailItem" Then 
      MyMessageHandler Item 
     End If 
    End Sub 

    Public Sub MyMessageHandler(ByRef Item As MailItem) 
     Dim strSender As String 
     Dim strSubject As String 

     If TypeName(Item) <> "MailItem" Then 
      Exit Sub 
     End If 

     strSender = LCase(Item.SenderEmailAddress) 
     strSubject = Item.Subject 

     rem do stuff 
     rem do stuff 
     rem do stuff 
    End Sub 

Một lỗi tôi nhận được là "không phù hợp Loại" gọi MyMessageHandler nơi VB phàn nàn rằng mục không phải là một MailItem . Được rồi, nhưng TypeName (Item) trả về "MailItem", vậy làm thế nào đến Item không phải là một MailItem?

Một địa chỉ khác tôi nhận được là địa chỉ email có chủ đề trống xuất hiện. Dòng

strSubject = Item.Subject 

cho tôi lỗi. Tôi biết Item.Subject nên để trống, nhưng tại sao lại là lỗi?

Cảm ơn.

+1

LoạiName tra hỏi loại dành cho phiên bản có thể đọc được. Vì có thể có hai loại khác nhau có cùng tên, dựa vào TypeName để thực hiện kiểm tra kiểu sẽ dẫn đến kết quả dương/âm sai. Hãy thử "TypeOf Item là MailItem" thay vì – rpetrich

+0

Nếu 'TypeName (Item) =" MailItem "', sau đó gọi một thủ tục ... mà không chỉ chấp nhận chỉ MailItems, nhưng một lần nữa kiểm tra nếu mục là một MailItem? – JimmyPena

2

Bộ nhớ của tôi hơi có mây, nhưng tôi tin rằng một MailItem không phải là một MailItem khi nó giống như một biên nhận đã đọc. (Thật không may, mã VBA đã chứng minh điều này đã được viết ở một công việc khác và không phải bây giờ.)

Tôi cũng đã viết mã để xử lý thư đến, có thể vì lý do tương tự bạn đã làm (quá nhiều quy tắc cho Exchange) hoặc quy tắc quá phức tạp đối với Trình hướng dẫn Quy tắc) và dường như nhớ lại việc bạn đang gặp phải vấn đề tương tự, một số mục dường như từ một loại khác mặc dù tôi đã bắt chúng bằng thứ gì đó bạn viết.

Tôi sẽ xem liệu tôi có thể tạo một ví dụ cụ thể nếu nó sẽ giúp ích hay không.

8

Mã này chỉ cho tôi những TypeNames khác nhau mà là trong Inbox của tôi:

Public Sub GetTypeNamesInbox() 
Dim myOlItems As Outlook.Items 
Set myOlItems = application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
Dim msg As Object 

For Each msg In myOlItems 
    Debug.Print TypeName(msg) 
    'emails are typename MailItem 
    'Meeting responses are typename MeetingItem 
    'Delivery receipts are typename ReportItem 
Next msg 

End Sub 

HTH

1

Có rất nhiều loại mặt hàng mà có thể được nhìn thấy trong Inbox mặc định.

Trong thủ tục được gọi, chỉ định mục đến cho biến loại Object. Sau đó, sử dụng TypeOf hoặc TypeName để xác định xem đó có phải là MailItem hay không. Chỉ khi đó mã của bạn sẽ thực hiện các hành động áp dụng cho email.

tức là

Dim obj As Object 

If TypeName(obj) = "MailItem" Then 
    ' your code for mail items here 
End If 
1
Dim objInboxFolder As MAPIFolder 
Dim oItem As MailItem 
Set objInboxFolder = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 

For Each Item In objInboxFolder.Items 
    If TypeName(Item) = "MailItem" Then 
    Set oItem = Item 

next 
+0

Vui lòng thêm giải thích cho mã của bạn. – nalply

3

tôi sử dụng đoạn mã VBA sau đây trong ứng dụng văn phòng khác, nơi mà các thư viện Outlook được trực tiếp tham chiếu.

' Outlook Variables 

    Dim objOutlook As Outlook.Application: Set objOutlook = New Outlook.Application 
    Dim objNameSpace As Outlook.NameSpace: Set objNameSpace = objOutlook.GetNamespace("MAPI") 
    Dim objFolder As MAPIFolder: Set objFolder = objNameSpace.PickFolder() 
    Dim objMailItem As Outlook.MailItem 

    Dim iCounter As Integer: iCounter = objFolder.Items.Count 
    Dim i As Integer 

    For i = iCounter To 1 Step -1 
    If TypeOf objFolder.Items(i) Is MailItem Then 
     Set objMailItem = objFolder.Items(i) 
     With objMailItem 

, vv

+0

Tôi thích 'TypeOf' tốt hơn so với mã hóa cứng" MailItem "dưới dạng chuỗi. –

0

tại sao không sử dụng một lỗi xử lý đơn giản cho mã? Nghiêm túc. Bạn có thể viết một lỗi cho mỗi lần đọc của một thuộc tính hoặc đối tượng có vẻ thất bại. Sau đó, có nó Tiếp tục không có vấn đề gì. Không cần xử lý lỗi phức tạp. Hãy nghĩ về một bài kiểm tra cho thấy một chủ đề trống. Vì bạn không biết giá trị nó sẽ trả về, nếu có, và có vẻ như lỗi trên một đối tượng trống hoặc trống, bạn cần phải hình dung nó như là một thử nghiệm đơn giản với một lỗi có thể xảy ra. Chạy thử nghiệm như là một tuyên bố nếu (một trong đó bạn sẽ nhận được một lỗi anyway), và có chương trình tiếp tục về lỗi.

On Error Resume Next 
If object.subject = Null 'produces an error when subject is null, otherwise allows a good read 
    strSubject = "" 'sets the subject grab string to a null or empty string as a string 
Else 
strSubject = object.subject 'Sets the subject grab string to the subject of the message\item 
End If 
Các vấn đề liên quan