# Applescript Mail Recup Pièce jointe



## CathyGYM (16 Décembre 2010)

Bonsoir, 
Eh oui l'apprentissage du Mac et l'Applescript ne sont pas encore terminés pour moi, et j'ai encore une question...

Je cherche à écrire un script pour créer une règle de ma boite Mail. Toutes les semaines, je reçois un mail de même format contenant mon planning, et je souhaiterais récupérer la pièce jointe automatiquement dans un dossier spécifique. J'ai donc créé une nouvelle règle de ma boite Mail, qui exécute un script pour tous les mails issus d'un certain sender. Le problème c'est que le script ne fonctionne pas... J'ai pas encore tout compris !
Voilà le script, quelqu'un aurait-il une idée ? (j'ai mis en commentaire les premières et dernières lignes pour tester à partir de l'éditeur Applescript).


```
--using terms from application "Mail"
--on perform mail action with messages theMessages for rule ReglePlanning
tell application "Finder"
	set Mais to a reference to home
	set PathPlann to folder "Plannings" of folder "Documents" of Mais
end tell
tell application "Mail"
   set NombredeMessages to count the messages
   repeat with CeMessage in the messages
	set LeSujet to subject of CeMessage
	set LeSender to sender of CeMessage
	set LaDate to the week of the date received of CeMessage as string
	if ((LeSender is equal to "Chef@Service.com") and (LeSujet contains "Planning Semaine")) then
           try
		set NomPieceJointe to the name of the first mail attachment of CeMessage
		if NomPieceJointe is equal to "Planning.pdf" then
			set LeNomFichier to PathPlann & NomPieceJointe & "-" & LaDate
			save first mail attachment of CeMessage in LeNomFichier
		end if
		display dialog "OK"
	   on error
		display dialog "Erreur"
	   end try
        end if
    end repeat
end tell
--end perform mail action with messages
--end using terms from
```

Question subsidiaire : faut-il enregistrer ce script en tant qu'application ou autre ?


Merci d'avance


----------



## les_innommables66 (17 Décembre 2010)

Bonjour,
J'avais été confronté aux mêmes difficulltés il y a quelques temps.
Mon expérience : 
1- ne pas faire appel à d'autres applications (supprime le "tell  application "Finder"", les instructions qui sont dans ce bloc peuvent  sans doute rester en l'état)
2- chez moi, le script est enregistré en tant que "script", et ça fonctionne
3- ce genre de script est "capricieux" : essaye de mettre le maximum de  tests en tant que conditions dans la règle Mail (conditions sur le sujet  et l'expéditeur par exemple) ce qui permettra d'avoir moins  d'instructions dans le script, et donc moins d'occasions de plantage

Bon courage

Nicolas


----------



## CathyGYM (17 Décembre 2010)

Merci pour ces infos, je vais essayer de délester un maximum de commandes script, mais il me reste de toute façon au moins une erreur de syntaxe (sur "_count the messages_" et sur la boucle repeat). Apparemment, "_the messages_", ce ne doit pas être bon, mais je ne comprends pas pourquoi...
Quelqu'un a-t-il une idée sur cette partie ?
Merci


----------



## ceslinstinct (17 Décembre 2010)

Bonjour

J'ai créé un dossier Pièces jointes dans Mail 
J'ai fait une règle:

l'une des   conditions suivante est remplie:

Une pièce jointe --- Contient .pps (pour moi)

Déplacer le message --- vers:   Pièces jointes.

Ça fonctionne très bien (défaut, ce n'est pas signalé dans le Dock).


Sinon on les trouve dans le dossier Pièces jointes mais avec des noms genre 9446.emlx

@+


----------



## les_innommables66 (17 Décembre 2010)

CathyGYM a dit:


> Merci pour ces infos, je vais essayer de délester un maximum de commandes script, mais il me reste de toute façon au moins une erreur de syntaxe (sur "_count the messages_" et sur la boucle repeat). Apparemment, "_the messages_", ce ne doit pas être bon, mais je ne comprends pas pourquoi...
> Quelqu'un a-t-il une idée sur cette partie ?
> Merci



Bonjour,

Essaye de remplacer :

set NombredeMessages to count the messages
   repeat with CeMessage in the messages

par 

repeat with CeMessage in theMessages

Cordialement,
Nicolas


----------



## CathyGYM (18 Décembre 2010)

> Essaye de remplacer :
> 
> set NombredeMessages to count the messages
> repeat with CeMessage in the messages
> ...



Désolée j'ai mis un peu de temps à répondre, je n'avais pas le Mac sous la main...
J'ai essayé, mais celà ne marche pas, car dans ce cas il considère theMessages comme une variable qui n'est pas déclarée...
Merci quand même


----------



## les_innommables66 (18 Décembre 2010)

Bonjour,

Il faut enlever les tirets devant tes deux premières lignes (et les dernières), et tester le script appelé par une règle de Mail, pour que la variable theMessages soit effectivement déclarée,

Cordialement,
Nicolas


----------



## Anonyme (19 Décembre 2010)

Bonjour,

*1-* Ne jamais mettre de dialogue dans un script qui fonctionne dans une règle de Mail, sinon le script ne fonctionnera jamais.

*2-* PathPlann est un chemin de type Finder, il n'est pas compatible avec Mail (message d'erreur), il faut le convertir en string.

*3-* week n'existe pas, je ne sais pas ce que tu veux obtenir d'une date, weekday permet d'obtenir la journée de la date en anglais.

*4-* Un script dans une règle de Mail ne donnera jamais d'erreur, il faut toujours le tester dans l'*éditeur AppleScript* avant.

Pour tester dans l'*éditeur AppleScript* c'est comme ceci : 
Sélectionne un message qui contient un fichier-joint "*Planning.pdf*"
Exécute ce script :

```
tell application "Mail"
	set xx to selection
	tell me to perform mail action with messages xx
end tell

using terms from application "Mail"
	on perform mail action with messages theMessages
		tell application "Finder" to set PathPlann to (folder "Plannings" of folder "Documents" of home) as string
		
		repeat with CeMessage in theMessages
			set LeSujet to subject of CeMessage
			set LeSender to sender of CeMessage
			set LaDate to (the weekday of (get the date received of CeMessage))
			if ((LeSender is equal to "Chef@Service.com") and (LeSujet contains "Planning Semaine")) then
				--try
				set fichier_joint to the first mail attachment of CeMessage
				set NomPieceJointe to the name of fichier_joint
				if NomPieceJointe is equal to "Planning.pdf" then
					set LeNomFichier to PathPlann & NomPieceJointe & "-" & LaDate
					save fichier_joint in LeNomFichier
				end if
				--end try
			end if
		end repeat
	end perform mail action with messages
end using terms from
```

Une fois que le script fonctionne sans erreur, remets les try et supprime les quatre premières lignes pour qu'il fonctionne à partir d'une règle.


----------



## CathyGYM (19 Décembre 2010)

Merci beaucoup Mac_Jac pour toutes ces infos. Je n'avais pas l'intention de laisser les "_display dialog_", et c'était effectivement pour tester à partir de l'éditeur applescript, mais le problème était que je ne mettais pas les quatre lignes du début... Maintenant çà marche beaucoup mieux  

Concernant le "_week_", je cherchais le numéro de la semaine de l'année, car tous les plannings reçus en pièce jointe ont le même nom, et en plus je les reçois toujours le même jour de la semaine ! J'ai finalement utilisé "_Date string_" pour les distinguer les uns des autres... Si tu connais un moyen simple de trouver le numéro de la semaine, çà me ferait des noms un plus plus courts !

Par ailleurs, j'ai supprimé les tests sur l'expéditeur et sur le sujet que j'ai mis dans la règle mail directement, çà simplifie le script.

En tout cas encore merci à tous ceux qui ont participé à cette discussion...

---------- Nouveau message ajouté à 10h40 ---------- Le message précédent a été envoyé à 10h11 ----------

Merci également Nicolas, tu avais raison pour deux lignes en commentaire, je les avais retirées pour tester dans l'éditeur, mais en fait ce n'était pas utile, il suffisait d'ajouter les 4 lignes données par Mac_Jac...


----------



## ceslinstinct (19 Décembre 2010)

CathyGYM a dit:


> Concernant le "_week_", je cherchais le numéro de la semaine de l'année, car tous les plannings reçus en pièce jointe ont le même nom, et en plus je les reçois toujours le même jour de la semaine ! J'ai finalement utilisé "_Date string_" pour les distinguer les uns des autres... Si tu connais un moyen simple de trouver le numéro de la semaine, çà me ferait des noms un plus plus courts !



Bonjour

Regarde si une de ces lignes peu être utile.


```
-- Affichage du N° de la semaine dans l'année (Le premier jour de la semaine est le Lundi)
set numSemaine to (do shell script "date '+%V'")

-- N° du jour dans l'année (001 - 365 où 366)
set numJour to (do shell script "date '+%j'")

display dialog "Semaine n°: " & numSemaine & return & "Jour dans l'année: " & numJour as string
```

@+


----------



## CathyGYM (19 Décembre 2010)

Merci Ceslinstinct, j'ai testé, çà fonctionne, mais pour la date du jour. Comme j'avais des fichiers à récupérer avec des dates plus anciennes, je me suis fait une petite procédure qui calcule le numéro de la semaine du jour de réception. Par contre, pour les mails à venir, je vais pouvoir utiliser ta fonction.


----------



## kyaude (30 Avril 2016)

CathyGYM a dit:


> Merci Ceslinstinct, j'ai testé, çà fonctionne, mais pour la date du jour. Comme j'avais des fichiers à récupérer avec des dates plus anciennes, je me suis fait une petite procédure qui calcule le numéro de la semaine du jour de réception. Par contre, pour les mails à venir, je vais pouvoir utiliser ta fonction.


Bonjour,
Je remercie les contributeurs ci-dessus. Ayant eu un besoin apparenté plus simple je me suis permis de vous faire part de mon adaptation. Mon besoin consiste à enregistrer la pièce jointe de un ou plusieurs messages Mail dans un répertoire fixé dans le code ( une ligne de code à changer pour le mettre ailleurs que dans Desktop/monRepertoireCible).
Le déclenchement du script est assuré par une règle de Mail mais les conditions suivantes sont nécessaires pour le débuguer sous l'éditeur:
- Placer le code du script.scpt ci dessous dans /Users/moi/Library/Application Scripts/com.apple.mail
- Enlever la mise en commentaire des 4 premières lignes
- Sélectionner dans Mail un message contenant la pièce jointe à sauvegarder dans monRepertoireCible
- Lancer le script depuis l'éditeur de script
- Réaffecter ce script à une règle de détection de l'adresse de l'émetteur et de l'objet du message reçu par exemple.

La forme ci-dessous est celle du lancement sous règle Mail.

-- Sous editeur de script sélectionner dans Mail le(s) messages avec pièce jointe avant de lancer le script

-- Mettre en commentaires les 4 lignes ci-dessous pour fonctionner sous l'appel d'une règle de mail

--tell application "Mail"

--    set xx to selection

--    tell me to perform mail action with messages xx

--end tell


*using terms from* _application_ "Mail"

*on* *perform mail action with messages *theMessages

        -- localiser ci-dessous le répertoire cible "monRepertoireCible"

*tell* _application_ "Finder" *to* *set* PathRepertoireCible *to* (_folder_ "monRepertoireCible" *of* (*path to *desktop)) *as* _string_

        -- pour chacun des messages selectionnés, extraire la premiere piece jointe et l'enregistrer dans le répertoire "monRepertoireCible" dans le type d'origine du fichier joint

*repeat* *with* CeMessage *in* theMessages

            -- extraire le nom du fichier joint

*set* fichier_joint *to* *the* *first* _mail attachment_ *of* CeMessage

*set* NomPieceJointe *to* *the* name *of* fichier_joint

            -- composer le path long du fichier dans son répertoire cible

*set* LeNomFichier *to* PathRepertoireCible & NomPieceJointe

            -- remarque: le save ci-dessous ne duplique pas le fichier dans le repertoire cible si l'opération a déjà été faite

*save *fichier_joint in _file _LeNomFichier

*end* *repeat*

*end* *perform mail action with messages*

*end* *using terms from*


----------



## Madmac (10 Mars 2017)

Je relance le topic

J'ai essayé ce script dans l'éditeur applescript, mais il ne se passe rien. Pas de message d'erreur.
je suis sur Mac 10.11.6 + Editeur de Script 2.8.1 + Mail 9.3
Avant de l'adapter à mes besoins, j'aimerais que votre solution fonctionne.
je n'ai pas besoin de vérifier l'expéditeur mais j'aurais besoin que le nom du fichier joint, quelqu'il soit, soit renommé.

merci de votre aide.
Pascal


----------



## nicodam (10 Novembre 2020)

kyaude a dit:


> Bonjour,
> Je remercie les contributeurs ci-dessus. Ayant eu un besoin apparenté plus simple je me suis permis de vous faire part de mon adaptation. Mon besoin consiste à enregistrer la pièce jointe de un ou plusieurs messages Mail dans un répertoire fixé dans le code ( une ligne de code à changer pour le mettre ailleurs que dans Desktop/monRepertoireCible).
> Le déclenchement du script est assuré par une règle de Mail mais les conditions suivantes sont nécessaires pour le débuguer sous l'éditeur:
> 
> ...


Bonjour,
Je rajoute qu'il est nécessaire, au préalable, d'aller dans les réglages sécurité & confidentialité / Accès complet au disque et de donner la permission à l'application mail. Sinon erreur d'écriture du fichier...


----------

