2008-09-17 8 views
8

मैंने आने वाले ईमेल को हल करने में मेरी सहायता के लिए Outlook के विजुअल बेसिक (हम Outlook 2003 और Exchange Server का उपयोग कर रहे हैं) में एक संदेश हैंडलर फ़ंक्शन लिखा है।मेलइटम कब मेलइटम नहीं है?

यह मेरे लिए काम कर रहा है, सिवाय इसके कि नियम कभी-कभी विफल हो जाता है और Outlook इसे निष्क्रिय करता है।

फिर मैं नियम को वापस चालू करता हूं और इसे पकड़ने के लिए मैन्युअल रूप से इसे अपने इनबॉक्स पर चलाता हूं। नियम स्वचालित रूप से दिन में कई बार विफल रहता है और निष्क्रिय करता है।

मुझे इसे एक बार और सभी के लिए ठीक करना अच्छा लगेगा।

उत्तर

1

ने आने वाले ईमेल को हल करने में मेरी सहायता के लिए Outlook के विजुअल बेसिक (हम Outlook 2003 और Exchange Server का उपयोग कर रहे हैं) में एक संदेश हैंडलर फ़ंक्शन लिखा है। यह मेरे लिए काम कर रहा है, सिवाय इसके कि नियम कभी-कभी विफल हो जाता है और आउटलुक इसे निष्क्रिय करता है। फिर मैं नियम को वापस चालू करता हूं और इसे पकड़ने के लिए मैन्युअल रूप से इसे अपने इनबॉक्स पर चलाता हूं। नियम स्वचालित रूप से दिन में कई बार विफल रहता है और निष्क्रिय करता है। मैं इसे एक बार और सभी के लिए ठीक करना पसंद करूंगा।

यहाँ कोड कार्यक्षमता छीन है, लेकिन आप यह कैसे लग रहा है की एक विचार दे रही है:

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 

एक त्रुटि मैं "प्रकार बेमेल" है MyMessageHandler जहां वीबी शिकायत है कि आइटम बुला एक MailItem नहीं है । ठीक है, लेकिन TypeName (आइटम) "MailItem" देता है, तो आइटम कैसे मेलइटम नहीं है?

मुझे एक और मिलता है जहां एक खाली विषय वाला ईमेल आता है। लाइन

strSubject = Item.Subject 

मुझे एक त्रुटि देता है। मुझे आइटम पता है। विषय खाली होना चाहिए, लेकिन यह एक त्रुटि क्यों है?

धन्यवाद।

+1

टाइपनाम मानव-पठनीय संस्करण के लिए एक प्रकार से पूछताछ करता है। चूंकि एक ही नाम के साथ दो अलग-अलग प्रकार हो सकते हैं, टाइप टाइप करने के लिए टाइपनाम पर भरोसा करने के परिणामस्वरूप झूठी-सकारात्मक/नकारात्मक होंगे। कोशिश करें "टाइपऑफ आइटम मेलइटम है" इसके बजाय – rpetrich

+0

यदि 'टाइपनाम (आइटम) = "मेलइटम" ', तो एक प्रक्रिया को कॉल करें ... जो न केवल MailItems स्वीकार करता है, लेकिन फिर यह जांचता है कि आइटम MailItem है या नहीं? – JimmyPena

2

मेरी याददाश्त इस पर कुछ हद तक बादल छाए हुए हैं, लेकिन मेरा मानना ​​है कि मेलइटम मेल नहीं है जब यह एक पठन रसीद की तरह कुछ है। (दुर्भाग्यवश, यह दिखाया गया वीबीए कोड किसी अन्य नौकरी पर लिखा गया था और अब आसपास नहीं है।)

मेरे पास आने वाले संदेशों को संसाधित करने के लिए कोड भी लिखा गया था, संभवतः आपने उसी कारण से (एक्सचेंज के लिए बहुत से नियम, या नियम विज़ार्ड के लिए नियम बहुत जटिल हैं), और ऐसा लगता है कि आपके पास एक ही समस्या में चल रहा है, कि कुछ आइटम एक अलग प्रकार से लगते थे, भले ही मैं उन्हें आपके द्वारा लिखे गए कुछ चीज़ों से पकड़ रहा था।

मैं देखता हूं कि अगर मैं मदद करूंगा तो मैं एक विशिष्ट उदाहरण उत्पन्न कर सकता हूं या नहीं।

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

8

इस कोड को मुझे अलग TypeNames कि मेरे इनबॉक्स में थे दिखाया।

कॉल की गई प्रक्रिया में, आने वाली वस्तु को Object प्रकार परिवर्तक को असाइन करें। फिर TypeOf या TypeName का उपयोग यह निर्धारित करने के लिए करें कि यह MailItem है या नहीं। केवल तभी आपका कोड उन क्रियाओं को निष्पादित करेगा जो ईमेल पर लागू होते हैं।

यानी।

Dim obj As Object 

If TypeName(obj) = "MailItem" Then 
    ' your code for mail items here 
End If 
1

वहाँ आइटम के कई प्रकार डिफ़ॉल्ट इनबॉक्स में देखा जा सकता है कि कर रहे हैं:

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

कृपया अपने कोड में एक स्पष्टीकरण जोड़ें। – nalply

3

मैं अन्य कार्यालय अनुप्रयोग, जहां आउटलुक लाइब्रेरी सीधे संदर्भित है में निम्नलिखित VBA कोड का उपयोग करते।

' 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 

आदि

+0

मुझे स्ट्रिंग के रूप में हार्ड-कोडिंग "MailItem" से 'TypeOf' बेहतर पसंद है। –

0

क्यों कोड के लिए एक सरल त्रुटि हैंडलर का उपयोग नहीं? गंभीरता से। आप किसी प्रॉपर्टी या ऑब्जेक्ट के प्रत्येक पठन के लिए एक त्रुटि लिख सकते हैं जो विफल होने लगती है। फिर इसे फिर से शुरू करें क्या कोई फर्क नहीं पड़ता। जटिल त्रुटि हैंडलिंग की कोई ज़रूरत नहीं है। एक परीक्षण के बारे में सोचें जो एक खाली विषय दिखाता है। चूंकि आप नहीं जानते कि यह कितना मूल्य लौटाएगा, यदि कोई हो, और यह खाली या खाली विषय पर त्रुटि प्रतीत होता है, तो आपको संभावित त्रुटि के साथ इसे सरल परीक्षण के रूप में चित्रित करने की आवश्यकता है। परीक्षण को एक कथन के रूप में चलाएं (जिसमें एक आपको वैसे भी त्रुटि मिलेगी), और प्रोग्राम को त्रुटि पर फिर से शुरू करें।

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 
संबंधित मुद्दे