Ich versuche, alle Anhänge, die ich von einem bestimmten Absender (Scanner) erhalten habe, in einen Ordner zu kopieren. Ich verwende Outlook und habe versucht, ein Skript zu schreiben, um den Job zu erledigen. Es schlägt beim Speichern der Datei mit dem Fehlercode fehl:
error "Microsoft Outlook got an error: Parameter error." number -50
Leider konnte ich nicht herausfinden, a) was dieser Fehler bedeutet und b) wie das Skript funktioniert. Jede Hilfe ist willkommen.
Das ist mein Skript:
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
Der Parameterfehler tritt auf, weil einer der Parameter, die Sie an den save
Befehl senden, fehlerhaft ist. Der f
Parameter ist der attachment
zu speichernde – das ist in Ordnung.
Das Problem ist der zweite Parameter, den Sie angegeben haben, ist ein POSIX file
Pfad (einer, der aus Schrägstrichen besteht, zB /Users/hitzg/Desktop/some_file.txt
).
Die Variable wird jedoch saveAsName
von abgeleitet saveToFolder
, die ihren Dateipfad aus dem choose folder
Befehl erhält. Dieser Befehl gibt einen HFS-Pfad zurück (aus Doppelpunkten zusammengesetzt, zB Macintosh HD:Users:hitzg:Desktop:some_file.txt
).
Die Lösung besteht also darin, einfach zu entscheiden, welche Art von Dateipfadformat Sie verwenden möchten, und sich daran zu halten. Sie können ENTWEDER Posix-Pfade verwenden und diese Zeile des Skripts (aus Gründen der Lesbarkeit gekürzt) von dieser ändern:
set saveToFolder to (choose folder) as string
dazu:
set saveToFolder to POSIX path of (choose folder)
ODER verwenden Sie HFS-Pfade und ändern Sie diese Zeile des Skripts:
save f in POSIX file saveAsName
dazu:
save f in file saveAsName
Das behebt Ihren Parameterfehler, aber ich habe den Rest Ihres Skripts nicht getestet, um zu sehen, wie es funktioniert. Beim Durchlesen gibt es keine eklatanten Fehler, daher erwarte ich keine weiteren größeren Probleme.
Ich möchte ein paar Änderungen an Ihrem ursprünglichen Skript anbieten, von denen ich glaube, dass sie den Code rationalisieren und gleichzeitig effizienter und leistungsstärker machen. Ihr vorhandenes Skript ist ausgezeichnet, aber durch den strategischen Einsatz des AppleScript- whose
Filters können wir die erste der repeat
Schleifen eliminieren und gleichzeitig die Leistung der zweiten verbessern.
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
Das Schlüsselelement dieser Version des Skripts ist die Implementierung des whose
Filters hier:
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)
Anstatt alle Nachrichten in Ihrem Posteingang nach Nachrichten zu durchsuchen, die von einem bestimmten Absender gesendet wurden, und sich dann die Anhänge zu schnappen, wählt das erste Kriterium des Filters sofort nur die Nachrichten in Ihrem Posteingang aus, die Anhänge haben. Nachrichten ohne Anhänge sind für unsere Bedürfnisse überflüssig, sodass wir sie nicht einmal berücksichtigen müssen. Das zweite Kriterium gibt an, dass E-Mails von einer bestimmten Person stammen sollen, obwohl die address of sender
leider nicht in den Filter aufgenommen werden kann, also habe ich stattdessen die Nachrichtenkopfzeilen verwendet, um sicherzustellen, dass sie die richtige "From: ..."
Zeichenfolge enthalten.
Um diese Zeichenfolge zu formatieren, besorgen Sie sich einfach die headers
Eigenschaft für eine Nachricht von dem bestimmten Absender und überfliegen Sie sie, bis Sie auf einige Zeilen stoßen, die so aussehen:
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>
Es befindet sich ungefähr in der Mitte des Kopfzeilentexts. Stellen Sie dann einfach sicher, dass Ihr Filtertext mit der "From:"
Zeile übereinstimmt (Kopieren und Einfügen), da dies mit ziemlicher Sicherheit in allen E-Mails von diesem Absender gleich sein wird, es sei denn, sie haben an irgendeiner Stelle ihren Vor- und Nachnamen geändert (was natürlich passieren kann , abwesend sein).
Ein etwas lockererer Filter, wenn Sie befürchten, dass sich der Vor- und Nachname im Laufe der Zeit geändert haben könnte, wäre einfach, die zu filtern, headers
um zu sehen, ob sie nur die E-Mail-Adresse enthalten "scanner@some.some"
. Da Sie nur Ihren Posteingang durchsuchen werden, ist es vernünftig anzunehmen, dass jedes Vorkommen dieser E-Mail-Adresse in einer Kopfzeile einer Posteingangsnachricht bedeutet, dass die E-Mail entweder von dieser Adresse stammt oder an diese Adresse sowie an Sie als Cc gesendet wurde:
set selectedMessages to a reference to (messages of srcFolder whose ¬
class of attachments contains attachment and ¬
"<scanner@some.some>" is in the headers)
Der Rest des Skripts ist mehr oder weniger gleich, wobei der Fix für den Parameterfehler implementiert ist.
Nachdem ich das Skript auf meinem System getestet hatte, funktionierte es wie erwartet und war sehr effizient. Der Geschwindigkeitsengpass für mich bestand darin, dass ich jeden Anhang herunterladen musste, um ihn zu speichern, also gab es eine Datenübertragungsüberlegung, wenn ich mit meinem Exchange-E-Mail-Ordner lief.
Wenn es mit einem lokalen E-Mail-Ordner mit bereits heruntergeladenen Anhängen ausgeführt wurde, war das Speichern von Anhängen praktisch augenblicklich.
file
statt POSIX file
funktioniert wie ein Zauber. Das Durchlaufen aller Nachrichten war ziemlich schnell. Die neue Version, die Sie vorgeschlagen haben, sieht großartig aus. Leider bleibt es bei der Verwendung des Filters hängen ( set selectedMessages ...
). Aber die erste Version ist in Ordnung, sie macht den Job. Also nochmals vielen Dank!
jay613
hitzg
Dienstag
set …
Zeile das Problem verursacht?hitzg
set ...
würde das ein zusätzliches Problem erzeugen, oder? Der Fehler wird durch diesave ...
Leitung verursacht.Dienstag