# Applescript Mail AddressBook



## CathyGYM (6 Mars 2011)

Bonjour,
J'essaies de créer une règle mail qui récupère automatiquement le nom et l'adresse de l'expéditeur d'un mail ayant un objet bien défini. J'ai donc sélectionné les mails répondant au bon critère dans la règle mail, pour çà aucun problème. Puis j'ai écrit un script qui extrait le nom et l'adresse mail de l'expéditeur, et s'il n'est pas encore dans mon carnet d'adresse, je souhaites l'y ajouter et le mettre dans un groupe existant. Voici le code :

```
using terms from application "Mail"
	--on perform mail action with messages theMessages for rule NewUserAppli
	on perform mail action with messages theMessages
		repeat with CeMessage in theMessages
			--try
			set LeSender to the sender of CeMessage
			set TheName to (extract name from the sender of CeMessage)
			set TheAdress to (extract address from the sender of CeMessage)
			tell application "Address Book"
				set PersonnePres to (every person in group "AppliMac" whose name is TheName)
				if PersonnePres is {} then
					set ThePerson to make new person in group "AppliMac" with properties {name:TheName, email:TheAdress}
					save
				end if
			end tell
			--end try
		end repeat
	end perform mail action with messages
end using terms from
```
L'extraction du nom et de l'adresse se passe bien, mais çà plante à la création du nouveau contact. En fait, tout ce qui est après "tell application address book" plante. Cela fait un moment que je tourne en rond sur ce problème, alors si quelqu'un a une idée... Merci d'avance


----------



## Anonyme (6 Mars 2011)

Bonjour,

name est une propriété  en lecture seulement, il faut utiliser last name et first name.
Pour le savoir, dans le dictionnaire AppleScript du carnet  --> _name (text, r/o)_ : *r/o* ça veut dire read only


Pour l'adresse, à chaque nouvelle personne créée, il faut créer l'adresse  et spécifier le nom du  label.
Pour les personnes existantes dans le carnet, il faut vérifier l'existence des adresses avant.

email est une classe, une sous-classe de person.
*contact info*&#8194;est une sous-classe de email, ses propriétés sont id, label et value

```
tell application "Address Book"
				set PersonnePres to (every person in group "AppliMac" whose name is TheName)
				if PersonnePres is {} then
					if (count (words of TheName)) > 1 then
						set prenom to word 1 of TheName
						set TheName to text ((length of prenom) + 2) thru -1 of TheName
					else
						set prenom to ""
					end if
					set ThePerson to make new person at end of people of group "AppliMac" with properties {last name:TheName, first name:prenom}

					tell ThePerson to make new email with properties {label:"home", value:TheAdress}
					save -- save addressbook
				end if
			end tell
```


----------



## CathyGYM (6 Mars 2011)

Merci beaucoup Mac_Jac pour cette réponse aussi rapide. Ca fonctionne très bien à un détail près... Il semblerait que le test que j'avais mis pour savoir si la personne était déjà présente dans mon carnet d'adresse (groupe "AppliMac"), ne fonctionne pas... Par contre quand je l'enlève, tout va bien, sauf que mon carnet se remplit de doublons !
La syntaxe de ce test est elle correcte ?  

```
set PersonnePres to (every person in group "AppliMac" whose name is TheName)
	if PersonnePres is {} then
```

Merci d'avance


----------



## Anonyme (6 Mars 2011)

Bonsoir,

Oui , tout est correct, je l'avais testé, sauf la commande save ne fait rien , save addressbook est la commande à utiliser sur *OS X 10.5.8* ou moins.

Voici ce qu'il faut faire pour debuger le script avec l'historique de l'éditeur.

Ajoute ces lignes au début du script avant using terms from application "Mail"

```
tell application "Mail"
	set x to selection
	tell me to perform mail action with messages x
end tell
```
Sélectionne un message dans *Mail*, exécute le script dans l'éditeur, vérifie l'historique


----------



## CathyGYM (6 Mars 2011)

Merci Mac_Jac,
J'ai snow leopard, donc la commande save fonctionne bien... et les quatre lignes de test y sont bien, mais je n'arrive pas à tester si le contact à ajouter est déjà dans le carnet d'adresse (dans le groupe "AppliMac"). La conséquence, c'est que les contacts s'empilent avec un grand nombre de doublons...  

---------- Nouveau message ajouté à 21h28 ---------- Le message précédent a été envoyé à 21h14 ----------

Petite précision, dans la fenêtre évènement, l'execution s'arrête sur 
"get every person of group "AppliMac" whose name = "NOM"  et après plus rien... 
ou plutôt si après un certain temps :"erreur dans Address Book : Délai dépassé pour un AppleEvent" number -1712

Or la personne que j'ai sélectionnée n'étant pas dans le groupe, il devrait l'ajouter.
Lorsque je vire le test, l'ajout du contact se fait normalement.


----------



## Anonyme (6 Mars 2011)

CathyGYM a dit:


> [/COLOR]Petite précision, dans la fenêtre évènement, l'execution s'arrête sur
> "get every person of group "AppliMac" whose name = "NOM"  et après plus rien...
> ou plutôt si après un certain temps :"erreur dans Address Book : Délai dépassé pour un AppleEvent" number -1712



OK, cela semble être un bogue de Address Book sur Snow.

Essaie ceci, pour voir si ça fonctionne

```
tell application "Address Book"
	set thesenames to (name of people of group "AppliMac")
	if TheName is in thesenames then
```
Ou il y a une fiche de corrompue, essaie sur un nouveau groupe


----------



## CathyGYM (7 Mars 2011)

Super, cette fois ci çà marche nickel (avec "if TheName is *not* in these names then")
Merci beaucoup Mac Jac


----------



## Jove (8 Novembre 2015)

Bonjour, 

Je me permet de déterrer ce post car ce script m'intéresse beaucoup : @CathGYM pourrais tu redonner le code complet du script qui marche chez toi svp ? Je n'arrive pas à le faire tourner de mon coté ...

Merci d'avance, ça m'aiderait pas mal


----------

