Issues with Mail.app AppleScript scripts
I'm trying to get a simple AppleScript to run from a rule in Mail.app under Catalina. The script is very basic:
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
using terms from application "Mail"
on perform mail action with messages messageList in mailboxes mbox for rule aRule
repeat with theMessage in theMessages
set thisSender to (sender of theMessage as string)
my WriteLog("Recieved email from " & thisSender)
end repeat
end perform mail action with messages
end using terms from
-- the code, from here on, has been tested and runs from Script Debugger or Script Editor
on write_to_file(this_data, target_file, append_data) -- (string, file path as string, boolean)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof as «class utf8»
close access the open_target_file
return true
on error
try
close access file target_file
end try
return false
end try
end write_to_file
on WriteLog(the_text)
set this_file to (((path to desktop folder) as text) & "log.txt")
my write_to_file(the_text, this_file, true)
end WriteLog
I have added the following rule to Mail.app:
I have also enabled full disk access for Mail.app:
The rule runs - the messages are moved to the filing folder - but the log file is not updated.
What else should I be looking at, to try to solve this issue?
Update
I noticed a small gear icon appearing in the menu bar when the script was run. Through some manoeuvring I managed to right-click the icon, and capture the resulting menu. I suspect this is some automation indicator ( possibly CoreCervices/ScriptMonitor
?)
I therefore tried enabling CoreCervices/ScriptMonitor
in the FullDisk Access pane of the Security & Privacy's 'Privacy' tab... no joy.
Apart from the tccutil
reset, does anyone know if there is a way to trigger a request from Mail.app for AppleEvent access of say the Finder, so that an option appears in the 'Automation' tab of Security & Privacy?
Update:
Here's the full script, including the addEmailToDB()
function. It works fine as a standalone, manually run, but doesn't respond when run from Mail.app. The Allow Apple events...
extended privilege is enabled for Admin, and the FM file is set to open as Admin, with no password, and is already open before the script runs.
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
using terms from application "Mail"
on perform mail action with messages theMessages in mailboxes mbox for rule aRule
repeat with theMessage in theMessages
set thisSender to (sender of theMessage as string)
set thisSubject to (subject of theMessage as string)
set thisContent to (content of theMessage as string)
my WriteLog("Recieved email from " & thisSender & ", Subject: " & thisSubject & return)
my addEmailToDB("mails", "mails", thisSender, "", "", "", thisSubject, thisContent)
end repeat
end perform mail action with messages
end using terms from
-- the code, from here on, has been tested and runs from Script Debugger or Script Editor
on write_to_file(this_data, target_file, append_data) -- (string, file path as string, boolean)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof as «class utf8»
close access the open_target_file
return true
on error
try
close access file target_file
end try
return false
end try
end write_to_file
on WriteLog(the_text)
set this_file to (((path to desktop folder) as text) & "log.txt")
my write_to_file(the_text, this_file, true)
end WriteLog
on addEmailToDB(theDB, theTable, sender, recipient, cc, bcc, subject, body)
try
tell application "FileMaker Pro 18 Advanced"
activate
show database theDB
tell table theTable of database theDB
set newRec to create new record
show newRec
tell newRec
set cell "from" to sender
set cell "to" to recipient
set cell "cc" to cc
set cell "bcc" to bcc
set cell "subject" to subject
set cell "body" to body
end tell
end tell
end tell
return true
on error
return false
end try
end addEmailToDB
Change 'messageList' to 'theMessages' and try it again:
on perform mail action with messages theMessages in mailboxes mbox for rule theRule
Two small points on the WriteLog line… you have a typo in your 'Recieved email from'. Also, purely as a preference, I found it easier to notice the changes in the log file when I added '& return' to your log text, as in:
my WriteLog("Received email from " & thisSender & return)
Edit: Looks like I spoke too soon with the comment below. I was able to get your script to run in Snow Leopard and to write records to an open database. I haven't re-tested whether I can open the database from the script but I couldn't before.
Trying to debug these rule action scripts is horrible because, as far as I can tell, the rule action handler swallows up any error messages, including try-on error messages, and the script wanders off to some random place before exiting.
I don't think the problem relates to permissions, etc. I have the >exact same problem with FileMaker Pro Advanced 12 in Snow >Leopard. Interestingly, you can "tell" FileMaker to get a >database's name but telling it to open a database and/or write a >record fails without an error message. And, as with your >experience, the exact same code runs perfectly when run manually, >ie not invoked as a rule action. I have reached the conclusion >that the inability to script another app from within a mail rule script is an undocumented "feature" of Mail :(