vba outlook-vba typeof outlook-2003 mailitem

vba - ¿Cuándo un MailItem no es un MailItem?



outlook-vba typeof (7)

escribí una función de manejo 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.

Aquí está el código desprovisto de la funcionalidad, pero 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 recibo es "Type Mismatch" llamando a MyMessageHandler donde VB se queja de que Item no es un MailItem. De acuerdo, pero TypeName (Item) devuelve "MailItem", entonces, ¿cómo es que Item no es un MailItem?

Otro 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.

He escrito una función de manejo 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.


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

También tuve un código escrito para procesar los 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 tenía, que algunos elementos parecían ser de un tipo diferente a pesar de que los estaba atrapando con algo como lo que escribiste.

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


Este código me mostró los diferentes tipos de letra 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


Hay muchos tipos de elementos que se pueden ver en la Bandeja de entrada predeterminada.

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

es decir

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


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


Uso el siguiente fragmento de código de VBA en otras aplicaciones de Office, donde se hace referencia directamente a 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.


¿por qué no utilizar un controlador de error 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