Apple-Skript schlägt beim Kopieren von Anhängen aus Outlook fehl

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
Ich hatte ein anderes Problem mit Applescript+Outlook und erfuhr, dass es einen schnellen Weg zum Microsoft-Support gibt. Leider waren sie nutzlos (sie sagten, mein Problem sei beabsichtigt), aber ich denke, es lohnt sich, dies zu versuchen. Wenn Sie eine Antwort von Microsoft erhalten, können Sie diese Frage selbst beantworten. Gehen Sie zu Outlook, gehen Sie zum Apple-Menü, wählen Sie Hilfe->CheckForUpdates. Von dort aus können Sie am „Insider Fast“-Programm teilnehmen. Tu es. (Sie können sich später wieder abmelden). Gehen Sie dann zurück zum Hilfemenü von Outlook und Sie finden eine neue Option „Support kontaktieren“, die eine Chat-Sitzung mit Microsoft startet. Einen Versuch wert.
@ jay613 danke für den Vorschlag. Ich werde mal sehen, ob ich dafür die Zeit finde.
Haben Sie versucht, einzelne Zeilen auszukommentieren, um zu sehen, ob eine bestimmte set …Zeile das Problem verursacht?
@TimothyMueller-Harder Das habe ich nicht versucht. Bin mir aber nicht sicher, ob ich genau verstehe, was du meinst. Wenn ich eine Zeile auskommentiere, set ...würde das ein zusätzliches Problem erzeugen, oder? Der Fehler wird durch die save ...Leitung verursacht.
Entschuldigung, Code falsch gelesen! Du hast natürlich Recht.

Antworten (1)

Der Parameterfehler tritt auf, weil einer der Parameter, die Sie an den saveBefehl senden, fehlerhaft ist. Der fParameter ist der attachmentzu speichernde – das ist in Ordnung.

Das Problem ist der zweite Parameter, den Sie angegeben haben, ist ein POSIX filePfad (einer, der aus Schrägstrichen besteht, zB /Users/hitzg/Desktop/some_file.txt).

Die Variable wird jedoch saveAsNamevon abgeleitet saveToFolder, die ihren Dateipfad aus dem choose folderBefehl 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.


NACHTRAG

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- whoseFilters können wir die erste der repeatSchleifen 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 whoseFilters 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 senderleider 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 headersEigenschaft 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, headersum 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.

Vielen Dank für die ausführliche Erklärung. Nur mit filestatt POSIX filefunktioniert 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!