Apple script falla al copiar archivos adjuntos desde Outlook

4

Estoy intentando copiar todos los archivos adjuntos que recibí de un determinado remitente (escáner) a una carpeta. Estoy usando Outlook y he intentado escribir un script para hacer el trabajo. Falla al guardar el archivo con el código de error:

error "Microsoft Outlook got an error: Parameter error." number -50

Desafortunadamente, no he podido averiguar a) qué significa ese error yb) cómo hacer que el script funcione. Cualquier ayuda es bienvenida.

Este es mi script:

set saveToFolder to (choose folder with prompt "Choose the destination folder") as string
set ctr to 0

tell application "Microsoft Outlook"
    set srcFolder to mail folder "inbox" of exchange account "FOO"
    set selectedMessages to messages of srcFolder
    repeat with msg in selectedMessages
        set ctr to ctr + 1
        set msgsender to the sender of msg
        set senderaddress to the address of msgsender
        if "[email protected]" = senderaddress then
            set attFiles to attachments of msg
            repeat with f in attFiles
                set attName to (get the name of f)
                log attName
                set saveAsName to saveToFolder & attName
                log saveAsName
                save f in POSIX file saveAsName
            end repeat
        end if
    end repeat
end tell
display dialog "" & ctr & " messages were processed" buttons {"OK"} default button 1
return ctr
    
pregunta hitzg 11.10.2018 - 16:18

1 respuesta

1

El error de parámetro está surgiendo porque uno de los parámetros que está enviando al comando save es erróneo. El parámetro f es el attachment que se guardará, está bien.

El problema es el segundo parámetro, que has declarado es una ruta POSIX file (una compuesta de barras diagonales, por ejemplo, /Users/hitzg/Desktop/some_file.txt ).

Sin embargo, la variable saveAsName se deriva de saveToFolder , que obtiene su ruta de archivo del comando choose folder . Este comando devuelve una ruta HFS (una compuesta de dos puntos, por ejemplo, Macintosh HD:Users:hitzg:Desktop:some_file.txt ).

Por lo tanto, la solución es simplemente decidir qué tipo de formato de ruta de archivo vas a utilizar y mantenerlo. Puede O BIEN usar rutas de acceso de Posix y cambiar esta línea del script (abreviada para facilitar la lectura) desde aquí:

set saveToFolder to (choose folder) as string

a esto:

set saveToFolder to POSIX path of (choose folder)

O use las rutas HFS y cambie esta línea del script:

save f in POSIX file saveAsName

a esto:

save f in file saveAsName

Eso corrige el error de tu parámetro, pero no he probado el resto de tu script para ver cómo funciona. Al leerlo, no hay errores evidentes, por lo que no anticipo ningún otro problema importante.

ADENDA

Me gustaría ofrecer algunas ediciones a su script original que creo que agiliza el código al tiempo que lo hace más eficiente y eficaz. Su script existente es excelente, sin embargo, con el uso estratégico del filtro AppleScript whose , podemos eliminar el primero de los bucles repeat , al mismo tiempo que mejoramos el rendimiento del segundo.

set saveToFolder to (choose folder) as text


tell application "Microsoft Outlook"
    set srcFolder to mail folder "Inbox" of exchange account "FOO"

    set selectedMessages to a reference to (messages of srcFolder whose ¬
        class of attachments contains attachment and ¬
        "From: First Last <[email protected]>" is in headers)

    set attFiles to a reference to attachments of selectedMessages
    set [n, m] to [count selectedMessages, count attFiles]

    repeat with f in the attFiles
        set savePath to saveToFolder & name of f
        save f in file savePath
    end repeat
end tell


display alert "" & m & " attachments were saved" message ¬
    "These belonged to " & n & " messages" as ¬
    informational buttons {"OK"} default button 1

El elemento clave de esta versión del script es la implementación del filtro whose aquí:

    set selectedMessages to a reference to (messages of srcFolder whose ¬
        class of attachments contains attachment and ¬
        "From: First Last <[email protected]>" is in headers)

En lugar de buscar en todos los mensajes de su bandeja de entrada los mensajes enviados desde un remitente en particular y luego capturar los archivos adjuntos, el primer criterio del filtro selecciona instantáneamente solo los mensajes en su bandeja de entrada que tienen archivos adjuntos; Los mensajes sin archivos adjuntos son superfluos a nuestras necesidades, por lo que ni siquiera necesitamos considerarlos. El segundo criterio especifica que los correos electrónicos deben provenir de una persona específica, aunque desafortunadamente no se puede incorporar address of sender en el filtro, por lo que en su lugar, he utilizado los encabezados de los mensajes para asegurarme de que contenga la cadena "From: ..." apropiada. / p>

Para formatear esta cadena, simplemente obtenga la propiedad headers para un mensaje del remitente específico, y hojéela hasta que encuentre algunas líneas que se parecen a esto:

From: First Last <[email protected]>
Subject: Hello World!
Thread-Topic: Hello Again
Thread-Index: AdQD5jaiEJ7GiUlKRYeD5LaN3BaSpA==
Date: Thu, 14 Jun 2018 13:22:53 +0000
Message-ID: <B64BBE7A4C13095094C6A44D85FA3FDB5085651F@ABCD-mail.somemailbox.foo.com>

Estará aproximadamente en la mitad del texto del encabezado. Luego, solo asegúrese de que el texto del filtro coincida con la línea "From:" (copiar y pegar), ya que esto seguramente será el mismo en todos los correos electrónicos de ese remitente, a menos que cambien sus nombres y apellidos en cualquier momento (lo que puede , por supuesto, estar ausente).

Un filtro un poco más flexible si le preocupa que los nombres y apellidos hayan cambiado con el tiempo, sería simplemente filtrar el headers para ver si contienen solo la dirección de correo electrónico "[email protected]" . Dado que solo buscará en su bandeja de entrada, es razonable suponer que cualquier aparición de esa dirección de correo electrónico en el encabezado de un mensaje de la bandeja de entrada significa que el correo electrónico se originó en esa dirección o fue enviado a esa dirección tan bien como usted:

    set selectedMessages to a reference to (messages of srcFolder whose ¬
        class of attachments contains attachment and ¬
        "<[email protected]>" is in the headers)

El resto del script es más o menos lo mismo, con la corrección del error de parámetro implementado.

Habiendo probado el script en mi sistema, funcionó como se esperaba y funcionó de manera muy eficiente. Para mí, el obstáculo en la velocidad fue tener que descargar cada archivo adjunto para guardarlo, por lo que hubo una consideración de transferencia de datos al ejecutarme en mi carpeta de correo de Exchange.

Al ejecutarlo en una carpeta de correo local con archivos adjuntos ya descargados, el guardado de los archivos adjuntos fue prácticamente instantáneo.

    
respondido por el CJK 19.10.2018 - 08:26

Lea otras preguntas en las etiquetas