Envoyer un mail au format HTML avec Safari et AppleScript
Il est possible de partager par Mail une page avec Safari avec la commande «» et ensuite, d'ajouter les destinataires dans Mail. Mais il n'est pas possible d'ajouter les destinataires par AppleScript au nouveau message ainsi créé.
Voici un script permettant de créer un message stylé dont le corps est une page HTML à partir d'une URL ou d'un fichier local en spécifiant une liste de destinataires.
Fonctionnement
Le script ouvre une page HTML locale ou présente sur un site web, en copie le contenu, crée le message avec le sujet, les destinataires et l'émetteur, et colle ensuite le contenu de la page dans le texte du message.
- L'expéditeur doit être défini à partir du nom de son compte, le script génère le sender du message en conséquence.
- Les destinataires sont définis par les constantes addressList (adresses mails séparées par des virgules) et nameList (nom complets séparés par des virgules).
- Un dialogue permet d'entrer l'url de la page ou de choisir le fichier local.
Entre Mac OS 10.10 et 10.11 le comportement de Mail sous Applescript a changé !
- sous Yosemite, la variable AppleScript est html content permet d'importer un corps de texte stylé : il suffit d'importer le html de la page dans la variable textBody du script en remplaçant les quotes par \" (échappement).
- sous El Capitan html content n'est plus supporté car le texte stylé est du rtf. Le script copie la page après l'avoir affichée dans Safari et la colle dans Mail (ce qui évite de le faire à la main !).
(* CONSTANTES À ADAPTER AU CONTEXTE
Version pour El Capitan
mails et noms-prénoms des destinataires *)
set addressList to {"destinataire1@domaine.fr", "destinataire2@domaine.fr"}
set nameList to {"premier destinataire", "second destinataire"}
(* nom du compte expéditeur du message : si vide ou invalide : compte par défaut *)
set theAccount to "Orchidées"
(* message html : mettre isHTML à true, sinon le mettre à false en passant un texte dans textBody *)
set isHTML to true -- indique que le corps est en html
set textBody to ""
set theReturnedItems to (display dialog "Page servant de corps de texte du message :" default answer "http://" buttons {"Ouvrir un fichier", "Annuler", "OK"} default button 3)
set the button_pressed to the button returned of theReturnedItems
set the theURL to the text returned of theReturnedItems
if the button_pressed is equal to "OK" then
else if the button_pressed is equal to "Ouvrir un fichier" then
set the theURL to the POSIX path of (choose file with prompt "Ouvrir un fichier :")
else
error number -128
end if
(* détermine s'il s'agit d'une URL ou du path d'un fichier local, car commande open de Safari différente *)
set isURL to (text 1 thru 4 of theURL = "http")
(* ouvre Safari pour extraire le texte HTML du message *)
tell application "Safari"
activate
make new document at beginning of documents
if isURL then
open location theURL -- URL
else
open theURL -- fichier local
end if
delay 1
set textSubject to name of current tab of window 1 -- <title> de la page
tell application "System Events"
(* copie le texte stylé de la page *)
keystroke "a" using command down
delay 0.5
keystroke "c" using command down
delay 0.5
end tell
close current tab of window 1
end tell
tell application "Mail"
activate
-- fabrique le Sender d'après le nom du compte : Nom Prénom <adresse mail>
try
set FullAccountName to full name of account theAccount as string
set AccountAdress to email addresses of account theAccount as string
set FullAccountName to FullAccountName & " <" & AccountAdress & ">"
on error
set FullAccountName to "" -- sera émis par le compte par défaut
end try
set refMessage to make new outgoing message with properties {sender:FullAccountName, subject:textSubject, visible:true}
tell refMessage
if not isHTML then
set content to textBody -- alimenter dans ce cas textBody
end if
repeat with i from 1 to count nameList
make new to recipient at end of to recipients with properties {name:item i of nameList, address:item i of addressList} -- ajoute chaque destinataire
end repeat
save
end tell
end tell
if isHTML then
(* colle le texte stylé dans le corps de message *)
tell application "Mail"
activate
tell application "System Events"
tell window 1 of process "Mail"
repeat until focused of UI element 1 of scroll area 1
keystroke tab
end repeat
keystroke "v" using command down
end tell
end tell
end tell
end if
(* CONSTANTES À ADAPTER AU CONTEXTE
Version pour Yosemite
mails et noms-prénoms des destinataires *)
set addressList to {"destinataire1@domaine.fr", "destinataire2@domaine.fr"}
set nameList to {"premier destinataire", "second destinataire"}
(* nom du compte expéditeur du message *)
set theAccount to "Orchidées" -- si vide ou invalide : compte par défaut
set theReturnedItems to (display dialog "Page servant de corps de texte du message :" default answer "http://" buttons {"Ouvrir un fichier", "Annuler", "OK"} default button 3)
set the button_pressed to the button returned of theReturnedItems
set the theURL to the text returned of theReturnedItems
if the button_pressed is equal to "OK" then
else if the button_pressed is equal to "Ouvrir un fichier" then
set the theURL to the POSIX path of (choose file with prompt "Ouvrir un fichier :")
else
error number -128
end if
(* détermine s'il s'agit d'une URL ou du path d'un fichier local, car commande open de Safari différente *)
set isURL to (text 1 thru 4 of theURL = "http")
(* ouvre Safari pour extraire le texte HTML du message *)
tell application "Safari"
activate
make new document at beginning of documents
if isURL then
open location theURL -- URL
else
open theURL -- fichier local
end if
delay 1
set textBody to source of document 1 -- HTML avec quotes échappées
set textSubject to name of current tab of window 1 -- <title> de la page
close document 1
end tell
tell application "Mail"
set isHTML to true -- indique que le corps est en html
activate
-- fabrique le Sender d'après le nom du compte : Nom Prénom <adresse mail>
try
set FullAccountName to full name of account theAccount as string
set AccountAdress to email addresses of account theAccount as string
set FullAccountName to FullAccountName & " <" & AccountAdress & ">"
on error
set FullAccountName to "" -- sera émis par le compte par défaut
end try
(* Génération du message en mode invisible, sinon HTML ne marche pas *)
set refMessage to make new outgoing message with properties {sender:FullAccountName, subject:textSubject, visible:false}
tell refMessage
if isHTML then
set html content to textBody -- indique que c'est le texte html
else
set content to textBody
end if
repeat with i from 1 to count nameList
make new to recipient at end of to recipients with properties {name:item i of nameList, address:item i of addressList} -- ajoute chaque destinataire
end repeat
save
close
end tell
end tell
2 février 2016