Applescript et Mail.app, bug ou c'est moi

Après le switch, il est tout naturel de commencer a appréhender la bête par les scripts. Le premier candidat est tout trouvé : un script fourni pour créer un dossier et une règle dans Mail pour une mailing-list. Malheureusement les ML que je reçois ne contiennent ni l'en-tête Sender, ni List-Id. Donc petite modification du script pour utiliser List-Post à la place. Ceci donne le script suivant :
(*
Damien Bonvillain 2004/05

Create a new rule based on the List-Post header of an email received from a mailing-list.
In theory, should work, but in practice fails miserabily. From my experiments, it seems that
making a new rule condition with "header key" is buggy, as the rule condition ends up being for 
the sender of the mail.
So, after the folder and the rule are created, one must edit the rule condition, change the "sender is" to "List-Post" header (by creating it if needed).

Created from Create New Mailing List Mailbox
     Copyright © 2003 Apple Computer, Inc.
*)

using terms from application "Mail"
  on perform mail action with messages msgs
    tell application "Mail"
      set listIds to {}
      set senderHeaders to {}
      
      repeat with msg in msgs
        set headerKey to "List-Post"
        set listId to (my get_header_from_message(headerKey, msg))
        if listId is not "" then
          set listName to content of item 1 of listId
          set i to my index_of(listName, ":")
          set listName to text from character (i + 1) to character (length of listName) of listName
          set i to my index_of(listName, "@")
          set listName to text from character 1 to character (i - 1) of listName
          
          try
            set mboxName to "Mailing Lists/" & listName
            
            try
              set res to display dialog "Enter the mailbox name:" default answer (mboxName as string)
              set mboxName to text returned of res
            on error
              return
            end try
            set mbox to mailbox named mboxName
            get name of mbox
          on error
            if mboxName is not "" then
              make new mailbox with properties {name:mboxName}
              set mbox to mailbox named mboxName
            end if
          end try
          
          -- Now set up the rule for the mailbox
          set listIdHeader to content of item 1 of listId
          set newRule to make new rule at end of rules with properties {name:"Mailing List - " & listName}
          set should move message of newRule to yes
          set move message of newRule to mbox
          delete rule conditions of newRule
          
          set myRuleCondition to make new rule condition at beginning of (rule conditions of newRule) with properties {rule type:header key, header:headerKey, expression:listIdHeader, qualifier:equal to value}
          
          set enabled of newRule to true
          log headerKey
          display dialog "A new rule for this mailing list has been created."
        else
          display dialog "The selected email address does not appear to be from a mailing list.  There is no List-Post header."
        end if
      end repeat
    end tell
  end perform mail action with messages
  
  on get_header_from_message(desiredHeader, theMessage)
    tell application "Mail"
      set hdrs to (headers of theMessage)
      repeat with hdr in hdrs
        if name of hdr is desiredHeader then
          return contents of hdr
        end if
      end repeat
      return ""
    end tell
  end get_header_from_message
  (*
  on run
    tell application "Mail"
      set selMsgs to selection
    end tell
    tell me to perform mail action with messages selMsgs
    tell application "Mail"
      properties of item 1 of rule conditions of the last item of rules
    end tell
  end run
  *)
end using terms from

on index_of(haystack, needle)
  repeat with i from 1 to count of characters in haystack
    if character i of haystack is needle then
      return i
    end if
  end repeat
  return 0
end index_of

Bug ou erreur de codage ? Toujours est-il que même en rajoutant List-Post dans la liste des en-têtes valables pour les règles, le make new rule condition échoue silencieusement et crée une règle bâtarde. En plus je n'ai pas trop confiance en moi avec ce langage si éloigné de la syntaxe C, je ne me repère pas dans cette absence de ponctuation ; où mettre les conjonctions, n'en manque-t'il pas une ? Pourquoi est-ce que Mail faillit silencieusement dans quasiment tous les cas d'erreur que j'ai introduit ? Pas très rassurant tout ça.

Mise à jour 2005/02/07. Benjamin propose la modification suivante :


set theCond to make new rule condition
tell theCond
	(*
		set rule type to «constant erutthdk»
		set «property rhed» to listHeader
	*)
	set rule type to «constant erutthdk»
	set «property rhed» to headerKey
	set qualifier to equal to value
	set expression to listIdHeader
end tell
A tester. Dommage que je me sépare de mon Mac dans peu de temps.

Comments

1. On Sunday 6 February 2005, 19:14 by Benjamin Ragheb

I have solved the problem!
In "...properties { header:headerKey ... }" the header property is being interpreted by the AppleScript compiler as «property mhdr» but in this context it should be «property rhed» instead. My solution is to create the rule condition this way:
set theCond to make new rule condition

tell theCond

(*

set rule type to «constant erutthdk»

set «property rhed» to listHeader

*)

set rule type to «constant erutthdk»

set «property rhed» to headerKey

set qualifier to equal to value

set expression to listIdHeader

end tell
I repeated those two lines as the comments because, once compiled, they will be transformed into their text form. You will need to copy and paste them again each time you recompile the script.