L'errore del parametro sta sorgendo perché uno dei parametri che invii al comando save
è errato. Il parametro f
è il attachment
da salvare, questo va bene.
Il problema è il secondo parametro, che hai dichiarato è un percorso POSIX file
(uno composto da barre in avanti, ad esempio /Users/hitzg/Desktop/some_file.txt
).
Tuttavia, la variabile saveAsName
è derivata da saveToFolder
, che ottiene il suo percorso file dal comando choose folder
. Questo comando restituisce un percorso HFS (uno composto da due punti, ad esempio Macintosh HD:Users:hitzg:Desktop:some_file.txt
).
Quindi la soluzione è semplicemente decidere quale tipo di formato di percorso del file hai intenzione di andare, e attenersi ad esso. Puoi EITHER utilizzare i percorsi posix e modificare questa linea dello script (abbreviata per la leggibilità) da questo:
set saveToFolder to (choose folder) as string
a questo:
set saveToFolder to POSIX path of (choose folder)
O usa i percorsi HFS e modifica questa linea dello script:
save f in POSIX file saveAsName
a questo:
save f in file saveAsName
Questo corregge il tuo errore di parametro, ma non ho testato il resto del tuo script per vedere come si comporta. Leggendola, non ci sono errori evidenti, quindi non prevedo altri importanti problemi.
APPENDICE
Vorrei offrire alcune modifiche alla sceneggiatura originale che, a mio avviso, ottimizzano il codice rendendolo più efficiente e performante. Il tuo script esistente è eccellente, tuttavia con l'uso strategico del filtro whose
di AppleScript, possiamo eliminare il primo dei loop repeat
, migliorando le prestazioni del secondo.
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
L'elemento chiave di questa versione dello script è l'implementazione del filtro whose
qui:
set selectedMessages to a reference to (messages of srcFolder whose ¬
class of attachments contains attachment and ¬
"From: First Last <[email protected]>" is in headers)
Invece di cercare tra tutti i messaggi nella tua casella di posta per i messaggi inviati da un particolare mittente, quindi afferrando gli allegati, il primo criterio del filtro seleziona immediatamente solo i messaggi nella tua casella di posta che hanno allegati; i messaggi senza allegati sono superflui ai nostri bisogni, quindi non abbiamo nemmeno bisogno di considerarli. Il secondo criterio specifica che le email dovrebbero provenire da una persona specifica, sebbene il address of sender
sfortunatamente non possa essere incorporato nel filtro, quindi ho utilizzato le intestazioni dei messaggi per assicurarmi che contenga la stringa "From: ..."
appropriata.
Per formattare questa stringa, ottieni semplicemente la proprietà headers
per un messaggio dal mittente specifico e sfogliala fino a trovare alcune righe che assomigliano a questa:
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>
Sarà approssimativamente nel mezzo del testo dell'intestazione. Quindi assicurati che il testo del tuo filtro corrisponda alla riga "From:"
(copy-n-paste), poiché quasi sicuramente sarà uguale in tutte le e-mail di quel mittente, a meno che non abbiano cambiato nome e cognome in qualsiasi punto (che può , ovviamente, essere assente).
Un filtro leggermente più lento se si è preoccupati che il nome e il cognome possano essere cambiati nel tempo, sarebbe sufficiente filtrare headers
per vedere se contengono solo l'indirizzo email "[email protected]"
. Dato che cercherete solo nella vostra casella di posta, è ragionevole presumere che qualsiasi occorrenza di tale indirizzo di posta elettronica in un'intestazione del messaggio di posta in arrivo significhi che l'e-mail sia originata da tale indirizzo o che sia stata inviata a tale indirizzo come a voi:
set selectedMessages to a reference to (messages of srcFolder whose ¬
class of attachments contains attachment and ¬
"<[email protected]>" is in the headers)
Il resto dello script è più o meno lo stesso, con la correzione per l'errore dei parametri implementato.
Dopo aver testato lo script sul mio sistema, ha funzionato come previsto ed eseguito in modo molto efficiente. Il rallentamento della velocità per me era il dover scaricare ogni allegato per poterlo salvare, quindi c'era una considerazione sul trasferimento dei dati durante l'esecuzione nella mia cartella di posta di Exchange.
Durante l'esecuzione su una cartella di posta locale con allegati già scaricati, il salvataggio degli allegati era praticamente istantaneo.