Ce forum est en partie financé par l’affichage de publicités. Merci de désactiver votre bloqueur de publicités pour nous permettre de continuer à fournir ce service.

Aide Applescript

Discussion dans 'Développement Mac' créé par macman31, 15 Août 2008.

  1. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Bonjour,
    Je tente de créer en Applescript la version Mac de ce logiciel (pour PC) : Où est mon PC ? (description : http://www.logitheque.com/fiche.asp?I=23873&L=O%F9+est+mon+PC%3F)

    Voici mon code applescript actuel :



    set theTime to (current date)
    set hrs to (theTime) as string
    copy words 5 thru 5 of (hrs as string) to hrs

    set rapport to do shell script "/usr/sbin/traceroute google.fr"

    property notHidden : true

    tell application "Mail"


    if notHidden then
    tell application "Mail" to set visible of every window to false
    set notHidden to false
    else
    tell application "Mail" to set visible of every window to true
    set notHidden to true
    end if


    set newMessage to (make new outgoing message at end of outgoing messages with properties {subject:"Rapport Traceroute du : " & theTime, content:"Rapport traceroute en cas de vol" & return & return & return & rapport & return & return & return & "Voilà, application lancée : " & return & return & theTime})

    tell newMessage
    make new recipient at end of to recipients with properties {address:"
    jkdsghlqksjdhglkjqsdhglk@hotmail.fr"}

    send newMessage

    delay 5
    quit application "Mail"

    end tell

    quit application "envoi traceroute mail"

    end tell




    (J'ai mis une fausse adresse mail.);)

    Donc j'aimerai que l'utilisateur entre dans un fichier nommé "adresse mail.txt" l' adresse mail où il souhaiterai envoyer le rapport traceroute, et que l'applescript récupère l'adresse, et la mette à la place de "jkdsghlqksjdhglkjqsdhglk@hotmail.fr", le fichier "adresse mail.txt" étant placé dans le même dossier que l'applescript.

    Est-il aussi possible d'envoyer le mail sans passer par "Mail" ?
    Je précise que c'est mon premier applescript.

    Merci d'avance,:)
     
  2. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Salut,

    Le plus simple, selon moi, serait de créer un progiciel et de mettre le fichier adresse mail.txt dans le dossier resource du paquet et au premier lancement afficher un dialogue pour la saisie de l'adresse.

    Oui il est possible d'envoyer un mail sans l'aide de Mail.app, en utilisant la commande mail du terminal. Par contre je ne sais pas comment récupérer l'adresse de l'expéditeur sans utiliser Mail.app…

    J'ai fait un applet, qui utilise Mail.app pour récupérer l'adresse de l'expéditeur, si ça peut te servir…
    ;)

    Code (Text):
    property messTo : missing value
    property theDate : missing value
    property messSub : missing value
    property rapport : missing value


    on run
        set thefile to (path to resource "adresse mail.txt")
        set theDate to (current date)
        set messSub to ("Rapport Traceroute du : " & theDate)
        set messTo to readFile(thefile)
        set rapport to do shell script "/usr/sbin/traceroute google.fr"
       
       
        tell application "Mail"
            set messFrom to email addresses of first account
            quit
        end tell
       
        do shell script "echo " & (quoted form of rapport) & " | mail -s " & (quoted form of messSub) & " " & messTo & " -f " & messFrom
    end run

    on readFile(PathFile)
        try
            open for access PathFile
            set theAddress to read PathFile
            close access PathFile
        on error
            close access PathFile
            set theAddress to text returned of (display dialog "À quelle adresse souhaitez-vous envoyer les rapports ?" default answer "theAddress@mail.com" buttons "Ok" default button 1)
            writeFile(PathFile, theAddress)
        end try
        return theAddress
    end readFile

    on writeFile(PathFile, theData)
        set x to open for access file (PathFile as Unicode text) with write permission
        try
            set eof x to 0
            write theData to x
            close access x
        on error
            close access x
        end try
    end writeFile
     


    Note du modo : C'est un topic pour "Développement sur Mac, ça, pas pour "Applications" ! On y va.
     
  3. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Merci beaucoup, mais je n'es suis qu'à mes débuts en programmation, donc pourrai-tu m'expliquer comment créer un "progiciel"

    J'ai aussi remarqué qu'applescript ne voulait pas compiler ton applet : (voir image)

    [​IMG]

    Merci beaucoup.




    PS : je ne voulait pas à avoir à passer par "Mail.app" pour ne pas à avoir à configurer de compte.
     
  4. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Il suffit de choisir "Progiciel" dans le menu déroulant de la fenêtre d'enregistrement du script.

    [​IMG]
    Click for full size - Uploaded with plasq's Skitch
    Pas de problème chez moi…je ne comprends pas…:nailbiting:
    [​IMG]
    Click for full size - Uploaded with plasq's Skitch

    Merci beaucoup.


    Il faut donc modifier la procédure d'obtention de l'adresse expéditeur, je viens d'essayer en mettant l'adresse d'un amis et je pensais que le système allait bloquer l'envoi mais ce n'est pas le cas.
    On peut donc mettre celle-ci dans une property en début de script et supprimer l'appel à l'application Mail.
    rajoute :
    Code (Text):
    property messFrom : "tonAdresse@fai.com"
     
    et efface :
    Code (Text):
        tell application "Mail"
            set messFrom to email addresses of first account
            quit
        end tell
     
    ;)
     
  5. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Merci beaucoup pour toutes ces infos.

    Je pense avoir trouvé la cause de l'erreur :

    Fenêtre d'information du logiciel éditeur de script :

    -----------------------------------------------------------------------------------------------------------------


    Éditeur de scripts

    2.0 (v43.1)

    AppleScript FU1-1.9.3

    Cette application permet de créer, de modifier et d’exécuter des scripts AppleScript ainsi que d’autres scripts basés sur le language OSA.

    © Copyright 1997-2003. Apple Computer Inc.,

    all rights reserved.

    -----------------------------------------------------------------------------------------------------------------


    J'ai remarqué sur un site que la version la plus récente d'Applescript est la version 2, or ma version est la 1.9.3 .

    La date du copiright me parait aussi un peut vieille ( 2003 ).

    Je tient à préciser que je suis sous panther ( 10.3.9 )

    Je voudrai savoir quelle est la commande qui remplace " set thefile to (path to resource "adresse mail.txt") " pour ma version d'Applescript.

    Je voudrais aussi faire remarquer qu'au lieu d'enregistrer en "progiciel", j'ai enregistrer en "lot d'applications", car l'option "progiciel" n'apparait pas dans ma version d'éditeur de script, mais l'option me semble la même ( l'option "afficher le contenu du paquet" apparait lors d'un ctrl-clic sur l'application, et il y a bien un dossier "Resources" dans le dossier "Contents"


    Voilà, merci d'avance pour la réponse à mes questions.

    P.S. : je peut reprendre le nom "MacTrace" pour mon logiciel ?
     
  6. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Re-bonjour :

    J'ai fait une recherche, et je suis tombé sur cette commande : " ((path to me as text) & "Contents:Resources:adressemail.txt") " qui remplace la commande " (path to resource "adresse mail.txt") " :):)

    éditeur de script compile bien ce passage, mais dans la foulée, il ne reconnaît pas " readfile(thefile) " (il met "readfile" en vert ( il le reconnait comme une variable) et "thefile" aussi. :(
    J'ai donc mis des espaces, ce qui donne "read file (thefile)", il met bien "read file" en bleu (instruction), mais là, il me dit, lors de l'exécution du "progiciel" :

    "end of file error" :(

    Il y a aussi marqué plusieurs fois readfile et writefile, ou j'ai donc mis des espaces ( read file et write file )

    Il me met, au "read file (Pathfile)" :

    ----------------------------
    Erreur de syntaxe

    file (PathFile) est illégal en tant que paramètre formel.
    -------------------------------

    et il garde read et file en vert.:mouais:

    Je remet "readfile(Pathfile)", et la il fait le même message d'erreur pour "write file (PathFile, theData)"

    Voilà, j'en suis là. :(

    Merci pour toutes vos réponces futures. :zen:


    PS : Merci au modo :modo: qui a déplacé le post, je n'avais pas vu la catégorie.
     
  7. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    En cherchant un peut sur internet, je suis tombé sur cette commande : "

    set foo to (open for access (POSIX file PathFile))
    set theAdress to (read foo for (get eof foo))
    close access foo


    ", qui remplace : "

    open for access PathFile
    set theAddress to read PathFile
    close access PathFile

    ", et j'ai mis " set messTo to read file (thefile) " au lieu de " set messTo to readfile(thefile) ".


    La compilation fonctionne, j'exécute le script et au bout d'un moment il s'arrête, mais a aucun moment il n'a affiché un message d'erreur, et il ne ma jamais demandé l'adresse du destinataire.

    Si je met mon adresse mail dans le fichier "adresse mail.txt, il m'envoie le rapport traceroute, mais sinon il a l'air de l'envoyer à personne, car il n'y a aucune adresse mail dans le fichier, et il n'y met pas l'adresse par défaut.

    Voilà, j'en suis là, est-ce que vous pourriez me dire comment faire pour qu'il demande l'adresse mail ?

    Voici mon script pour l'instant :

    Code (Text):


    property messFrom : "dhdtyhdhjdhdhgh@hotmail.fr"
    property messTo : missing value
    property theDate : missing value
    property messSub : missing value
    property rapport : missing value


    on run
        set thefile to (path to me as text) & "Contents:Resources:adresse mail.txt"
        set theDate to (current date)
        set messSub to ("Rapport Traceroute du : " & theDate)
        set messTo to read file (thefile)
        set rapport to do shell script "/usr/sbin/traceroute google.fr"
       
       
        do shell script "echo " & (quoted form of rapport) & " | mail -s " & (quoted form of messSub) & " " & messTo & " -f " & messFrom

    end run

    on readfile(PathFile)
        try
           set foo to (open for access (POSIX file PathFile))
            set theAdress to (read foo for (get eof foo))
            close access foo
        on error
            close access PathFile
            set theAddress to text returned of (display dialog "À quelle adresse souhaitez-vous envoyer les rapports ?" default answer "theAddress@mail.com" buttons "Ok" default button 1)
            writeFile(PathFile, theAddress)
        end try
        return theAddress
    end readfile

    on writeFile(PathFile, theData)
        set x to open for access file (PathFile as Unicode text) with write permission
        try
            set eof x to 0
            write theData to x
            close access x
        on error
            close access x
        end try
    end writeFile

     
    (j'ai brouillé l'adresse mail)

    Merci beaucoup,
     
  8. ceslinstinct

    ceslinstinct Membre d’élite
    Club MacG

    Inscrit:
    10 Août 2004
    Messages:
    2 069
    J'aime reçus:
    111
    Bonjour

    zacromatafalgar t'as indiqué la façon d'utiliser les 2 routines en dessous du code run.

    Au premier coup d'œil elle ne servent à rien dans ton code puisque tu les by-passe.

    @+
     
  9. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Pas de problème… ;)

    Il y a un moment que j'ai laissé tombé Panther, l'essentiel est que tu aies trouvé…

    Il est normal que les appels aux fonctions soient en vert, si tu rajoutes des espaces la fonction n'est plus appelée.

    Tu vas te retrouver avec une erreur car on fourni déjà un chemin de type Finder or tu essaie de le convertir de nouveau en type Finder (posix file), à la rigueur tu peux mettre :
    Code (Text):
    set x to open for access pathFile
    set theAdress to read x
    close access x
    cette syntaxe fonctionne peut être mieux sous Panther…
    Encore une fois, ce n'est pas une bonne idée… ;)

    C'est normal qu'il ne te demande pas l'adresse car tu as modifié l'appel à la fonction ("read file" pour "readFile")

    J'ai retouché ton script et il fonctionne chez moi sur Leopard, après avoir mis une adresse normale pour messFrom…
    Code (Text):
    property messFrom : "testAddress@orange.fr"
    property messTo : missing value
    property theDate : missing value
    property messSub : missing value
    property rapport : missing value


    on run
        set thefile to (path to me as text) & "Contents:Resources:adresse mail.txt"
        set theDate to (current date)
        set messSub to ("Rapport Traceroute du : " & theDate)
        set messTo to readFile(thefile)
        set rapport to do shell script "/usr/sbin/traceroute google.fr"
       
       
        do shell script "echo " & (quoted form of rapport) & " | mail -s " & (quoted form of messSub) & " " & messTo & " -f " & messFrom
       
    end run

    on readFile(PathFile)
        try
            set foo to (open for access (PathFile))
            set theAddress to (read foo)
            close access foo
        on error
            close access foo
            set theAddress to text returned of (display dialog "À quelle adresse souhaitez-vous envoyer les rapports ?" default answer "theAddress@mail.com" buttons "Ok" default button 1)
            writeFile(PathFile, theAddress)
        end try
        return theAddress
    end readFile

    on writeFile(PathFile, theData)
        set x to open for access file (PathFile as Unicode text) with write permission
        try
            set eof x to 0
            write theData to x
            close access x
        on error
            close access x
        end try
    end writeFile
     
     
  10. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Salut,

    Si si, elles sont bien utilisées…
    readFile est utilisée au début du bloc run, à l'initialisation des variables (set messTo to readFile(thefile)) et writeFile dans la fonction readFile() lors de l'inscription de l'adresse du destinataire… ;)
     
  11. ceslinstinct

    ceslinstinct Membre d’élite
    Club MacG

    Inscrit:
    10 Août 2004
    Messages:
    2 069
    J'aime reçus:
    111
    Je prend en route, donc j'ai regardé son code j'ai bien vue que le tien doit fonctionner mais le sien en Read File ce sont des mots clés et pas une variable.

    Ce que j'ai compris de son code c'est qu'il va lire le fichier directement sans passer par la routine de lecture de ce dernier.

    Donc les routines Read et Write sont inutilisés par lui mais pas par toi.

    Je voie ce code d'une façon différente (c'est ce que permet AS pour l'écriture), tu permet que je fasse une version pour moi (je vais adapter ton code a ma façon d'utiliser mes applications)?

    Que ce soit le script qui contrôle tout, y compris la création du fichier texte si il n'existe pas.

    Cordialement
     
  12. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Et c'est bien pour ça que son script ne lui demande jamais de saisir l'adresse…
    Bien sûr… ;)
     
  13. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Merci pour toutes ces réponses, le script se compile bien et fonctionne la première fois ( il me demande bien l'adresse et crée bien le fichier "adresse mail.txt", mais lors de la seconde exécution, au bout d'un moment, il met un message d'erreur (voir image) :

    [​IMG]

    alors qu'il est bien marqué "

    mail -s " & (quoted form of messSub) & " " & messTo & " -f " & messFrom

    ".


    Je précise que c'est mon premier applescript, que j'ai procédé "à taton" avec des morceaux de codes trouvés sur le web, et le code de zacromatafalgar, et que je n'avais aucune idée des erreurs que j'avais mises dans le code.

    Je voudrais savoir quelle est donc la cause de l'erreur, et la solution.

    Est-ce que je peux aussi diffuser le logiciel sur Internet ? ( une fois le problème résolu )

    Encore merci,
     
  14. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Je n'arrive pas à reproduire l'erreur, je pense que c'est une incompatibilité avec Panther, il faudrait que tu testes le script sur Tiger ou Leopard…

    C'est pas mal pour un premier script, va faire un tour sur iScript.fr, tu y trouveras les bases… ;)

    Désolé mais je ne peux t'apporter de solution… :(

    Oui…

    Si tu veux rajouter la création automatique du fichier dans le paquet, il faut rajouter :
    Code (Text):
        try
            thefile as alias
        on error
            do shell script "touch " & (quoted form of thefile)
        end try
     
    en début de script, après la ligne
    Code (Text):
        set thefile to (path to me as text) & "Contents:Resources:adresse mail.txt"
     
  15. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Merci pour toute ton aide, zacromatafalgar.
    J'ai vu que tu était sous leopard.
    Si je trouve l'erreur ( ou toi ) ;) , pourras-tu tester le script ?

    Sinon, j'aimerais assez que tu m'explique le fonctionnement de :

    do shell script "echo " & (quoted form of rapport) & " | mail -s " & (quoted form of messSub) & " " & messTo & " -f " & messFrom


    à quoi servent les guillemets ? la barre verticale devant "mail" ? le choix des variables est important, ou c'est l'ordre ?…



    Si cela peut t'aider pour résoudre le problème, je précise qu'il crée automatiquement le fichier "adresse mail.txt" s'il n'existe pas, il me demande l'adresse mail, et il envoie bien le rapport.
    Par contre, il ne l'envoie pas si on l'exécute sans avoir supprimé "adresse mail.txt". Il affiche le message d'erreur, comme s'il devait demander à chaque fois l'adresse mail. :mouais:

    Est-ce un problème de lecture du fichier ?:confused:

    Merci beaucoup, :zen:
     
  16. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Oui, il fonctionne déjà bien chez moi… :)

    Les guillemets séparent les parties unix (qui seraient lettre pour lettre dans le terminal) et les parties applescript, dans le terminal les parties applescript seraient en dur.

    La barre verticale ou pipe permet de passer le résultat de la commande echo à la commande mail.
    Après je ne connais pas trop ce langage…et si des personnes compétentes remarquent des inexactitudes ou peuvent apporter des précisions, merci à elles…

    Non, le choix du nom des variables importe peu pourvu que ces noms ne comportent ni espace, ni caractère accentué et qu'ils ne débutent pas par un chiffre en revanche l'ordre des variables est très important, supposons que tu inverses messTo et messFrom, le message sera envoyé à l'adresse de l'expéditeur.
    Tu peux obtenir des précisions sur les commandes shell utilisées en ouvrant le terminal et tapant man suivi du nom de la commande, par exemple :
    Code (Text):
    man mail
    Il faudrait remplacer la ligne
    Code (Text):
    do shell script "touch " & (quoted form of thefile)
    par
    Code (Text):
    do shell script "touch " & (quoted form of POSIX path of thefile)
    , ben oui, je l'ai oublié, honte à moi…

    De plus je ne sais si, sous Panther, la ligne
    Code (Text):
    thefile as alias
    est bien reconnue, si la modification au dessus ne fonctionne pas, remplace la par :
    Code (Text):
    tell application "Finder"
    thefile as alias
    end tell
    ;)

    Edit : il me semble que la commande "open for access" créée le fichier s'il n'existe pas, on n'aurait dans ce cas pas besoin du bloc
    Code (Text):
        try
            thefile as alias
        on error
            do shell script "touch " & (quoted form of posix path of thefile)
        end try
     
    edit 2 : ça marche sous Leopard mais est-ce cas sous Panther ?
     
  17. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    J'ai l'erreur !!!!!!
    En effet, j'ai exécuter la séquence d'envoi du mail sous Terminal, ( j'ai marqué des trucs bidons ) :

    echo essai | mail -s essai monmail@free.fr -f expediteur@free.fr


    Le mail s'envoie sans problèmes.

    J'ai supprimé "monmail@free.fr", et voila le résultat :

    echo essai | mail -s essai -f expediteur@free.fr
    mail: You must specify direct recipients with -s, -c, or -b.

    Ca ne vous rappelle pas quelque chose ? ;)

    (pour ceux qui n'ont pas suivi, c'est le message d'erreur optenu sous Editeur de script.)

    J'en conclus donc que c'est la lecture du fichier qui est en cause. l'applescript ne lirait pas ( ou pas correctement) le fichier avec l'adresse mail, donc le message ne peut être envoyé.
    Mais à quel endroit du script ?


    Au fait zacromatafalgar, le fichier "adresse mail.txt" se crée automatiquement sans la partie du code que tu m'as demandé d'ajouter. (avec aussi, mais bon…) donc tu as raison pour "open for access" qui crée le fichier manquant.

    Je voudrais donc savoir si possible quel est le problème.

    Merci pour vos réponses,

    P.S. : à quoi sert :

    on writeFile(PathFile, theData)
    set x to open for access file (PathFile as Unicode text) with write permission
    try
    set eof x to 0
    write theData to x
    close access x
    on error
    close access x
    end try
    end writeFile
     
  18. macman31

    macman31 Membre junior

    Inscrit:
    10 Mars 2008
    Messages:
    31
    J'aime reçus:
    3
    Je ne comprends plus rien…

    J'ai rajouté " display dialog messTo" après " set rapport to do shell script "/usr/sbin/traceroute google.fr" ", donc juste avant l'envoi du message, et dans le dialogue, il m'affiche ……… l'adresse mail du destinataire ! :eek:

    Ce n'est donc pas un problème de lecture de fichier, c'est à mon avis un problème du shell d'envoi du message. Pourtant, il devrait l'envoyer, car il y a bien l'adresse mail du destinataire !
    On dirait qu'il arrête le shell et essaye d'envoyer le message avant "messTo"… :confused:

    Si vous pouvez m'aider à résoudre cet obscur problème…:):zen:

    P.S.: Merci à zacromatafalgar pour l'explication…
     
  19. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Cette routine écrit l'adresse du destinataire dans le fichier et est appelée, en cas d'erreur de la routine readFile, après la saisie de l'adresse.
     
  20. zacromatafalgar

    zacromatafalgar Membre émérite

    Inscrit:
    19 Mai 2004
    Messages:
    878
    J'aime reçus:
    81
    Je pense à une incompatibilité soit de ta version d'applescript ou bien de Panther…

    Pourrais-tu poster ton code en entier ou bien me l'envoyer à monPseudo@gmail.com
    ;)
     
Chargement...