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.