4 votes

Apple script échoue lors de la copie d'une pièce jointe depuis Outlook

J'essaie de copier toutes les pièces jointes que j'ai reçues d'un certain expéditeur (scanner) dans un dossier. J'utilise Outlook et j'ai essayé d'écrire un script pour faire le travail. Il échoue lors de l'enregistrement du fichier avec un code d'erreur :

error "Microsoft Outlook got an error: Parameter error." number -50

Malheureusement, je n'ai pas réussi à comprendre a) ce que signifie cette erreur, et b) comment faire fonctionner le script. Toute aide est la bienvenue.

C'est mon script :

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

0 votes

J'ai eu un problème différent avec Applescript+Outlook et j'ai appris qu'il existe une voie rapide vers le support Microsoft. Malheureusement, ils n'ont rien pu faire (ils ont dit que mon problème était dû à la conception) mais je pense que cela vaut la peine d'essayer. Si vous obtenez une réponse de Microsoft, vous pouvez répondre vous-même à cette question. Allez dans Outlook, allez dans le menu Apple, choisissez Aide->CheckForUpdates. De là, vous pouvez rejoindre le programme "Insider Fast". Faites-le. (Vous pouvez vous désinscrire plus tard). Ensuite, retournez dans le menu Aide d'Outlook et vous trouverez une nouvelle option "Contacter le support" qui lance une session de chat avec Microsoft. Cela vaut la peine d'essayer.

0 votes

@jay613 merci pour la suggestion. Je vais voir si je peux trouver le temps de le faire.

0 votes

Avez-vous essayé de commenter des lignes individuelles pour voir si une ligne particulière set … est à l'origine du problème ?

1voto

OnePablo Points 1

L'erreur de paramètre est due au fait que l'un des paramètres que vous envoyez à la fonction save est erronée. Le site f est le paramètre attachment pour être sauvé - c'est bien.

Le problème est le second paramètre, qui, comme vous l'avez dit, est un POSIX file (un chemin composé de barres obliques, par ex. /Users/hitzg/Desktop/some_file.txt ).

Cependant, la variable saveAsName est dérivé de saveToFolder qui obtient le chemin du fichier à partir de l choose folder commande. Cette commande renvoie un chemin HFS (composé de deux-points, par ex. Macintosh HD:Users:hitzg:Desktop:some_file.txt ).

La solution consiste donc simplement à décider du type de format de chemin d'accès au fichier que vous allez choisir, et à vous y tenir. Vous pouvez SOIT utiliser les chemins posix, et changer cette ligne du script (raccourci pour la lisibilité) de ceci :

set saveToFolder to (choose folder) as string

à ça :

set saveToFolder to POSIX path of (choose folder)

OU utiliser les chemins HFS, et changer cette ligne du script :

save f in POSIX file saveAsName

à ça :

save f in file saveAsName

Cela corrige votre erreur de paramètre, mais je n'ai pas testé le reste de votre script pour voir comment il se comporte. En le lisant, il n'y a pas d'erreurs flagrantes, donc je n'anticipe pas d'autres problèmes majeurs.


ADDENDUM

J'aimerais proposer quelques modifications à votre script original qui, selon moi, rationalise le code tout en le rendant plus efficace et performant. Votre script existant est excellent, cependant avec une utilisation stratégique de l'AppleScript whose on peut éliminer le premier des repeat tout en améliorant les performances de la seconde.

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

L'élément clé de cette version du script est la mise en œuvre de l'option whose filtre ici :

    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)

Au lieu de rechercher dans tous les messages de votre boîte de réception les messages envoyés par un expéditeur particulier, puis de saisir les pièces jointes, le premier critère du filtre sélectionne instantanément les seuls messages de votre boîte de réception qui comportent des pièces jointes ; les messages sans pièces jointes sont superflus pour nos besoins, nous n'avons donc même pas besoin de les prendre en considération. Le deuxième critère spécifie que les e-mails doivent provenir d'une personne spécifique, bien que l'option address of sender ne peut malheureusement pas être incorporé dans le filtre, donc à la place, j'ai utilisé les en-têtes du message pour m'assurer qu'il contient le code approprié. "From: ..." chaîne.

Pour formater cette chaîne, il suffit d'obtenir le headers pour un message de l'expéditeur spécifique, et parcourez-le jusqu'à ce que vous tombiez sur quelques lignes qui ressemblent à ceci :

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>

Il sera à peu près au milieu du texte de l'en-tête. Ensuite, assurez-vous que votre texte de filtre correspond au "From:" (copier-coller), car il sera très certainement le même dans tous les courriels de cet expéditeur, à moins qu'il n'ait changé son nom et son prénom à un moment donné (ce qui peut, bien sûr, être absent).

Un filtre un peu plus souple, si vous craignez que les noms et prénoms aient pu changer au fil du temps, consisterait simplement à filtrer les données de la base de données. headers pour voir s'ils contiennent seulement l'adresse e-mail "scanner@some.some" . Étant donné que vous ne chercherez que dans votre boîte de réception, il est raisonnable de supposer que toute occurrence de cette adresse électronique dans l'en-tête d'un message de la boîte de réception signifie que le message provient de cette adresse ou qu'il a été envoyé en copie à cette adresse ainsi qu'à vous-même :

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

Le reste du script est plus ou moins le même, avec la correction de l'erreur de paramètre implémentée.

Après avoir testé le script sur mon système, il a fonctionné comme prévu et s'est montré très efficace. Le goulot d'étranglement de la vitesse pour moi était de devoir télécharger chaque pièce jointe afin de l'enregistrer, il y avait donc une considération de transfert de données lors de l'exécution contre mon dossier de courrier Exchange.

Lorsqu'on l'exécute par rapport à un dossier de courrier local contenant des pièces jointes déjà téléchargées, l'enregistrement des pièces jointes est pratiquement instantané.

0 votes

Merci beaucoup pour cette explication détaillée. J'utilise simplement file au lieu de POSIX file fonctionne comme un charme. La lecture en boucle de tous les messages est raisonnablement rapide. La nouvelle version que vous avez suggérée est très bien. Malheureusement, elle reste bloquée lors de l'utilisation du filtre ( set selectedMessages ... ). Mais la première version est très bien, elle fait le travail. Alors merci encore !

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X