De EDICIÓN: Nueva info: yo sólo ahora se dio cuenta de que, mientras que la rentabilidad de Mailitem.El cuerpo es «a», el valor actual es «definido por la Aplicación o error definido por el objeto» . No estoy del todo seguro de lo que eso significa, pero sé que se muestra en múltiples campos– he incluido una captura de pantalla a continuación.

Outlook VBA— Algunos MailItem Propiedades de los valores de retorno, y los otros no

Estoy teniendo un problema por el cual ciertas propiedades devolverá el valor correcto, y en otros no. Tengo un ejemplo de correo electrónico, donde tengo un correo electrónico con el asunto «Sujeto», el mensaje es «Cuerpo», la dirección de correo del remitente es «[email protected]» y la fecha de envío es de 12 de junio de 2013.

Cuando yo ejecute el siguiente código:

    Dim ComputerName As String
    Dim ErrorState As String
For Each MailItem In InboxItems
        ComputerName = MailItem.Subject
        'ErrorState = MailItem.Body
        ErrorState = MailBody(MailItem)
        strDate = GetDate(MailItem.SentOn)
        SenderEmail = MailItem.SenderEmailAddress
        If strDate = DateToday And SenderEmail = "[email protected]" Then
            Computers(a, 0) = ComputerName
            Computers(a, 1) = ErrorState
            a = a + 1
        End If
        Debug.Print MailItem.Subject
        Debug.Print MailItem.Body
    Next MailItem

Lo que me pasa es ComputerName = «Sujeto», ErrorState = «», SenderEmail = «», y strDate = «2013/6/12» (que es el formato adecuado en este caso). ¿Por qué esta vuelta valores apropiados para dos de los Mailitem propiedades, pero no para dos de los otros? Este es un problema muy extraño, y agradecería cualquier ayuda que usted podría ser capaz de dar!

Voy a agregar un poco más de contexto para el código aquí:

    Set objOutlook = CreateObject("Outlook.Application", "localhost")
    Set objNamespace = objOutlook.GetNamespace("MAPI")
    Set Inbox = GetFolder("[email protected]/inbox")
    Set InboxItems = Inbox.Items
    InboxItems.SetColumns ("SentOn")

GetFolder es una función para obtener el buzón de la ruta de la carpeta. Tengo que hacer esto porque no estoy utilizando la bandeja de entrada predeterminada en outlook.

También he intentado usar el MailBody Función que se propone a continuación, en caso de que el cuerpo estuviera en un formato HTML o RTF. Por desgracia, resultó que el cuerpo era normal, y MailItem.El cuerpo debe tener la recuperó, y todavía no está funcionando. MailItem.El cuerpo retorna «», aunque sé que el correo electrónico tiene un cuerpo. El cuerpo es sólo el número 1, y que es lo que yo debería estar recibiendo.

También, debo señalar que el remitente del mensaje de correo es el mismo que el del destinatario; en otras palabras, el correo electrónico fue enviado desde una dirección de correo electrónico a sí mismo. No sé si esto podría hacer una diferencia, pero pensé que me iba a poner ahí, por si acaso.

  • ¿Cómo se puede declarar y asignar InboxItems? Está usted usando Option Explicit?
  • Voy a editar en una porción más grande de mi código, dame un segundo
  • Parece que funciona para mí, es decir, tengo el Cuerpo y SenderEmail contenido. Buena suerte!
  • Jaja bueno, al menos sé que el código de trabajo. Sólo estoy perdiendo algo… gracias por las pruebas 🙂
InformationsquelleAutor Wolves | 2013-06-12

1 Comentario

  1. 6

    Varios Tipos De Elementos

    Primero, no hay ninguna garantía de que todos los elementos de la Inbox.Items colección son de tipo MailItem. Bandejas de entrada también contienen AppointmentItem, MeetingItem, y otros *Item tipo de objetos. No todos estos tipos de elemento tienen las mismas propiedades pobladas. Para asegurarse de no obtener un tipo de error de coincidencia, declarar la variable de iteración como un genérico Object y sólo asignar a un establecimiento inflexible de tipos MailItem variable si es del tipo correcto:

    Dim oInbox    As Outlook.Folder
    Dim oItem     As Object
    Dim oMailItem As MailItem
    
    Set oInbox = ActiveExplorer.Session.DefaultStore.GetRootFolder().Folders("Inbox")
    For Each oItem In oInbox.Items
        If TypeOf oItem Is MailItem Then
            Set oMailItem = oItem
            ' Do stuff
        Else
            Debug.Print "Skipping " & TypeName(oItem)
        End If
    Next

    Propiedades opcionales

    Segundo, no hay ninguna garantía de que todas las propiedades de un objeto se rellena. Si un elemento de correo nunca fue enviado, no tendrá la dirección del remitente, y ciertamente es posible tener un correo electrónico con ningún cuerpo. Una buena manera de familiarizarse con las propiedades que están disponibles y lo que contienen es el uso de los Locales de la ventana (Ver > Ventana Locales en el IDE VBA). Aquí está una captura de pantalla del código anterior pausa en el bucle, con algunas de las propiedades de la oMailItem objeto ampliado:

    Outlook VBA— Algunos MailItem Propiedades de los valores de retorno, y los otros no

    Cuerpo vs HTMLBody

    MailItem los objetos tienen tres cuerpo propiedades: Cuerpo, HTMLBody, y RTFBody. Generalmente sólo uno de ellos se rellena. Que uno depende del formato del correo electrónico. Puede comprobar el BodyFormat de la propiedad para averiguar cuál es la aplicable para el elemento actual. El uso de que, aquí, la forma generalizada para conseguir la raw del cuerpo de un objeto MailItem, no importa cuál sea el formato:

    Public Function MailBody(ByVal MailItem As MailItem) As String
        Select Case MailItem.BodyFormat
            Case OlBodyFormat.olFormatPlain, OlBodyFormat.olFormatUnspecified
                MailBody = MailItem.Body
            Case OlBodyFormat.olFormatHTML
                MailBody = MailItem.HTMLBody
            Case OlBodyFormat.olFormatRichText
                MailBody = MailItem.RTFBody
        End Select
    End Function
    • Muchas gracias por tu respuesta! El problema es que, para los propósitos de la prueba, sólo hay un correo electrónico en la bandeja de entrada, y tiene un cuerpo y el sujeto, y como fue recibido tiene un remitente. A pesar de eso, estoy consiguiendo solamente dos de las propiedades, el objeto y la fecha, mientras que para el cuerpo y el correo electrónico del remitente que estoy recibiendo «». Gracias por tu ayuda hasta el momento, aunque!
    • Acabo de actualizar mi respuesta para incluir un punto adicional, hay varios Body de las propiedades que necesita para comprobar. Ver mi respuesta actualizada.
    • Voy a dar que un intento y volver a usted. Gracias por tu ayuda 🙂
    • Su función funciona bien; cuando yo me vaya, aunque paso a paso con F8, entra en su función, y sólo se selecciona el primer caso, y establece MailBody a MailItem.Cuerpo, no en HTML o RTF. Esto era una buena idea, y es algo que yo no hubiera pensado, pero por desgracia no trabajo; todavía tengo como una salida para el cuerpo «». Muchas gracias por dar a este un de ir bien!

Dejar respuesta

Please enter your comment!
Please enter your name here