2008-09-17 18 views
8

He escrito una función de controlador de mensajes en Visual Basic de Outlook (estamos usando Outlook 2003 y Exchange Server) para ayudarme a clasificar el correo electrónico entrante.¿Cuándo es un artículo de correo no un artículo de correo?

Me funciona, excepto que algunas veces la regla falla y Outlook la desactiva.

Luego, vuelvo a encender la regla y la ejecuto manualmente en mi Bandeja de entrada para ponerme al día. La regla falla espontáneamente y se desactiva varias veces al día.

Me gustaría arreglar esto de una vez por todas.

Respuesta

1

hemos escrito una función de controlador de mensajes en Visual Basic de Outlook (estamos usando Outlook 2003 y Exchange Server) para ayudarme a clasificar el correo electrónico entrante. Me funciona, excepto que algunas veces la regla falla y Outlook la desactiva. Luego vuelvo a activar la regla y la ejecuto manualmente en mi Bandeja de entrada para ponerme al día. La regla falla espontáneamente y se desactiva varias veces al día. Me encantaría solucionar esto de una vez por todas.

Este es el código despojado de la funcionalidad, pero que le da una idea de cómo se ve:

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 

Un error que consigo es "No coinciden los tipos" llamando MyMessageHandler donde VB se queja de que el tema no es un MailItem . De acuerdo, pero TypeName (Item) devuelve "MailItem", entonces, ¿cómo es que Item no es un MailItem?

Otra que recibo es donde aparece un correo electrónico con un tema vacío. La línea

strSubject = Item.Subject 

me da un error. Sé Item.Subject debe estar en blanco, pero ¿por qué es eso un error?

Gracias.

+1

TypeName interroga a un tipo para una versión humanamente legible. Dado que puede haber dos tipos diferentes con el mismo nombre, depender de TypeName para realizar la comprobación de tipo dará como resultado falsos positivos/negativos. Pruebe "TypeOf Item is MailItem" en su lugar – rpetrich

+0

Si 'TypeName (Item) =" MailItem "', llame a un procedimiento ... que no solo acepta solo MailItems, sino que comprueba si el artículo es un MailItem. – JimmyPena

2

Mi memoria está algo turbia en esto, pero creo que un MailItem no es un MailItem cuando es algo así como un recibo de lectura. (Desafortunadamente, el código VBA que demostró esto fue escrito en otro trabajo y no está disponible ahora).

También tuve un código escrito para procesar mensajes entrantes, probablemente por la misma razón que usted (demasiadas reglas para Exchange, o reglas demasiado complejas para el Asistente de Reglas), y parece recordar que se encontró con el mismo problema que usted, que algunos elementos parecían ser de un tipo diferente, aunque los estaba atrapando con algo parecido a lo que escribió.

Veré si puedo mostrar un ejemplo específico si me ayuda.

8

Este código me mostró los diferentes typenames que estaban en mi bandeja de entrada:

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

Hay muchos tipos de artículos que se pueden ver en la bandeja de entrada por defecto.

En el procedimiento llamado, asigne el elemento entrante a una variable de tipo Object. Luego use TypeOf o TypeName para determinar si es MailItem. Solo entonces su código debe realizar acciones que se apliquen a los correos electrónicos.

i.e.

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

Agregue una explicación a su código. – nalply

3

utilizo el siguiente fragmento de código VBA en otras aplicaciones de Office, donde se hace referencia directamente la Biblioteca de Outlook.

' 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 

etc.

+0

Me gusta más el 'TypeOf' que el hard -coording" MailItem "como una cadena. –

0

por qué no usar un controlador de errores simple para el código? Seriamente. Puede escribir un error por cada lectura de una propiedad u objeto que parece fallar. Luego haz que se reanude sin importar qué. No es necesario un manejo complejo de errores. Piense en una prueba que muestra un tema vacío. Como no sabe qué valor va a devolver, si lo hay, y parece haber un error en un sujeto vacío o en blanco, debe visualizarlo como una prueba simple con un posible error. Ejecute la prueba como una declaración if (una en la que obtendrá un error de todos modos) y pida al programa que reanude el error.

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 
Cuestiones relacionadas