El script de Apple falla al copiar el archivo adjunto de Outlook

Estoy tratando de 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 descifrar a) qué significa ese error yb) cómo hacer que el script funcione. Cualquier ayuda es bienvenida.

Este es mi guion:

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 "scanner@some.some" = 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
Tuve un problema diferente con Applescript+Outlook y supe que hay una vía rápida para el soporte de Microsoft. Desafortunadamente, fueron inútiles (dijeron que mi problema es por diseño), pero creo que vale la pena intentarlo. Si obtiene una respuesta de Microsoft, puede responder esta pregunta usted mismo. Vaya a Outlook, vaya al menú Apple, elija Ayuda->Buscar actualizaciones. Desde allí, puede unirse al programa "Insider Fast". Hazlo. (Puedes desvincularte más tarde). Luego, regrese al menú Ayuda de Outlook y encontrará una nueva opción "Contactar con el soporte" que inicia una sesión de chat con Microsoft. Vale la pena intentarlo.
@ jay613 gracias por la sugerencia. A ver si encuentro el tiempo para hacerlo.
¿Ha intentado comentar líneas individuales para ver si alguna set …línea en particular está causando el problema?
@TimothyMueller-Harder No lo he probado. No estoy seguro, sin embargo, si entiendo exactamente lo que quieres decir. Si comento alguna set ...línea, eso generaría un problema adicional, ¿no? El error es causado por la save ...línea.
¡Lo siento, leí mal el código! Tienes razón, por supuesto.

Respuestas (1)

El error de parámetro surge porque uno de los parámetros que está enviando al savecomando es erróneo. El fparámetro es el attachmentque se va a guardar, esto está bien.

El problema es el segundo parámetro, que ha indicado que es una POSIX fileruta (una compuesta de barras diagonales, por ejemplo /Users/hitzg/Desktop/some_file.txt).

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

Entonces, la solución es simplemente decidir qué tipo de formato de ruta de archivo va a usar y atenerse a él. Puede O BIEN usar rutas posix y cambiar esta línea del script (abreviado para facilitar la lectura) de esto:

set saveToFolder to (choose folder) as string

a esto:

set saveToFolder to POSIX path of (choose folder)

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

save f in POSIX file saveAsName

a esto:

save f in file saveAsName

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


APÉNDICE

Me gustaría ofrecer algunas modificaciones a su secuencia de comandos original que, en mi opinión, agilizan el código y lo hacen más eficiente y eficaz. Su secuencia de comandos existente es excelente, sin embargo, con el uso estratégico del whosefiltro AppleScript, podemos eliminar el primero de los repeatbucles y mejorar 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 <scanner@some.some>" 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 whosefiltro aquí:

    set selectedMessages to a reference to (messages of srcFolder whose ¬
        class of attachments contains attachment and ¬
        "From: First Last <scanner@some.some>" is in headers)

En lugar de buscar en todos los mensajes de su bandeja de entrada los mensajes enviados por un remitente en particular y luego seleccionar los archivos adjuntos, el primer criterio del filtro selecciona instantáneamente solo los mensajes de su bandeja de entrada que tienen archivos adjuntos; los mensajes sin archivos adjuntos son superfluos para 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 address of senderlamentablemente no se pueden incorporar al filtro, por lo que en su lugar he utilizado los encabezados de los mensajes para asegurarme de que contienen la "From: ..."cadena adecuada.

Para dar formato a esta cadena, simplemente obtenga la headerspropiedad para un mensaje del remitente específico y hojee hasta que encuentre algunas líneas que se vean así:

From: First Last <scanner@some.some>
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 el medio del texto del encabezado. Luego, solo asegúrese de que el texto de su filtro coincida con la "From:"línea (copiar y pegar), ya que es casi seguro que será el mismo en todos los correos electrónicos de ese remitente, a menos que haya cambiado su nombre y apellido en algún momento (lo que, por supuesto, puede , estar ausente).

Un filtro un poco más flexible si le preocupa que el nombre y el apellido hayan cambiado con el tiempo, sería simplemente filtrar headerspara ver si contienen solo la dirección de correo electrónico "scanner@some.some". 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 se envió en CC a esa dirección, así como a usted:

    set selectedMessages to a reference to (messages of srcFolder whose ¬
        class of attachments contains attachment and ¬
        "<scanner@some.some>" is in the headers)

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

Habiendo probado el script en mi sistema, funcionó como se esperaba y se desempeñó de manera muy eficiente. El cuello de botella en la velocidad para mí fue tener que descargar cada archivo adjunto para guardarlo, por lo que hubo una consideración de transferencia de datos cuando se ejecutó 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.

Muchas gracias por la explicación detallada. Simplemente usar fileen lugar de POSIX filefunciona a las mil maravillas. Repasar todos los mensajes fue razonablemente rápido. La nueva versión que sugirió se ve muy bien. Desafortunadamente, se atasca al usar el filtro ( set selectedMessages ...). Pero la primera versión está bien, hace el trabajo. ¡Así que gracias de nuevo!